summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGDeclCXX.cpp
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2013-08-22 20:07:45 +0000
committerReid Kleckner <reid@kleckner.net>2013-08-22 20:07:45 +0000
commit3738445cdd4da3452d04fc09a8f5191267f6f706 (patch)
treee55ad44f1d0465c2bb34e9f182e0758fed1f3361 /clang/lib/CodeGen/CGDeclCXX.cpp
parent9f7a1c10ea02747e765b417551efe24f82cef7e0 (diff)
downloadbcm5719-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.cpp13
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);
OpenPOWER on IntegriCloud