aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2008-08-11 17:36:14 +0000
committerDaniel Dunbar <daniel@zuster.org>2008-08-11 17:36:14 +0000
commit6379a7a15335e0af543a942efe9cfd514a83dab8 (patch)
treea8636980d6c00dd64e11ac146bbdf6f35d1889fb
parent58bf6101062867ca4b3028f9e77e4ae642f09b44 (diff)
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54643 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--Driver/clang.cpp12
-rw-r--r--include/clang/Basic/LangOptions.h3
-rw-r--r--lib/CodeGen/CodeGenModule.cpp6
3 files changed, 20 insertions, 1 deletions
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index 05befe08c1..c55aa17eb2 100644
--- a/Driver/clang.cpp
+++ b/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/include/clang/Basic/LangOptions.h b/include/clang/Basic/LangOptions.h
index 589153f47e..7756a2ab5b 100644
--- a/include/clang/Basic/LangOptions.h
+++ b/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/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index c77dfa6a81..b3e721308d 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/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>()) {