forked from Floorp-Projects/Floorp
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Bug 1767917 - Remove rust compiler-builtins-hack. r=firefox-build-sys…
…tem-reviewers,andi 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
- Loading branch information
Showing
4 changed files
with
88 additions
and
79 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
[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); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters