summaryrefslogtreecommitdiffstats
path: root/build/build-clang/llvmorg-15-init-16512-g4b1e3d193706.patch
blob: 5ddb6a52dec21373f2e238e84339cbd54753da73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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