diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-09-19 01:54:22 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-09-19 01:54:22 +0000 |
commit | 9f834735cd64fd23dfeb88defcc509220f84518b (patch) | |
tree | 483ab28087f5b8d1074263775d52be96ca0f780e /clang/lib/CodeGen | |
parent | 8bf8409be8aae0ebe14717d05b24e6231f80a230 (diff) | |
download | bcm5719-llvm-9f834735cd64fd23dfeb88defcc509220f84518b.tar.gz bcm5719-llvm-9f834735cd64fd23dfeb88defcc509220f84518b.zip |
Don't use the third field of llvm.global_ctors for MachO.
The field is defined as:
If the third field is present, non-null, and points to a global variable or function, the initializer function will only run if the associated data from the current module is not discarded.
And without COMDATs we can't implement that.
llvm-svn: 218097
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGDeclCXX.cpp | 7 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.h | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 8 |
3 files changed, 16 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index 3e5f42e18c2..91ae6a8c2fa 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -301,6 +301,9 @@ CodeGenModule::EmitCXXGlobalVarDeclInitFunc(const VarDecl *D, auto *ISA = D->getAttr<InitSegAttr>(); CodeGenFunction(*this).GenerateCXXGlobalVarDeclInitFunc(Fn, D, Addr, PerformInit); + + llvm::GlobalVariable *Key = supportsCOMDAT() ? Addr : nullptr; + if (D->getTLSKind()) { // FIXME: Should we support init_priority for thread_local? // FIXME: Ideally, initialization of instantiated thread_local static data @@ -330,12 +333,12 @@ CodeGenModule::EmitCXXGlobalVarDeclInitFunc(const VarDecl *D, // being initialized. On most platforms, this is a minor startup time // optimization. In the MS C++ ABI, there are no guard variables, so this // COMDAT key is required for correctness. - AddGlobalCtor(Fn, 65535, Addr); + AddGlobalCtor(Fn, 65535, Key); DelayedCXXInitPosition.erase(D); } else if (D->hasAttr<SelectAnyAttr>()) { // SelectAny globals will be comdat-folded. Put the initializer into a COMDAT // group associated with the global, so the initializers get folded too. - AddGlobalCtor(Fn, 65535, Addr); + AddGlobalCtor(Fn, 65535, Key); DelayedCXXInitPosition.erase(D); } else { llvm::DenseMap<const Decl *, unsigned>::iterator I = diff --git a/clang/lib/CodeGen/CodeGenModule.h b/clang/lib/CodeGen/CodeGenModule.h index b36d4a66cd8..a095c9ddbb9 100644 --- a/clang/lib/CodeGen/CodeGenModule.h +++ b/clang/lib/CodeGen/CodeGenModule.h @@ -599,6 +599,9 @@ public: DiagnosticsEngine &getDiags() const { return Diags; } const llvm::DataLayout &getDataLayout() const { return TheDataLayout; } const TargetInfo &getTarget() const { return Target; } + const llvm::Triple &getTriple() const; + bool supportsCOMDAT() const; + CGCXXABI &getCXXABI() const { return *ABI; } llvm::LLVMContext &getLLVMContext() { return VMContext; } diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 9bf1dbbd0d8..cca825c1c56 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -6868,6 +6868,14 @@ static bool getTypeString(SmallStringEnc &Enc, const Decl *D, // Driver code //===----------------------------------------------------------------------===// +const llvm::Triple &CodeGenModule::getTriple() const { + return getTarget().getTriple(); +} + +bool CodeGenModule::supportsCOMDAT() const { + return !getTriple().isOSBinFormatMachO(); +} + const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { if (TheTargetCodeGenInfo) return *TheTargetCodeGenInfo; |