diff options
author | Reid Kleckner <reid@kleckner.net> | 2013-08-22 20:07:45 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2013-08-22 20:07:45 +0000 |
commit | 3738445cdd4da3452d04fc09a8f5191267f6f706 (patch) | |
tree | e55ad44f1d0465c2bb34e9f182e0758fed1f3361 /clang/lib/CodeGen/CGDeclCXX.cpp | |
parent | 9f7a1c10ea02747e765b417551efe24f82cef7e0 (diff) | |
download | bcm5719-llvm-3738445cdd4da3452d04fc09a8f5191267f6f706.tar.gz bcm5719-llvm-3738445cdd4da3452d04fc09a8f5191267f6f706.zip |
Add a separate llvm.global_ctors entry for linkonce_odr data initializers
Summary:
These typically come from static data members of class template
specializations. This accomplishes two things:
1. May expose GlobalOpt optimizations for Itanium C++ ABI code.
2. Works toward fixing double initialization in the Microsoft C++ ABI.
CC: cfe-commits
Differential Revision: http://llvm-reviews.chandlerc.com/D1475
llvm-svn: 189051
Diffstat (limited to 'clang/lib/CodeGen/CGDeclCXX.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGDeclCXX.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGDeclCXX.cpp b/clang/lib/CodeGen/CGDeclCXX.cpp index d61755c0804..ff06448e5e3 100644 --- a/clang/lib/CodeGen/CGDeclCXX.cpp +++ b/clang/lib/CodeGen/CGDeclCXX.cpp @@ -278,6 +278,19 @@ CodeGenModule::EmitCXXGlobalVarDeclInitFunc(const VarDecl *D, OrderGlobalInits Key(order, PrioritizedCXXGlobalInits.size()); PrioritizedCXXGlobalInits.push_back(std::make_pair(Key, Fn)); DelayedCXXInitPosition.erase(D); + } else if (D->getInstantiatedFromStaticDataMember()) { + // C++ [basic.start.init]p2: + // Defnitions of explicitly specialized class template static data members + // have ordered initialization. Other class template static data members + // (i.e., implicitly or explicitly instantiated specializations) have + // unordered initialization. + // + // As a consequence, we can put them into their own llvm.global_ctors entry. + // This should allow GlobalOpt to fire more often, and allow us to implement + // the Microsoft C++ ABI, which uses COMDAT elimination to avoid double + // initializaiton. + AddGlobalCtor(Fn); + DelayedCXXInitPosition.erase(D); } else { llvm::DenseMap<const Decl *, unsigned>::iterator I = DelayedCXXInitPosition.find(D); |