Revert "[PR30341] Alias must point to a definition"

This reverts commit r282679.

Ninja check fails, reverting to debug the issue.

llvm-svn: 282710
This commit is contained in:
Aditya Kumar 2016-09-29 11:37:23 +00:00
parent 678bd05740
commit 09a8c7d489
2 changed files with 8 additions and 25 deletions

View 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;
}

View File

@ -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;