Skip to content

Commit

Permalink
[gold] Ignore bitcode from sections inside object files
Browse files Browse the repository at this point in the history
-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.

#47216

Reviewed By: tejohnson, MaskRay

Differential Revision: https://reviews.llvm.org/D116995
  • Loading branch information
tstellar committed Jul 14, 2022
1 parent ebf3dbb commit 4b1e3d1
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 6 deletions.
3 changes: 2 additions & 1 deletion llvm/docs/BitCodeFormat.rst
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,8 @@ formats. This wrapper format is useful for accommodating LTO in compilation
pipelines where intermediate objects must be native object files which contain
metadata in other sections.

Not all tools support this format.
Not all tools support this format. For example, lld and the gold plugin will
ignore these sections when linking object files.

.. _encoding of LLVM IR:

Expand Down
4 changes: 4 additions & 0 deletions llvm/docs/GoldPlugin.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ and above also supports LTO via plugins. However, usage of the LLVM
gold plugin with ld.bfd is not tested and therefore not officially
supported or recommended.

As of LLVM 15, the gold plugin will ignore bitcode from the ``.llvmbc``
section inside of ELF object files. However, LTO with bitcode files
is still supported.

.. _`gold linker`: http://sourceware.org/binutils
.. _`GCC LTO`: http://gcc.gnu.org/wiki/LinkTimeOptimization
.. _`gold plugin interface`: http://gcc.gnu.org/wiki/whopr/driver
Expand Down
3 changes: 3 additions & 0 deletions llvm/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,9 @@ Changes to the LLVM tools
* :doc:`llvm-objcopy <CommandGuide/llvm-objcopy>` has removed support for the legacy ``zlib-gnu`` format.
* :doc:`llvm-objcopy <CommandGuide/llvm-objcopy>` now allows ``--set-section-flags src=... --rename-section src=tst``.
``--add-section=.foo1=... --rename-section=.foo1=.foo2`` now adds ``.foo1`` instead of ``.foo2``.
* The LLVM gold plugin now ignores bitcode from the ``.llvmbc`` section of ELF
files when doing LTO. https://github.com/llvm/llvm-project/issues/47216
>>>>>>> bbd6f1cd6d16... [gold] Ignore bitcode from sections inside object files

Changes to LLDB
---------------------------------
Expand Down
6 changes: 6 additions & 0 deletions llvm/test/tools/gold/X86/Inputs/bcsection-lib.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
declare void @elf_func()

define i32 @lib_func() {
call void @elf_func()
ret i32 0
}
5 changes: 5 additions & 0 deletions llvm/test/tools/gold/X86/Inputs/bcsection.s
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
.global elf_func

elf_func:
ret

.section .llvmbc
.incbin "bcsection.bc"
23 changes: 18 additions & 5 deletions llvm/test/tools/gold/X86/bcsection.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
8 changes: 8 additions & 0 deletions llvm/tools/gold/gold-plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,14 @@ static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file,
BufferRef = Buffer->getMemBufferRef();
}

// Only use bitcode files for LTO. InputFile::create() will load bitcode
// from the .llvmbc section within a binary object, this bitcode is typically
// generated by -fembed-bitcode and is not to be used by LLVMgold.so for LTO.
if (identify_magic(BufferRef.getBuffer()) != file_magic::bitcode) {
*claimed = 0;
return LDPS_OK;
}

*claimed = 1;

Expected<std::unique_ptr<InputFile>> ObjOrErr = InputFile::create(BufferRef);
Expand Down

0 comments on commit 4b1e3d1

Please sign in to comment.