[llvm] 4b1e3d1 - [gold] Ignore bitcode from sections inside object files

Tom Stellard via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 14 14:46:44 PDT 2022


Author: Tom Stellard
Date: 2022-07-14T14:46:15-07:00
New Revision: 4b1e3d19370694dd2b2c04a5945f3f9e43917456

URL: https://github.com/llvm/llvm-project/commit/4b1e3d19370694dd2b2c04a5945f3f9e43917456
DIFF: https://github.com/llvm/llvm-project/commit/4b1e3d19370694dd2b2c04a5945f3f9e43917456.diff

LOG: [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

Reviewed By: tejohnson, MaskRay

Differential Revision: https://reviews.llvm.org/D116995

Added: 
    llvm/test/tools/gold/X86/Inputs/bcsection-lib.ll

Modified: 
    llvm/docs/BitCodeFormat.rst
    llvm/docs/GoldPlugin.rst
    llvm/docs/ReleaseNotes.rst
    llvm/test/tools/gold/X86/Inputs/bcsection.s
    llvm/test/tools/gold/X86/bcsection.ll
    llvm/tools/gold/gold-plugin.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/docs/BitCodeFormat.rst b/llvm/docs/BitCodeFormat.rst
index 56268f1523cc4..d581e18d6daaa 100644
--- a/llvm/docs/BitCodeFormat.rst
+++ b/llvm/docs/BitCodeFormat.rst
@@ -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:
 

diff  --git a/llvm/docs/GoldPlugin.rst b/llvm/docs/GoldPlugin.rst
index ce310bc2cf3c0..07d2fc203eba5 100644
--- a/llvm/docs/GoldPlugin.rst
+++ b/llvm/docs/GoldPlugin.rst
@@ -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

diff  --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst
index f9fc516aa433a..3f83671c6c6b0 100644
--- a/llvm/docs/ReleaseNotes.rst
+++ b/llvm/docs/ReleaseNotes.rst
@@ -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
 ---------------------------------

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
index 0000000000000..ef3557c19cdc6
--- /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
index ede1e5c532dd1..c523612563b44 100644
--- 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
index 6d3481f8f9665..09882d83fe917 100644
--- 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
index 9a0264d0c1dd1..f1b457bb4f5ba 100644
--- a/llvm/tools/gold/gold-plugin.cpp
+++ b/llvm/tools/gold/gold-plugin.cpp
@@ -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);


        


More information about the llvm-commits mailing list