diff options
author | Daniel Dunbar <daniel@zuster.org> | 2008-08-11 17:36:14 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2008-08-11 17:36:14 +0000 |
commit | fb3043d62708f182b7387924456c2282d374a9ef (patch) | |
tree | 9fdcbf6f3068d69a02d0a3290bf793fb083ecc52 | |
parent | 48595de6979d6965e1ae6a97ed3cf68d69bfc41d (diff) | |
download | bcm5719-llvm-fb3043d62708f182b7387924456c2282d374a9ef.tar.gz bcm5719-llvm-fb3043d62708f182b7387924456c2282d374a9ef.zip |
Add -fexceptions to Driver
- Maps to LangOptions.Exceptions
- Currently always off, should autoselect based on language.
Update CodeGen to set unwind attribute on functions definitions based
on LangOptions.Exceptions.
- Still need to set attributes appropriately on calls.
llvm-svn: 54643
-rw-r--r-- | clang/Driver/clang.cpp | 12 | ||||
-rw-r--r-- | clang/include/clang/Basic/LangOptions.h | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 6 |
3 files changed, 20 insertions, 1 deletions
diff --git a/clang/Driver/clang.cpp b/clang/Driver/clang.cpp index 05befe08c12..c55aa17eb2b 100644 --- a/clang/Driver/clang.cpp +++ b/clang/Driver/clang.cpp @@ -362,6 +362,17 @@ LaxVectorConversions("flax-vector-conversions", " with a different number of elements or " "different element types")); +// FIXME: This (and all GCC -f options) really come in -f... and +// -fno-... forms, and additionally support automagic behavior when +// they are not defined. For example, -fexceptions defaults to on or +// off depending on the language. We should support this behavior in +// some form (perhaps just add a facility for distinguishing when an +// has its default value from when it has been set to its default +// value). +static llvm::cl::opt<bool> +Exceptions("fexceptions", + llvm::cl::desc("Enable support for exception handling.")); + // FIXME: add: // -ansi // -trigraphs @@ -427,6 +438,7 @@ static void InitializeLanguageStandard(LangOptions &Options, LangKind LK) { Options.Microsoft = MSExtensions; Options.WritableStrings = WritableStrings; Options.LaxVectorConversions = LaxVectorConversions; + Options.Exceptions = Exceptions; } static llvm::cl::opt<bool> diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index 589153f47ec..7756a2ab5be 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -42,6 +42,7 @@ struct LangOptions { unsigned Boolean : 1; // Allow bool/true/false unsigned WritableStrings : 1; // Allow writable strings unsigned LaxVectorConversions : 1; + unsigned Exceptions : 1; // Support exception handling. private: unsigned GC : 2; // Objective-C Garbage Collection modes. We declare @@ -57,7 +58,7 @@ public: GC = ObjC1 = ObjC2 = 0; C99 = Microsoft = CPlusPlus = CPlusPlus0x = NoExtensions = 0; CXXOperatorNames = PascalStrings = Boolean = WritableStrings = 0; - LaxVectorConversions = 0; + LaxVectorConversions = Exceptions = 0; } GCMode getGCMode() const { return (GCMode) GC; } diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index c77dfa6a813..b3e721308d6 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -751,6 +751,12 @@ void CodeGenModule::EmitGlobalFunctionDefinition(const FunctionDecl *D) { llvm::Function *Fn = cast<llvm::Function>(Entry); CodeGenFunction(*this).GenerateCode(D, Fn); + // Set attributes specific to definition. + // FIXME: This needs to be cleaned up by clearly emitting the + // declaration / definition at separate times. + if (!Features.Exceptions) + Fn->addParamAttr(0, llvm::ParamAttr::NoUnwind); + if (const ConstructorAttr *CA = D->getAttr<ConstructorAttr>()) { AddGlobalCtor(Fn, CA->getPriority()); } else if (const DestructorAttr *DA = D->getAttr<DestructorAttr>()) { |