diff --git a/llvm/docs/BitCodeFormat.rst b/llvm/docs/BitCodeFormat.rst --- a/llvm/docs/BitCodeFormat.rst +++ b/llvm/docs/BitCodeFormat.rst @@ -475,7 +475,8 @@ 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: diff --git a/llvm/docs/GoldPlugin.rst b/llvm/docs/GoldPlugin.rst --- a/llvm/docs/GoldPlugin.rst +++ b/llvm/docs/GoldPlugin.rst @@ -17,6 +17,10 @@ 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 diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst --- a/llvm/docs/ReleaseNotes.rst +++ b/llvm/docs/ReleaseNotes.rst @@ -251,6 +251,9 @@ * :doc:`llvm-objcopy ` has removed support for the legacy ``zlib-gnu`` format. * :doc:`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 --------------------------------- 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 @@ -542,6 +542,14 @@ 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> ObjOrErr = InputFile::create(BufferRef);