Handle common linkage correctly in the gold plugin.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 9 Sep 2014 20:08:22 +0000 (20:08 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 9 Sep 2014 20:08:22 +0000 (20:08 +0000)
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

test/tools/gold/Inputs/common.ll [new file with mode: 0644]
test/tools/gold/common.ll [new file with mode: 0644]
tools/gold/gold-plugin.cpp

diff --git a/test/tools/gold/Inputs/common.ll b/test/tools/gold/Inputs/common.ll
new file mode 100644 (file)
index 0000000..46f199e
--- /dev/null
@@ -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 (file)
index 0000000..77976c8
--- /dev/null
@@ -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
index f2eeb7e8c4f1476dad6a78a488cb2f3b04a9f7e5..110433aefe3ddcfae2cd219cdb280cea6b2dd9da 100644 (file)
@@ -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");