From: Rafael Espindola Date: Tue, 9 Sep 2014 20:08:22 +0000 (+0000) Subject: Handle common linkage correctly in the gold plugin. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=19f3868e91b0e29bb115c57c3a3f704c65db947e;p=oota-llvm.git Handle common linkage correctly in the gold plugin. This is the plugin version of pr20882. This handles the case of every common symbol being in the IR. We will need some support from gold to handle the case where some symbols are in ELF and some in the IR. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217458 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/gold/Inputs/common.ll b/test/tools/gold/Inputs/common.ll new file mode 100644 index 00000000000..46f199e167a --- /dev/null +++ b/test/tools/gold/Inputs/common.ll @@ -0,0 +1 @@ +@a = common global i16 0, align 4 diff --git a/test/tools/gold/common.ll b/test/tools/gold/common.ll new file mode 100644 index 00000000000..77976c84495 --- /dev/null +++ b/test/tools/gold/common.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as %s -o %t1.o +; RUN: llvm-as %p/Inputs/common.ll -o %t2.o + +; RUN: ld -plugin %llvmshlibdir/LLVMgold.so \ +; RUN: --plugin-opt=emit-llvm \ +; RUN: -shared %t1.o %t2.o -o %t3.o +; RUN: llvm-dis %t3.o -o - | FileCheck %s + +@a = common global i8 0, align 8 + +; CHECK: @a = common global i16 0, align 8 diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index f2eeb7e8c4f..110433aefe3 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -18,6 +18,7 @@ #include "llvm/Bitcode/ReaderWriter.h" #include "llvm/CodeGen/Analysis.h" #include "llvm/CodeGen/CommandFlags.h" +#include "llvm/IR/Constants.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/Verifier.h" @@ -576,6 +577,13 @@ getModuleForFile(LLVMContext &Context, claimed_file &F, raw_fd_ostream *ApiFile, if (!GV) continue; // Asm symbol. + if (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. + continue; + } + switch (Resolution) { case LDPR_UNKNOWN: llvm_unreachable("Unexpected resolution");