tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

llvmorg-15-init-16512-g4b1e3d193706.patch (5417B)


      1 From 8482662676a4b6ef79a718c8c09943cb15241664 Mon Sep 17 00:00:00 2001
      2 From: Tom Stellard <tstellar@redhat.com>
      3 Date: Tue, 21 Jun 2022 22:22:11 -0700
      4 Subject: [PATCH] [gold] Ignore bitcode from sections inside object files
      5 
      6 -fembed-bitcode will put bitcode into special sections within object
      7 files, but this is not meant to be used by LTO, so the gold plugin
      8 should ignore it.
      9 
     10 https://github.com/llvm/llvm-project/issues/47216
     11 
     12 Reviewed By: tejohnson, MaskRay
     13 
     14 Differential Revision: https://reviews.llvm.org/D116995
     15 ---
     16 llvm/docs/BitCodeFormat.rst                   |  3 ++-
     17 llvm/docs/GoldPlugin.rst                      |  4 ++++
     18 .../tools/gold/X86/Inputs/bcsection-lib.ll    |  6 +++++
     19 llvm/test/tools/gold/X86/Inputs/bcsection.s   |  5 ++++
     20 llvm/test/tools/gold/X86/bcsection.ll         | 23 +++++++++++++++----
     21 llvm/tools/gold/gold-plugin.cpp               |  8 +++++++
     22 6 files changed, 43 insertions(+), 6 deletions(-)
     23 create mode 100644 llvm/test/tools/gold/X86/Inputs/bcsection-lib.ll
     24 
     25 diff --git a/llvm/docs/BitCodeFormat.rst b/llvm/docs/BitCodeFormat.rst
     26 index 8e81a7daa459..df1f6915d7d5 100644
     27 --- a/llvm/docs/BitCodeFormat.rst
     28 +++ b/llvm/docs/BitCodeFormat.rst
     29 @@ -475,7 +475,8 @@ formats.  This wrapper format is useful for accommodating LTO in compilation
     30 pipelines where intermediate objects must be native object files which contain
     31 metadata in other sections.
     32 
     33 -Not all tools support this format.
     34 +Not all tools support this format.  For example, lld and the gold plugin will
     35 +ignore these sections when linking object files.
     36 
     37 .. _encoding of LLVM IR:
     38 
     39 diff --git a/llvm/docs/GoldPlugin.rst b/llvm/docs/GoldPlugin.rst
     40 index ce310bc2cf3c..07d2fc203eba 100644
     41 --- a/llvm/docs/GoldPlugin.rst
     42 +++ b/llvm/docs/GoldPlugin.rst
     43 @@ -17,6 +17,10 @@ and above also supports LTO via plugins.  However, usage of the LLVM
     44 gold plugin with ld.bfd is not tested and therefore not officially
     45 supported or recommended.
     46 
     47 +As of LLVM 15, the gold plugin will ignore bitcode from the ``.llvmbc``
     48 +section inside of ELF object files.  However, LTO with bitcode files
     49 +is still supported.
     50 +
     51 .. _`gold linker`: http://sourceware.org/binutils
     52 .. _`GCC LTO`: http://gcc.gnu.org/wiki/LinkTimeOptimization
     53 .. _`gold plugin interface`: http://gcc.gnu.org/wiki/whopr/driver
     54 diff --git a/llvm/test/tools/gold/X86/Inputs/bcsection-lib.ll b/llvm/test/tools/gold/X86/Inputs/bcsection-lib.ll
     55 new file mode 100644
     56 index 000000000000..ef3557c19cdc
     57 --- /dev/null
     58 +++ b/llvm/test/tools/gold/X86/Inputs/bcsection-lib.ll
     59 @@ -0,0 +1,6 @@
     60 +declare void @elf_func()
     61 +
     62 +define i32 @lib_func() {
     63 +  call void @elf_func()
     64 +  ret i32 0
     65 +}
     66 diff --git a/llvm/test/tools/gold/X86/Inputs/bcsection.s b/llvm/test/tools/gold/X86/Inputs/bcsection.s
     67 index ede1e5c532dd..c523612563b4 100644
     68 --- a/llvm/test/tools/gold/X86/Inputs/bcsection.s
     69 +++ b/llvm/test/tools/gold/X86/Inputs/bcsection.s
     70 @@ -1,2 +1,7 @@
     71 +.global elf_func
     72 +
     73 +elf_func:
     74 +   ret
     75 +
     76 .section .llvmbc
     77 .incbin "bcsection.bc"
     78 diff --git a/llvm/test/tools/gold/X86/bcsection.ll b/llvm/test/tools/gold/X86/bcsection.ll
     79 index 6d3481f8f966..09882d83fe91 100644
     80 --- a/llvm/test/tools/gold/X86/bcsection.ll
     81 +++ b/llvm/test/tools/gold/X86/bcsection.ll
     82 @@ -2,16 +2,29 @@
     83 ; RUN: llvm-as -o %t/bcsection.bc %s
     84 
     85 ; RUN: llvm-mc -I=%t -filetype=obj -triple=x86_64-unknown-unknown -o %t/bcsection.bco %p/Inputs/bcsection.s
     86 -; RUN: llvm-nm --no-llvm-bc %t/bcsection.bco 2>&1 | FileCheck %s -check-prefix=NO-SYMBOLS
     87 -; NO-SYMBOLS: no symbols
     88 +; RUN: llc -filetype=obj -mtriple=x86_64-unknown-unknown -o %t/bcsection-lib.o %p/Inputs/bcsection-lib.ll
     89 
     90 -; RUN: %gold -r -o %t/bcsection.o -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext %t/bcsection.bco
     91 -; RUN: llvm-nm --no-llvm-bc %t/bcsection.o | FileCheck %s
     92 +; RUN: %gold -shared --no-undefined -o %t/bcsection.so -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext %t/bcsection.bco %t/bcsection-lib.o
     93 +
     94 +; This test checks that the gold plugin does not attempt to use the bitcode
     95 +; in the .llvmbc section for LTO.  bcsection-lib.o calls a function that is
     96 +; present the symbol table of bcsection.bco, but not included in the embedded
     97 +; bitcode.  If the linker were to use the bitcode, then the symbols in the
     98 +; symbol table of bcsection.bco will be ignored and the link will fail.
     99 +;
    100 +; bcsection.bco:
    101 +;  .text:
    102 +;    elf_func
    103 +;  .llvmbc:
    104 +;    bitcode_func
    105 +;
    106 +; bcsection-lib.o:
    107 +;   calls elf_func()
    108 
    109 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
    110 target triple = "x86_64-unknown-unknown"
    111 
    112 ; CHECK: main
    113 -define i32 @main() {
    114 +define i32 @bitcode_func() {
    115   ret i32 0
    116 }
    117 diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp
    118 index 180c181368e3..294c7a3d6178 100644
    119 --- a/llvm/tools/gold/gold-plugin.cpp
    120 +++ b/llvm/tools/gold/gold-plugin.cpp
    121 @@ -540,6 +540,14 @@ static ld_plugin_status claim_file_hook(const ld_plugin_input_file *file,
    122     BufferRef = Buffer->getMemBufferRef();
    123   }
    124 
    125 +  // Only use bitcode files for LTO.  InputFile::create() will load bitcode
    126 +  // from the .llvmbc section within a binary object, this bitcode is typically
    127 +  // generated by -fembed-bitcode and is not to be used by LLVMgold.so for LTO.
    128 +  if (identify_magic(BufferRef.getBuffer()) != file_magic::bitcode) {
    129 +    *claimed = 0;
    130 +    return LDPS_OK;
    131 +  }
    132 +
    133   *claimed = 1;
    134 
    135   Expected<std::unique_ptr<InputFile>> ObjOrErr = InputFile::create(BufferRef);
    136 -- 
    137 2.37.1.1.g659da70093