[lld] r311431 - [ELF] - Make IR symbols be visible when doing relocatable link.

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 22 01:36:54 PDT 2017


Author: grimar
Date: Tue Aug 22 01:36:54 2017
New Revision: 311431

URL: http://llvm.org/viewvc/llvm-project?rev=311431&view=rev
Log:
[ELF] - Make IR symbols be visible when doing relocatable link.

This is PR33097.
Previously when doing relocatable link, all IR symbols were absent
in result object file. Patch makes external symbols to be exported.

Differential revision: https://reviews.llvm.org/D36957

Added:
    lld/trunk/test/ELF/lto/relocatable.ll
Modified:
    lld/trunk/ELF/LTO.cpp

Modified: lld/trunk/ELF/LTO.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LTO.cpp?rev=311431&r1=311430&r2=311431&view=diff
==============================================================================
--- lld/trunk/ELF/LTO.cpp (original)
+++ lld/trunk/ELF/LTO.cpp Tue Aug 22 01:36:54 2017
@@ -144,7 +144,13 @@ void BitcodeCompiler::add(BitcodeFile &F
     // be removed.
     R.Prevailing = !ObjSym.isUndefined() && B->getFile() == &F;
 
-    R.VisibleToRegularObj = Sym->IsUsedInRegularObj ||
+    // We ask LTO to preserve following global symbols:
+    // 1) All symbols when doing relocatable link, so that them can be used
+    //    for doing final link.
+    // 2) Symbols that are used in regular objects.
+    // 3) C named sections if we have corresponding __start_/__stop_ symbol.
+    // 4) Symbols that are defined in bitcode files and used for dynamic linking.
+    R.VisibleToRegularObj = Config->Relocatable || Sym->IsUsedInRegularObj ||
                             (R.Prevailing && Sym->includeInDynsym()) ||
                             UsedStartStop.count(ObjSym.getSectionName());
     if (R.Prevailing)

Added: lld/trunk/test/ELF/lto/relocatable.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/lto/relocatable.ll?rev=311431&view=auto
==============================================================================
--- lld/trunk/test/ELF/lto/relocatable.ll (added)
+++ lld/trunk/test/ELF/lto/relocatable.ll Tue Aug 22 01:36:54 2017
@@ -0,0 +1,55 @@
+; REQUIRES: x86
+; RUN: llvm-as %s -o %t1.o
+; RUN: ld.lld %t1.o -r -o %t
+; RUN: llvm-readobj -symbols %t | FileCheck %s
+
+; CHECK:       Symbols [
+; CHECK-NEXT:   Symbol {
+; CHECK-NEXT:     Name:
+; CHECK-NEXT:     Value: 0x0
+; CHECK-NEXT:     Size: 0
+; CHECK-NEXT:     Binding: Local
+; CHECK-NEXT:     Type: None
+; CHECK-NEXT:     Other: 0
+; CHECK-NEXT:     Section: Undefined
+; CHECK-NEXT:   }
+; CHECK-NEXT:   Symbol {
+; CHECK-NEXT:     Name:
+; CHECK-NEXT:     Value: 0x0
+; CHECK-NEXT:     Size: 0
+; CHECK-NEXT:     Binding: Local
+; CHECK-NEXT:     Type: Section
+; CHECK-NEXT:     Other: 0
+; CHECK-NEXT:     Section: .text
+; CHECK-NEXT:   }
+; CHECK-NEXT:   Symbol {
+; CHECK-NEXT:     Name:
+; CHECK-NEXT:     Value: 0x0
+; CHECK-NEXT:     Size: 0
+; CHECK-NEXT:     Binding: Local
+; CHECK-NEXT:     Type: Section
+; CHECK-NEXT:     Other: 0
+; CHECK-NEXT:     Section: .text.foo
+; CHECK-NEXT:   }
+; CHECK-NEXT:   Symbol {
+; CHECK-NEXT:     Name: foo
+; CHECK-NEXT:     Value: 0x0
+; CHECK-NEXT:     Size: 1
+; CHECK-NEXT:     Binding: Global
+; CHECK-NEXT:     Type: Function
+; CHECK-NEXT:     Other: 0
+; CHECK-NEXT:     Section: .text.foo
+; CHECK-NEXT:   }
+; CHECK-NEXT: ]
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @foo() {
+  call void @bar()
+  ret void
+}
+
+define internal void @bar() {
+  ret void
+}




More information about the llvm-commits mailing list