When using a symbol with attribute weakref, search for it first and
don't try the normal GetOrCreateLLVM. The latter could drop the weak atrtibute on the second reference, if there is no explicit declaration of the aliasee. llvm-svn: 166032
This commit is contained in:
parent
544284eb31
commit
de78bba047
|
@ -884,6 +884,10 @@ llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) {
|
|||
|
||||
// See if there is already something with the target's name in the module.
|
||||
llvm::GlobalValue *Entry = GetGlobalValue(AA->getAliasee());
|
||||
if (Entry) {
|
||||
unsigned AS = getContext().getTargetAddressSpace(VD->getType());
|
||||
return llvm::ConstantExpr::getBitCast(Entry, DeclTy->getPointerTo(AS));
|
||||
}
|
||||
|
||||
llvm::Constant *Aliasee;
|
||||
if (isa<llvm::FunctionType>(DeclTy))
|
||||
|
@ -893,11 +897,10 @@ llvm::Constant *CodeGenModule::GetWeakRefReference(const ValueDecl *VD) {
|
|||
else
|
||||
Aliasee = GetOrCreateLLVMGlobal(AA->getAliasee(),
|
||||
llvm::PointerType::getUnqual(DeclTy), 0);
|
||||
if (!Entry) {
|
||||
llvm::GlobalValue* F = cast<llvm::GlobalValue>(Aliasee);
|
||||
F->setLinkage(llvm::Function::ExternalWeakLinkage);
|
||||
WeakRefReferences.insert(F);
|
||||
}
|
||||
|
||||
llvm::GlobalValue* F = cast<llvm::GlobalValue>(Aliasee);
|
||||
F->setLinkage(llvm::Function::ExternalWeakLinkage);
|
||||
WeakRefReferences.insert(F);
|
||||
|
||||
return Aliasee;
|
||||
}
|
||||
|
|
|
@ -53,6 +53,12 @@ void test6_foo(void) {
|
|||
test6_f();
|
||||
}
|
||||
|
||||
// CHECK: declare extern_weak void @test8_f()
|
||||
static void test8_g(void) __attribute__((weakref("test8_f")));
|
||||
void test8_h(void) {
|
||||
if (test8_g)
|
||||
test8_g();
|
||||
}
|
||||
// CHECK: declare extern_weak void @test7_f()
|
||||
void test7_f(void);
|
||||
static void test7_g(void) __attribute__((weakref("test7_f")));
|
||||
|
|
Loading…
Reference in New Issue