summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-11-05 05:22:36 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-11-05 05:22:36 +0000
commit5d79a51a45ea9e4156acfd221e6bbe40b7ba2faa (patch)
tree6148c66415960561c61457c43eab0e4d5c182798 /clang/lib
parentb4db43fad68c5c437075bcbf29d9ea5b5fc68f3a (diff)
downloadbcm5719-llvm-5d79a51a45ea9e4156acfd221e6bbe40b7ba2faa.tar.gz
bcm5719-llvm-5d79a51a45ea9e4156acfd221e6bbe40b7ba2faa.zip
Produce direct calls instead of alias to linkonce_odr functions.
This is a small optimization on linux, but should help more on windows where msvc only outputs one destructor if there would be two identical ones. llvm-svn: 194046
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CGCXX.cpp41
1 files changed, 23 insertions, 18 deletions
diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp
index 25f3e6f4daa..ab45e321cbb 100644
--- a/clang/lib/CodeGen/CGCXX.cpp
+++ b/clang/lib/CodeGen/CGCXX.cpp
@@ -112,28 +112,13 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl,
// support aliases with that linkage, fail.
llvm::GlobalValue::LinkageTypes Linkage = getFunctionLinkage(AliasDecl);
- llvm::GlobalValue::LinkageTypes TargetLinkage
- = getFunctionLinkage(TargetDecl);
-
- // Don't create an alias to a linker weak symbol unless we know we can do
- // that in every TU. This avoids producing different COMDATs in different
- // TUs.
- if (llvm::GlobalValue::isWeakForLinker(TargetLinkage)) {
- if (!InEveryTU)
- return true;
-
- // In addition to making sure we produce it in every TU, we have to make
- // sure llvm keeps it.
- // FIXME: Instead of outputting an alias we could just replace every use of
- // AliasDecl with TargetDecl.
- assert(Linkage == TargetLinkage);
- Linkage = llvm::GlobalValue::WeakODRLinkage;
- }
-
// We can't use an alias if the linkage is not valid for one.
if (!llvm::GlobalAlias::isValidLinkage(Linkage))
return true;
+ llvm::GlobalValue::LinkageTypes TargetLinkage =
+ getFunctionLinkage(TargetDecl);
+
// Check if we have it already.
StringRef MangledName = getMangledName(AliasDecl);
llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
@@ -152,6 +137,26 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl,
if (Ref->getType() != AliasType)
Aliasee = llvm::ConstantExpr::getBitCast(Ref, AliasType);
+ // Don't create an alias to a linker weak symbol unless we know we can do
+ // that in every TU. This avoids producing different COMDATs in different
+ // TUs.
+ if (llvm::GlobalValue::isWeakForLinker(TargetLinkage)) {
+ if (!InEveryTU)
+ return true;
+
+ assert(Linkage == TargetLinkage);
+ // Instead of creating as alias to a linkonce_odr, replace all of the uses
+ // of the aliassee.
+ if (TargetLinkage == llvm::GlobalValue::LinkOnceODRLinkage) {
+ if (!Entry)
+ return false;
+
+ Entry->replaceAllUsesWith(Aliasee);
+ Entry->eraseFromParent();
+ return false;
+ }
+ }
+
// Create the alias with no name.
llvm::GlobalAlias *Alias =
new llvm::GlobalAlias(AliasType, Linkage, "", Aliasee, &getModule());
OpenPOWER on IntegriCloud