diff --git a/test/tools/gold/common.ll b/test/tools/gold/common.ll index 77976c84495..f3092310a1d 100644 --- a/test/tools/gold/common.ll +++ b/test/tools/gold/common.ll @@ -8,4 +8,22 @@ @a = common global i8 0, align 8 +; Shared library case, we merge @a as common and keep it for the symbol table. ; CHECK: @a = common global i16 0, align 8 + +; RUN: ld -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: --plugin-opt=emit-llvm \ +; RUN: %t1.o %t2.o -o %t3.o +; RUN: llvm-dis %t3.o -o - | FileCheck --check-prefix=EXEC %s + +; All IR case, we internalize a after merging. +; EXEC: @a = internal global i16 0, align 8 + +; RUN: llc %p/Inputs/common.ll -o %t2.o -filetype=obj +; RUN: ld -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: --plugin-opt=emit-llvm \ +; RUN: %t1.o %t2.o -o %t3.o +; RUN: llvm-dis %t3.o -o - | FileCheck --check-prefix=MIXED %s + +; Mixed ELF and IR. We keep ours as common so the linker will finish the merge. +; MIXED: @a = common global i8 0, align 8 diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index abe6e4dd66b..95f7e32a611 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -578,10 +578,12 @@ getModuleForFile(LLVMContext &Context, claimed_file &F, raw_fd_ostream *ApiFile, if (!GV) continue; // Asm symbol. - if (GV->hasCommonLinkage()) { + if (Resolution != LDPR_PREVAILING_DEF_IRONLY && GV->hasCommonLinkage()) { // Common linkage is special. There is no single symbol that wins the // resolution. Instead we have to collect the maximum alignment and size. // The IR linker does that for us if we just pass it every common GV. + // We still have to keep track of LDPR_PREVAILING_DEF_IRONLY so we + // internalize once the IR linker has done its job. continue; }