mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-15 04:00:56 +00:00
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
This commit is contained in:
parent
48595de697
commit
fb3043d627
@ -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>
|
||||
|
@ -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; }
|
||||
|
@ -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>()) {
|
||||
|
Loading…
Reference in New Issue
Block a user