forked from OSchip/llvm-project
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:
parent
678bd05740
commit
09a8c7d489
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
Loading…
Reference in New Issue