[lld] bd448f0 - [ELF] BitcodeFile: resolve defined symbols before undefined symbols

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Sat Feb 26 21:37:12 PST 2022


Author: Fangrui Song
Date: 2022-02-27T05:37:08Z
New Revision: bd448f01a62aacf95d671608dab1b2535c4d2cca

URL: https://github.com/llvm/llvm-project/commit/bd448f01a62aacf95d671608dab1b2535c4d2cca
DIFF: https://github.com/llvm/llvm-project/commit/bd448f01a62aacf95d671608dab1b2535c4d2cca.diff

LOG: [ELF] BitcodeFile: resolve defined symbols before undefined symbols

This ports D95985 for ELF relocatable object files to BitcodeFile.

Added: 
    

Modified: 
    lld/ELF/InputFiles.cpp
    lld/test/ELF/lto/comdat-mixed-archive.test
    lld/test/ELF/lto/start-lib.ll
    lld/test/ELF/lto/visibility.ll

Removed: 
    


################################################################################
diff  --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index da6fc3a6e627c..0df7552dd658e 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -1666,10 +1666,18 @@ template <class ELFT> void BitcodeFile::parse() {
   }
 
   symbols.resize(obj->symbols().size());
-  for (auto it : llvm::enumerate(obj->symbols())) {
-    Symbol *&sym = symbols[it.index()];
-    createBitcodeSymbol<ELFT>(sym, keptComdats, it.value(), *this);
-  }
+  // Process defined symbols first. See the comment in
+  // ObjFile<ELFT>::initializeSymbols.
+  for (auto it : llvm::enumerate(obj->symbols()))
+    if (!it.value().isUndefined()) {
+      Symbol *&sym = symbols[it.index()];
+      createBitcodeSymbol<ELFT>(sym, keptComdats, it.value(), *this);
+    }
+  for (auto it : llvm::enumerate(obj->symbols()))
+    if (it.value().isUndefined()) {
+      Symbol *&sym = symbols[it.index()];
+      createBitcodeSymbol<ELFT>(sym, keptComdats, it.value(), *this);
+    }
 
   for (auto l : obj->getDependentLibraries())
     addDependentLibrary(l, this);

diff  --git a/lld/test/ELF/lto/comdat-mixed-archive.test b/lld/test/ELF/lto/comdat-mixed-archive.test
index 52cd4cf74f3d8..ee644a8cbd983 100644
--- a/lld/test/ELF/lto/comdat-mixed-archive.test
+++ b/lld/test/ELF/lto/comdat-mixed-archive.test
@@ -29,10 +29,10 @@ BCSYM-NEXT: W foo
 ;; Check that the symbols are handled in the expected order.
 TRACE:      lib.a(obj.o): lazy definition of foo
 TRACE-NEXT: lib.a(obj.o): lazy definition of bar
+TRACE-NEXT: lib.a(bc.bc): definition of foo
 TRACE-NEXT: lib.a(bc.bc): reference to bar
 TRACE-NEXT: lib.a(obj.o): reference to foo
 TRACE-NEXT: lib.a(obj.o): definition of bar
-TRACE-NEXT: lib.a(bc.bc): definition of foo
 TRACE-NEXT: <internal>: reference to foo
 ;; The definition of "foo" is visible outside the LTO result.
 TRACE-NEXT: lto.tmp: definition of foo

diff  --git a/lld/test/ELF/lto/start-lib.ll b/lld/test/ELF/lto/start-lib.ll
index d46e5d5cdd853..39f62a7b1074f 100644
--- a/lld/test/ELF/lto/start-lib.ll
+++ b/lld/test/ELF/lto/start-lib.ll
@@ -6,18 +6,18 @@
 ;
 ; RUN: ld.lld -shared -o %t3 %t1.o %t2.o %t3.o
 ; RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=TEST1 %s
-; TEST1: Name: bar
 ; TEST1: Name: foo
+; TEST1: Name: bar
 ;
 ; RUN: ld.lld -shared -o %t3 -u bar %t1.o --start-lib %t2.o %t3.o
 ; RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=TEST2 %s
-; TEST2: Name: bar
 ; TEST2-NOT: Name: foo
+; TEST2: Name: bar
 ;
 ; RUN: ld.lld -shared -o %t3 %t1.o --start-lib %t2.o %t3.o
 ; RUN: llvm-readobj --symbols %t3 | FileCheck --check-prefix=TEST3 %s
-; TEST3-NOT: Name: bar
 ; TEST3-NOT: Name: foo
+; TEST3-NOT: Name: bar
 
 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"

diff  --git a/lld/test/ELF/lto/visibility.ll b/lld/test/ELF/lto/visibility.ll
index 7315b8fea5f75..2b63f891722d7 100644
--- a/lld/test/ELF/lto/visibility.ll
+++ b/lld/test/ELF/lto/visibility.ll
@@ -5,7 +5,7 @@
 ; RUN: llvm-dis < %t.so.0.2.internalize.bc | FileCheck --check-prefix=IR %s
 ; RUN: llvm-readobj --symbols %t.so | FileCheck %s
 
-; CHECK:      Name: g
+; CHECK:      Name: a
 ; CHECK-NEXT: Value:
 ; CHECK-NEXT: Size: 0
 ; CHECK-NEXT: Binding: Local
@@ -13,9 +13,9 @@
 ; CHECK-NEXT: Other [ (0x2)
 ; CHECK-NEXT:   STV_HIDDEN
 ; CHECK-NEXT: ]
-; CHECK-NEXT: Section: .text
+; CHECK-NEXT: Section: .data
 
-; CHECK:      Name: a
+; CHECK:      Name: g
 ; CHECK-NEXT: Value:
 ; CHECK-NEXT: Size: 0
 ; CHECK-NEXT: Binding: Local
@@ -23,7 +23,7 @@
 ; CHECK-NEXT: Other [ (0x2)
 ; CHECK-NEXT:   STV_HIDDEN
 ; CHECK-NEXT: ]
-; CHECK-NEXT: Section: .data
+; CHECK-NEXT: Section: .text
 
 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"


        


More information about the llvm-commits mailing list