Revert "[PR30341] Alias must point to a definition"
authorAditya Kumar <hiraditya@msn.com>
Thu, 29 Sep 2016 11:37:23 +0000 (11:37 +0000)
committerAditya Kumar <hiraditya@msn.com>
Thu, 29 Sep 2016 11:37:23 +0000 (11:37 +0000)
This reverts commit r282679.

Ninja check fails, reverting to debug the issue.

llvm-svn: 282710

clang/lib/CodeGen/CGCXX.cpp
clang/test/CodeGenCXX/alias-available-externally.cpp [deleted file]

index d33555f..40f1bc4 100644 (file)
@@ -134,11 +134,6 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl,
   llvm::GlobalValue::LinkageTypes TargetLinkage =
       getFunctionLinkage(TargetDecl);
 
-  // available_externally definitions aren't real definitions, so we cannot
-  // create an alias to one.
-  if (TargetLinkage == llvm::GlobalValue::AvailableExternallyLinkage)
-    return true;
-
   // Check if we have it already.
   StringRef MangledName = getMangledName(AliasDecl);
   llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
@@ -161,7 +156,14 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl,
 
   // Instead of creating as alias to a linkonce_odr, replace all of the uses
   // of the aliasee.
-  if (llvm::GlobalValue::isDiscardableIfUnused(Linkage)) {
+  if (llvm::GlobalValue::isDiscardableIfUnused(Linkage) &&
+     (TargetLinkage != llvm::GlobalValue::AvailableExternallyLinkage ||
+      !TargetDecl.getDecl()->hasAttr<AlwaysInlineAttr>())) {
+    // FIXME: An extern template instantiation will create functions with
+    // linkage "AvailableExternally". In libc++, some classes also define
+    // members with attribute "AlwaysInline" and expect no reference to
+    // be generated. It is desirable to reenable this optimisation after
+    // corresponding LLVM changes.
     addReplacement(MangledName, Aliasee);
     return false;
   }
diff --git a/clang/test/CodeGenCXX/alias-available-externally.cpp b/clang/test/CodeGenCXX/alias-available-externally.cpp
deleted file mode 100644 (file)
index 264af55..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// RUN: %clang_cc1 -O1 -std=c++11 -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s
-// Clang should not generate alias to available_externally definitions.
-// Check that the destructor of Foo is defined.
-// CHECK: define linkonce_odr void @_ZN3FooD2Ev
-template <class CharT>
-struct String {
-  String() {}
-  ~String();
-};
-
-template <class CharT>
-inline __attribute__((visibility("hidden"), always_inline))
-String<CharT>::~String() {}
-
-extern template struct String<char>;
-
-struct Foo : public String<char> { Foo() { String<char> s; } };
-
-Foo f;