The underlying issue in the LLVM gold plugin now has a proposed fix that we can use to remove the hack. Differential Revision: https://phabricator.services.mozilla.com/D145539
88 lines
3.1 KiB
Diff
88 lines
3.1 KiB
Diff
[gold] Ignore bitcode from sections inside object files
|
|
|
|
-fembed-bitcode will put bitcode into special sections within object
|
|
files, but this is not meant to be used by LTO, so the gold plugin
|
|
should ignore it.
|
|
|
|
https://github.com/llvm/llvm-project/issues/47216
|
|
|
|
diff --git a/llvm/test/tools/gold/X86/Inputs/bcsection-lib.ll b/llvm/test/tools/gold/X86/Inputs/bcsection-lib.ll
|
|
new file mode 100644
|
|
--- /dev/null
|
|
+++ b/llvm/test/tools/gold/X86/Inputs/bcsection-lib.ll
|
|
@@ -0,0 +1,6 @@
|
|
+declare void @elf_func()
|
|
+
|
|
+define i32 @lib_func() {
|
|
+ call void @elf_func()
|
|
+ ret i32 0
|
|
+}
|
|
diff --git a/llvm/test/tools/gold/X86/Inputs/bcsection.s b/llvm/test/tools/gold/X86/Inputs/bcsection.s
|
|
--- a/llvm/test/tools/gold/X86/Inputs/bcsection.s
|
|
+++ b/llvm/test/tools/gold/X86/Inputs/bcsection.s
|
|
@@ -1,2 +1,7 @@
|
|
+.global elf_func
|
|
+
|
|
+elf_func:
|
|
+ ret
|
|
+
|
|
.section .llvmbc
|
|
.incbin "bcsection.bc"
|
|
diff --git a/llvm/test/tools/gold/X86/bcsection.ll b/llvm/test/tools/gold/X86/bcsection.ll
|
|
--- a/llvm/test/tools/gold/X86/bcsection.ll
|
|
+++ b/llvm/test/tools/gold/X86/bcsection.ll
|
|
@@ -2,16 +2,29 @@
|
|
; RUN: llvm-as -o %t/bcsection.bc %s
|
|
|
|
; RUN: llvm-mc -I=%t -filetype=obj -triple=x86_64-unknown-unknown -o %t/bcsection.bco %p/Inputs/bcsection.s
|
|
-; RUN: llvm-nm --no-llvm-bc %t/bcsection.bco 2>&1 | FileCheck %s -check-prefix=NO-SYMBOLS
|
|
-; NO-SYMBOLS: no symbols
|
|
+; RUN: llc -filetype=obj -mtriple=x86_64-unknown-unknown -o %t/bcsection-lib.o %p/Inputs/bcsection-lib.ll
|
|
|
|
-; RUN: %gold -r -o %t/bcsection.o -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext %t/bcsection.bco
|
|
-; RUN: llvm-nm --no-llvm-bc %t/bcsection.o | FileCheck %s
|
|
+; RUN: %gold -shared --no-undefined -o %t/bcsection.so -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext %t/bcsection.bco %t/bcsection-lib.o
|
|
+
|
|
+; This test checks that the gold plugin does not attempt to use the bitcode
|
|
+; in the .llvmbc section for LTO. bcsection-lib.o calls a function that is
|
|
+; present the symbol table of bcsection.bco, but not included in the embedded
|
|
+; bitcode. If the linker were to use the bitcode, then the symbols in the
|
|
+; symbol table of bcsection.bco will be ignored and the link will fail.
|
|
+;
|
|
+; bcsection.bco:
|
|
+; .text:
|
|
+; elf_func
|
|
+; .llvmbc:
|
|
+; bitcode_func
|
|
+;
|
|
+; bcsection-lib.o:
|
|
+; calls elf_func()
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-unknown"
|
|
|
|
; CHECK: main
|
|
-define i32 @main() {
|
|
+define i32 @bitcode_func() {
|
|
ret i32 0
|
|
}
|
|
diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp
|
|
--- a/llvm/tools/gold/gold-plugin.cpp
|
|
+++ b/llvm/tools/gold/gold-plugin.cpp
|
|
@@ -540,6 +540,14 @@
|
|
BufferRef = Buffer->getMemBufferRef();
|
|
}
|
|
|
|
+ // Only use bitcode files for LTO. InputFile::create() will load bitcode
|
|
+ // from special sections within a binary object, this bitcode is typically
|
|
+ // generated by -fembed-bitcode and is not meant for LTO use.
|
|
+ if (identify_magic(BufferRef.getBuffer()) != file_magic::bitcode) {
|
|
+ *claimed = 0;
|
|
+ return LDPS_OK;
|
|
+ }
|
|
+
|
|
*claimed = 1;
|
|
|
|
Expected<std::unique_ptr<InputFile>> ObjOrErr = InputFile::create(BufferRef);
|
|
|