summaryrefslogtreecommitdiffstats
path: root/build/build-clang/llvmorg-15-init-16512-g4b1e3d193706.patch
diff options
context:
space:
mode:
Diffstat (limited to 'build/build-clang/llvmorg-15-init-16512-g4b1e3d193706.patch')
-rw-r--r--build/build-clang/llvmorg-15-init-16512-g4b1e3d193706.patch138
1 files changed, 138 insertions, 0 deletions
diff --git a/build/build-clang/llvmorg-15-init-16512-g4b1e3d193706.patch b/build/build-clang/llvmorg-15-init-16512-g4b1e3d193706.patch
new file mode 100644
index 0000000000..5ddb6a52de
--- /dev/null
+++ b/build/build-clang/llvmorg-15-init-16512-g4b1e3d193706.patch
@@ -0,0 +1,138 @@
+From 8482662676a4b6ef79a718c8c09943cb15241664 Mon Sep 17 00:00:00 2001
+From: Tom Stellard <tstellar@redhat.com>
+Date: Tue, 21 Jun 2022 22:22:11 -0700
+Subject: [PATCH] [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
+---
+ llvm/docs/BitCodeFormat.rst | 3 ++-
+ llvm/docs/GoldPlugin.rst | 4 ++++
+ .../tools/gold/X86/Inputs/bcsection-lib.ll | 6 +++++
+ llvm/test/tools/gold/X86/Inputs/bcsection.s | 5 ++++
+ llvm/test/tools/gold/X86/bcsection.ll | 23 +++++++++++++++----
+ llvm/tools/gold/gold-plugin.cpp | 8 +++++++
+ 6 files changed, 43 insertions(+), 6 deletions(-)
+ create mode 100644 llvm/test/tools/gold/X86/Inputs/bcsection-lib.ll
+
+diff --git a/llvm/docs/BitCodeFormat.rst b/llvm/docs/BitCodeFormat.rst
+index 8e81a7daa459..df1f6915d7d5 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 ce310bc2cf3c..07d2fc203eba 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/test/tools/gold/X86/Inputs/bcsection-lib.ll b/llvm/test/tools/gold/X86/Inputs/bcsection-lib.ll
+new file mode 100644
+index 000000000000..ef3557c19cdc
+--- /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 ede1e5c532dd..c523612563b4 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 6d3481f8f966..09882d83fe91 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 180c181368e3..294c7a3d6178 100644
+--- a/llvm/tools/gold/gold-plugin.cpp
++++ b/llvm/tools/gold/gold-plugin.cpp
+@@ -540,6 +540,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);
+--
+2.37.1.1.g659da70093
+