From 61c4e41480ef81f4449acc8604efdcd1c26607b2 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 7 Oct 2014 04:06:13 +0000 Subject: [PATCH] gold plugin: Handle gold selecting a linkonce GV when a weak is present. The plugin API doesn't have the notion of linkonce, only weak. It is up to the plugin to figure out if a symbol used only for the symbol table can be dropped. In particular, it has to avoid dropping a linkonce_odr selected by gold if there is also a weak_odr. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219188 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/tools/gold/Inputs/linkonce-weak.ll | 3 +++ test/tools/gold/linkonce-weak.ll | 19 +++++++++++++++++++ tools/gold/gold-plugin.cpp | 8 +++++++- 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 test/tools/gold/Inputs/linkonce-weak.ll create mode 100644 test/tools/gold/linkonce-weak.ll diff --git a/test/tools/gold/Inputs/linkonce-weak.ll b/test/tools/gold/Inputs/linkonce-weak.ll new file mode 100644 index 00000000000..f42af8faa84 --- /dev/null +++ b/test/tools/gold/Inputs/linkonce-weak.ll @@ -0,0 +1,3 @@ +define weak_odr void @f() { + ret void +} diff --git a/test/tools/gold/linkonce-weak.ll b/test/tools/gold/linkonce-weak.ll new file mode 100644 index 00000000000..765275b09d5 --- /dev/null +++ b/test/tools/gold/linkonce-weak.ll @@ -0,0 +1,19 @@ +; RUN: llvm-as %s -o %t.o +; RUN: llvm-as %p/Inputs/linkonce-weak.ll -o %t2.o + +; RUN: ld -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: --plugin-opt=emit-llvm \ +; RUN: -shared %t.o %t2.o -o %t3.o +; RUN: llvm-dis %t3.o -o - | FileCheck %s + +; RUN: ld -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: --plugin-opt=emit-llvm \ +; RUN: -shared %t2.o %t.o -o %t3.o +; RUN: llvm-dis %t3.o -o - | FileCheck %s + +define linkonce_odr void @f() { + ret void +} + +; Test that we get a weak_odr regardless of the order of the files +; CHECK: define weak_odr void @f() { diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index ffee1ff3258..d5d58d0e588 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -637,8 +637,14 @@ getModuleForFile(LLVMContext &Context, claimed_file &F, raw_fd_ostream *ApiFile, keepGlobalValue(*GV, KeptAliases); break; - case LDPR_PREEMPTED_REG: case LDPR_PREEMPTED_IR: + // Gold might have selected a linkonce_odr and preempted a weak_odr. + // In that case we have to make sure we don't end up internalizing it. + if (!GV->isDiscardableIfUnused()) + Maybe.erase(Sym.name); + + // fall-through + case LDPR_PREEMPTED_REG: Drop.insert(GV); break; -- 2.34.1