[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