Summary: A recent fix to drop dead symbols (r323633) did not work for ThinLTO distributed backends because we lose the WithGlobalValueDeadStripping set on the index during the thin link. This patch adds a new flags record to the bitcode format for the index, and serializes this flag for the combined index (it would always be 0 for the per-module index generated by the compile step, so no need to serialize the new flags record there until/unless we add another flag that applies to the per-module indexes). Generally this flag should always be set for the distributed backends, which are necessarily performed after the thin link. However, if we were to simply set this flag on the index applied to the distributed backends (invoked via clang), we would lose the ability to disable dead stripping via -compute-dead=false for debugging purposes. Reviewers: grimar, pcc Subscribers: mehdi_amini, inglorion, eraman, llvm-commits Differential Revision: https://reviews.llvm.org/D42799 llvm-svn: 324444
140 lines
5.4 KiB
LLVM
140 lines
5.4 KiB
LLVM
; First ensure that the ThinLTO handling in the gold plugin handles
|
|
; bitcode without summary sections gracefully.
|
|
; RUN: llvm-as %s -o %t.o
|
|
; RUN: llvm-as %p/Inputs/thinlto.ll -o %t2.o
|
|
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
|
|
; RUN: -m elf_x86_64 \
|
|
; RUN: --plugin-opt=thinlto \
|
|
; RUN: --plugin-opt=thinlto-index-only \
|
|
; RUN: -shared %t.o %t2.o -o %t3
|
|
; RUN: not test -e %t3
|
|
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
|
|
; RUN: -m elf_x86_64 \
|
|
; RUN: --plugin-opt=thinlto \
|
|
; RUN: -shared %t.o %t2.o -o %t4
|
|
; RUN: llvm-nm %t4 | FileCheck %s --check-prefix=NM
|
|
|
|
; Next generate summary sections and test gold handling.
|
|
; RUN: opt -module-summary %s -o %t.o
|
|
; RUN: opt -module-summary %p/Inputs/thinlto.ll -o %t2.o
|
|
|
|
; Ensure gold generates an index and not a binary if requested.
|
|
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
|
|
; RUN: -m elf_x86_64 \
|
|
; RUN: --plugin-opt=thinlto \
|
|
; RUN: --plugin-opt=thinlto-index-only \
|
|
; RUN: -shared %t.o %t2.o -o %t3
|
|
; RUN: llvm-bcanalyzer -dump %t.o.thinlto.bc | FileCheck %s --check-prefix=BACKEND1
|
|
; RUN: llvm-bcanalyzer -dump %t2.o.thinlto.bc | FileCheck %s --check-prefix=BACKEND2
|
|
; RUN: not test -e %t3
|
|
|
|
; Ensure gold generates an index as well as a binary with save-temps in ThinLTO mode.
|
|
; First force single-threaded mode
|
|
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
|
|
; RUN: -m elf_x86_64 \
|
|
; RUN: --plugin-opt=save-temps \
|
|
; RUN: --plugin-opt=thinlto \
|
|
; RUN: --plugin-opt=jobs=1 \
|
|
; RUN: -shared %t.o %t2.o -o %t4
|
|
; RUN: llvm-bcanalyzer -dump %t4.index.bc | FileCheck %s --check-prefix=COMBINED
|
|
; RUN: llvm-nm %t4 | FileCheck %s --check-prefix=NM
|
|
|
|
; Check with --no-map-whole-files
|
|
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
|
|
; RUN: -m elf_x86_64 \
|
|
; RUN: --plugin-opt=save-temps \
|
|
; RUN: --plugin-opt=thinlto \
|
|
; RUN: --plugin-opt=jobs=1 \
|
|
; RUN: --no-map-whole-files \
|
|
; RUN: -shared %t.o %t2.o -o %t4
|
|
; RUN: llvm-bcanalyzer -dump %t4.index.bc | FileCheck %s --check-prefix=COMBINED
|
|
; RUN: llvm-nm %t4 | FileCheck %s --check-prefix=NM
|
|
|
|
; Next force multi-threaded mode
|
|
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
|
|
; RUN: -m elf_x86_64 \
|
|
; RUN: --plugin-opt=save-temps \
|
|
; RUN: --plugin-opt=thinlto \
|
|
; RUN: --plugin-opt=jobs=2 \
|
|
; RUN: -shared %t.o %t2.o -o %t4
|
|
; RUN: llvm-bcanalyzer -dump %t4.index.bc | FileCheck %s --check-prefix=COMBINED
|
|
; RUN: llvm-nm %t4 | FileCheck %s --check-prefix=NM
|
|
|
|
; Test --plugin-opt=obj-path to ensure unique object files generated.
|
|
; RUN: rm -f %t5.o %t5.o1
|
|
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
|
|
; RUN: -m elf_x86_64 \
|
|
; RUN: --plugin-opt=thinlto \
|
|
; RUN: --plugin-opt=jobs=2 \
|
|
; RUN: --plugin-opt=obj-path=%t5.o \
|
|
; RUN: -shared %t.o %t2.o -o %t4
|
|
; RUN: llvm-nm %t5.o1 | FileCheck %s --check-prefix=NM2
|
|
; RUN: llvm-nm %t5.o2 | FileCheck %s --check-prefix=NM2
|
|
|
|
; Test to ensure that thinlto-index-only with obj-path creates the file.
|
|
; RUN: rm -f %t5.o %t5.o1
|
|
; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
|
|
; RUN: -m elf_x86_64 \
|
|
; RUN: --plugin-opt=thinlto \
|
|
; RUN: --plugin-opt=jobs=2 \
|
|
; RUN: --plugin-opt=thinlto-index-only \
|
|
; RUN: --plugin-opt=obj-path=%t5.o \
|
|
; RUN: -shared %t.o %t2.o -o %t4
|
|
; RUN: llvm-readobj -h %t5.o | FileCheck %s --check-prefix=FORMAT
|
|
; RUN: llvm-nm %t5.o | count 0
|
|
|
|
; NM: T f
|
|
; NM2: T {{f|g}}
|
|
; FORMAT: Format: ELF64-x86-64
|
|
|
|
; The backend index for this module contains summaries from itself and
|
|
; Inputs/thinlto.ll, as it imports from the latter.
|
|
; BACKEND1: <MODULE_STRTAB_BLOCK
|
|
; BACKEND1-NEXT: <ENTRY {{.*}} record string = '{{.*}}/test/tools/gold/X86/Output/thinlto.ll.tmp{{.*}}.o'
|
|
; BACKEND1-NEXT: <ENTRY {{.*}} record string = '{{.*}}/test/tools/gold/X86/Output/thinlto.ll.tmp{{.*}}.o'
|
|
; BACKEND1-NEXT: </MODULE_STRTAB_BLOCK
|
|
; BACKEND1-NEXT: <GLOBALVAL_SUMMARY_BLOCK
|
|
; BACKEND1-NEXT: <VERSION
|
|
; BACKEND1-NEXT: <FLAGS
|
|
; BACKEND1-NEXT: <VALUE_GUID op0={{1|2}} op1={{-3706093650706652785|-5300342847281564238}}
|
|
; BACKEND1-NEXT: <VALUE_GUID op0={{1|2}} op1={{-3706093650706652785|-5300342847281564238}}
|
|
; BACKEND1-NEXT: <COMBINED
|
|
; BACKEND1-NEXT: <COMBINED
|
|
; BACKEND1-NEXT: </GLOBALVAL_SUMMARY_BLOCK
|
|
|
|
; The backend index for Input/thinlto.ll contains summaries from itself only,
|
|
; as it does not import anything.
|
|
; BACKEND2: <MODULE_STRTAB_BLOCK
|
|
; BACKEND2-NEXT: <ENTRY {{.*}} record string = '{{.*}}/test/tools/gold/X86/Output/thinlto.ll.tmp2.o'
|
|
; BACKEND2-NEXT: </MODULE_STRTAB_BLOCK
|
|
; BACKEND2-NEXT: <GLOBALVAL_SUMMARY_BLOCK
|
|
; BACKEND2-NEXT: <VERSION
|
|
; BACKEND2-NEXT: <FLAGS
|
|
; BACKEND2-NEXT: <VALUE_GUID op0=1 op1=-5300342847281564238
|
|
; BACKEND2-NEXT: <COMBINED
|
|
; BACKEND2-NEXT: </GLOBALVAL_SUMMARY_BLOCK
|
|
|
|
; COMBINED: <MODULE_STRTAB_BLOCK
|
|
; COMBINED-NEXT: <ENTRY {{.*}} record string = '{{.*}}/test/tools/gold/X86/Output/thinlto.ll.tmp{{.*}}.o'
|
|
; COMBINED-NEXT: <ENTRY {{.*}} record string = '{{.*}}/test/tools/gold/X86/Output/thinlto.ll.tmp{{.*}}.o'
|
|
; COMBINED-NEXT: </MODULE_STRTAB_BLOCK
|
|
; COMBINED-NEXT: <GLOBALVAL_SUMMARY_BLOCK
|
|
; COMBINED-NEXT: <VERSION
|
|
; COMBINED-NEXT: <FLAGS
|
|
; COMBINED-NEXT: <VALUE_GUID op0={{1|2}} op1={{-3706093650706652785|-5300342847281564238}}
|
|
; COMBINED-NEXT: <VALUE_GUID op0={{1|2}} op1={{-3706093650706652785|-5300342847281564238}}
|
|
; COMBINED-NEXT: <COMBINED
|
|
; COMBINED-NEXT: <COMBINED
|
|
; COMBINED-NEXT: </GLOBALVAL_SUMMARY_BLOCK
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
declare void @g(...)
|
|
|
|
define void @f() {
|
|
entry:
|
|
call void (...) @g()
|
|
ret void
|
|
}
|