-
Notifications
You must be signed in to change notification settings - Fork 11.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ThinLTO][ELF] Add --thinlto-emit-index-files option
Allows ThinLTO indices to be written to disk on-the-fly/as-part-of “normal” linker execution. Previously ThinLTO indices could be written via --thinlto-index-only but that would cause the linker to exit early. For MLGO specifically, this enables saving the ThinLTO index files without having to restart the linker to collect data only available at later stages (i.e. output of --save-temps) of the linker's execution. Note, this option does not currently work with: --thinlto-object-suffix-replace, as this is intended to be used to consume minimized IR bitcode files while --thinlto-emit-index-files is intended to be run together with InProcessThinLTO (which cannot parse minimized IR). --thinlto-prefix-replace support is left unimplemented but can be implemented if needed Differential Revision: https://reviews.llvm.org/D127777
- Loading branch information
1 parent
8c6da76
commit 22f1273
Showing
7 changed files
with
193 additions
and
35 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
; REQUIRES: x86 | ||
|
||
;; Mostly copied/updated from thinlto-index-only.ll | ||
;; First ensure that the ThinLTO handling in lld handles | ||
;; bitcode without summary sections gracefully and generates index file. | ||
; RUN: rm -rf %t.dir && mkdir %t.dir && cd %t.dir | ||
; RUN: llvm-as %s -o 1.o | ||
; RUN: llvm-as %p/Inputs/thinlto.ll -o 2.o | ||
; RUN: ld.lld --thinlto-emit-index-files -shared 1.o 2.o -o 3 | ||
; RUN: ls 2.o.thinlto.bc | ||
; RUN: ls 3 | ||
; RUN: ld.lld -shared 1.o 2.o -o 3 | ||
; RUN: llvm-nm 3 | FileCheck %s --check-prefix=NM | ||
|
||
;; Basic ThinLTO tests. | ||
; RUN: opt -module-summary %s -o 1.o | ||
; RUN: opt -module-summary %p/Inputs/thinlto.ll -o 2.o | ||
; RUN: opt -module-summary %p/Inputs/thinlto_empty.ll -o 3.o | ||
|
||
;; Ensure lld generates an index and also a binary if requested. | ||
; RUN: ld.lld --thinlto-emit-index-files -shared 1.o 2.o -o 4 | ||
; RUN: llvm-bcanalyzer -dump 1.o.thinlto.bc | FileCheck %s --check-prefix=BACKEND1 | ||
; RUN: llvm-bcanalyzer -dump 2.o.thinlto.bc | FileCheck %s --check-prefix=BACKEND2 | ||
; RUN: ls 4 | ||
|
||
;; Ensure lld generates an index and not a binary if both emit-index and index-only are present. | ||
; RUN: ld.lld --thinlto-emit-index-files --thinlto-index-only -shared 1.o 2.o -o 5 | ||
; RUN: not ls 5 | ||
|
||
;; Ensure lld generates an index even if the file is wrapped in --start-lib/--end-lib | ||
; RUN: rm -f 2.o.thinlto.bc | ||
; RUN: ld.lld --thinlto-emit-index-files -shared 1.o 3.o --start-lib 2.o --end-lib -o 6 | ||
; RUN: llvm-dis < 2.o.thinlto.bc | grep -q '\^0 = module:' | ||
; RUN: ls 6 | ||
|
||
;; Test that LLD generates an empty index even for lazy object file that is not added to link. | ||
;; Test that LLD also generates empty imports file with the --thinlto-emit-imports-files option. | ||
; RUN: rm -f 1.o.thinlto.bc 1.o.imports | ||
; RUN: ld.lld --thinlto-emit-index-files -shared 2.o --start-lib 1.o --end-lib \ | ||
; RUN: --thinlto-emit-imports-files -o 7 | ||
; RUN: ls 7 | ||
; RUN: ls 1.o.thinlto.bc | ||
; RUN: ls 1.o.imports | ||
|
||
;; Ensure LLD generates an empty index for each bitcode file even if all bitcode files are lazy. | ||
; RUN: rm -f 1.o.thinlto.bc | ||
; RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux-gnu /dev/null -o dummy.o | ||
; RUN: ld.lld --thinlto-emit-index-files -shared dummy.o --start-lib 1.o --end-lib -o 8 | ||
; RUN: ls 8 | ||
; RUN: ls 1.o.thinlto.bc | ||
|
||
;; Test that LLD errors out when run with suffix replacement, or prefix replacement | ||
; RUN: not ld.lld --thinlto-emit-index-files -shared 2.o --start-lib 1.o --end-lib \ | ||
; RUN: --thinlto-prefix-replace="abc;xyz" 2>&1 | FileCheck %s --check-prefix=ERR1 | ||
; ERR1: --thinlto-prefix-replace is not supported with --thinlto-emit-index-files | ||
|
||
; RUN: not ld.lld --thinlto-emit-index-files -shared 2.o --start-lib 1.o --end-lib \ | ||
; RUN: --thinlto-object-suffix-replace="abc;xyz" 2>&1 | FileCheck %s --check-prefix=ERR2 | ||
; ERR2: --thinlto-object-suffix-replace is not supported with --thinlto-emit-index-files | ||
|
||
;; But not when passed with index only as well | ||
; RUN: ld.lld --thinlto-emit-index-files -shared 2.o --start-lib 1.o --end-lib \ | ||
; RUN: --thinlto-prefix-replace="abc;xyz" --thinlto-index-only | ||
|
||
; RUN: ld.lld --thinlto-emit-index-files -shared 2.o --start-lib 1.o --end-lib \ | ||
; RUN: --thinlto-object-suffix-replace="abc;xyz" --thinlto-index-only | ||
|
||
; NM: T f | ||
|
||
;; 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 = '1.o' | ||
; BACKEND1-NEXT: <ENTRY {{.*}} record string = '2.o' | ||
; BACKEND1-NEXT: </MODULE_STRTAB_BLOCK | ||
; BACKEND1: <GLOBALVAL_SUMMARY_BLOCK | ||
; BACKEND1: <VERSION | ||
; BACKEND1: <FLAGS | ||
; BACKEND1: <VALUE_GUID op0={{1|2}} op1={{-3706093650706652785|-5300342847281564238}} | ||
; BACKEND1: <VALUE_GUID op0={{1|2}} op1={{-3706093650706652785|-5300342847281564238}} | ||
; BACKEND1: <COMBINED | ||
; BACKEND1: <COMBINED | ||
; BACKEND1: </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 = '2.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: <BLOCK_COUNT op0=2/> | ||
; BACKEND2-NEXT: </GLOBALVAL_SUMMARY_BLOCK | ||
|
||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters