-
Notifications
You must be signed in to change notification settings - Fork 14.4k
[DTLTO][LLD][ELF] Add support for Integrated Distributed ThinLTO #142757
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+306
−1
Merged
Changes from all commits
Commits
Show all changes
18 commits
Select commit
Hold shift + click to select a range
d3e6ce0
[DTLTO][LLD][ELF] Add support for Integrated Distributed ThinLTO
bd1976bris da45393
Remove thin-archive bitcode member support
bd1976bris f1ca7de
Remove trailing full stop from new help text.
bd1976bris d256457
Use "relocatable file" in test comment rather than "ET_REL"
bd1976bris aa04aff
Improve ls usage/checks in tests.
bd1976bris 2006a77
"#" -> "##" to make comments stand out more.
bd1976bris 8716e1c
Remove unneeded "-O2" use.
bd1976bris cb5e266
Remove unneeded "--relocation-model=pic" use.
bd1976bris 96fa2cb
Remove unneeded "entry:" lines from textual IR in tests.
bd1976bris 54b91cc
Improve comment in test to explain the presence of the PID in a the f…
bd1976bris 04fa090
Remove unneeded linker name from error message check.
bd1976bris d2a704a
Removed unnecessary line left over from now removed code.
bd1976bris 6f9889e
Amalgamate imports.test, index.test, and save-temps.test into files.test
bd1976bris af40a1e
Remove empty.test
bd1976bris 47cd97e
Simplify lld/test/ELF/dtlto/partitions.test
bd1976bris ef5f7f6
Move x86 requirement cross-project-test into lit.local.cfg
bd1976bris a9449ee
Rename the dtlto.c test to ld-dtlto.c since it specifically tests ld.lld
bd1976bris b28d34e
Fix missing word in comment sentence
bd1976bris File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or 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 hidden or 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,3 @@ | ||
Tests for DTLTO (Integrated Distributed ThinLTO) functionality. | ||
|
||
These are integration tests as DTLTO invokes `clang` for code-generation. |
This file contains hidden or 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,41 @@ | ||
// REQUIRES: ld.lld | ||
|
||
/// Simple test that DTLTO works with a single input bitcode file and that | ||
/// --save-temps can be applied to the remote compilation. | ||
|
||
// RUN: rm -rf %t && mkdir %t && cd %t | ||
|
||
// RUN: %clang --target=x86_64-linux-gnu -c -flto=thin %s -o dtlto.o | ||
|
||
// RUN: ld.lld dtlto.o \ | ||
// RUN: --thinlto-distributor=%python \ | ||
// RUN: --thinlto-distributor-arg=%llvm_src_root/utils/dtlto/local.py \ | ||
// RUN: --thinlto-remote-compiler=%clang \ | ||
// RUN: --thinlto-remote-compiler-arg=--save-temps | ||
|
||
/// Check that the required output files have been created. | ||
// RUN: ls | sort | FileCheck %s | ||
|
||
/// No files are expected before. | ||
// CHECK-NOT: {{.}} | ||
|
||
/// Linked ELF. | ||
// CHECK: {{^}}a.out{{$}} | ||
|
||
/// Produced by the bitcode compilation. | ||
// CHECK-NEXT: {{^}}dtlto.o{{$}} | ||
|
||
/// --save-temps output for the backend compilation. | ||
// CHECK-NEXT: {{^}}dtlto.s{{$}} | ||
// CHECK-NEXT: {{^}}dtlto.s.0.preopt.bc{{$}} | ||
// CHECK-NEXT: {{^}}dtlto.s.1.promote.bc{{$}} | ||
// CHECK-NEXT: {{^}}dtlto.s.2.internalize.bc{{$}} | ||
// CHECK-NEXT: {{^}}dtlto.s.3.import.bc{{$}} | ||
// CHECK-NEXT: {{^}}dtlto.s.4.opt.bc{{$}} | ||
// CHECK-NEXT: {{^}}dtlto.s.5.precodegen.bc{{$}} | ||
// CHECK-NEXT: {{^}}dtlto.s.resolution.txt{{$}} | ||
|
||
/// No files are expected after. | ||
// CHECK-NOT: {{.}} | ||
|
||
int _start() { return 0; } |
This file contains hidden or 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,5 @@ | ||
if any( | ||
f not in config.available_features | ||
for f in ("clang", "x86-registered-target") | ||
): | ||
config.unsupported = True |
This file contains hidden or 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 hidden or 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 hidden or 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 hidden or 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 hidden or 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,42 @@ | ||
Integrated Distributed ThinLTO (DTLTO) | ||
====================================== | ||
|
||
Integrated Distributed ThinLTO (DTLTO) enables the distribution of backend | ||
ThinLTO compilations via external distribution systems, such as Incredibuild, | ||
during the traditional link step. | ||
|
||
The implementation is documented here: https://llvm.org/docs/DTLTO.html. | ||
|
||
Currently, DTLTO is only supported in ELF LLD. Support will be added to other | ||
LLD flavours in the future. | ||
|
||
ELF LLD | ||
------- | ||
|
||
The command-line interface is as follows: | ||
|
||
- ``--thinlto-distributor=<path>`` | ||
Specifies the file to execute as the distributor process. If specified, | ||
ThinLTO backend compilations will be distributed. | ||
|
||
- ``--thinlto-remote-compiler=<path>`` | ||
Specifies the path to the compiler that the distributor process will use for | ||
backend compilations. The compiler invoked must match the version of LLD. | ||
|
||
- ``--thinlto-distributor-arg=<arg>`` | ||
Specifies ``<arg>`` on the command line when invoking the distributor. | ||
Can be specified multiple times. | ||
|
||
- ``--thinlto-remote-compiler-arg=<arg>`` | ||
Appends ``<arg>`` to the remote compiler's command line. | ||
Can be specified multiple times. | ||
|
||
Options that introduce extra input/output files may cause miscompilation if | ||
the distribution system does not automatically handle pushing/fetching them to | ||
remote nodes. In such cases, configure the distributor - possibly using | ||
``--thinlto-distributor-arg=`` - to manage these dependencies. See the | ||
distributor documentation for details. | ||
|
||
Some LLD LTO options (e.g., ``--lto-sample-profile=<file>``) are supported. | ||
Currently, other options are silently accepted but do not have the intended | ||
effect. Support for such options will be expanded in the future. |
This file contains hidden or 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 |
---|---|---|
|
@@ -147,3 +147,4 @@ document soon. | |
ELF/start-stop-gc | ||
ELF/warn_backrefs | ||
MachO/index | ||
DTLTO |
This file contains hidden or 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,99 @@ | ||
# REQUIRES: x86 | ||
|
||
## Test that the LLD options --save-temps, --thinlto-emit-index-files, | ||
## and --thinlto-emit-imports-files function correctly with DTLTO. | ||
|
||
RUN: rm -rf %t && split-file %s %t && cd %t | ||
|
||
RUN: sed 's/@t1/@t2/g' t1.ll > t2.ll | ||
|
||
## Generate ThinLTO bitcode files. Note that t3.bc will not be used by the | ||
## linker. | ||
RUN: opt -thinlto-bc t1.ll -o t1.bc | ||
RUN: opt -thinlto-bc t2.ll -o t2.bc | ||
RUN: cp t1.bc t3.bc | ||
|
||
## Generate object files for mock.py to return. | ||
RUN: llc t1.ll --filetype=obj -o t1.o | ||
RUN: llc t2.ll --filetype=obj -o t2.o | ||
|
||
## Create response file containing shared ThinLTO linker arguments. | ||
## --start-lib/--end-lib is used to test the special case where unused lazy | ||
## bitcode inputs result in empty index/imports files. | ||
## Note that mock.py does not do any compilation; instead, it simply writes | ||
## the contents of the object files supplied on the command line into the | ||
## output object files in job order. | ||
RUN: echo "t1.bc t2.bc --start-lib t3.bc --end-lib -o my.elf \ | ||
RUN: --thinlto-distributor=%python \ | ||
RUN: --thinlto-distributor-arg=%llvm_src_root/utils/dtlto/mock.py \ | ||
RUN: --thinlto-distributor-arg=t1.o \ | ||
RUN: --thinlto-distributor-arg=t2.o" > l.rsp | ||
|
||
## Check that without extra flags, no index/imports files are produced and | ||
## backend temp files are removed. | ||
RUN: ld.lld @l.rsp | ||
RUN: ls | FileCheck %s \ | ||
RUN: --check-prefixes=NOBACKEND,NOINDEXFILES,NOIMPORTSFILES,NOEMPTYIMPORTS | ||
|
||
## Check that index files are created with --thinlto-emit-index-files. | ||
RUN: rm -f *.imports *.thinlto.bc | ||
RUN: ld.lld @l.rsp --thinlto-emit-index-files | ||
RUN: ls | sort | FileCheck %s \ | ||
RUN: --check-prefixes=NOBACKEND,INDEXFILES,NOIMPORTSFILES,NOEMPTYIMPORTS | ||
|
||
## Check that imports files are created with --thinlto-emit-imports-files. | ||
RUN: rm -f *.imports *.thinlto.bc | ||
RUN: ld.lld @l.rsp --thinlto-emit-imports-files | ||
RUN: ls | sort | FileCheck %s \ | ||
RUN: --check-prefixes=NOBACKEND,NOINDEXFILES,IMPORTSFILES,NOEMPTYIMPORTS | ||
|
||
## Check that both index and imports files are emitted with both flags. | ||
RUN: rm -f *.imports *.thinlto.bc | ||
RUN: ld.lld @l.rsp --thinlto-emit-index-files \ | ||
RUN: --thinlto-emit-imports-files | ||
RUN: ls | sort | FileCheck %s \ | ||
RUN: --check-prefixes=NOBACKEND,INDEXFILES,IMPORTSFILES,EMPTYIMPORTS | ||
|
||
## Check that backend temp files are retained with --save-temps. | ||
RUN: rm -f *.imports *.thinlto.bc | ||
RUN: ld.lld @l.rsp --save-temps | ||
RUN: ls | sort | FileCheck %s \ | ||
RUN: --check-prefixes=BACKEND,NOINDEXFILES,NOIMPORTSFILES,NOEMPTYIMPORTS | ||
|
||
## Check that all files are emitted when all options are enabled. | ||
RUN: rm -f *.imports *.thinlto.bc | ||
RUN: ld.lld @l.rsp --save-temps --thinlto-emit-index-files \ | ||
RUN: --thinlto-emit-imports-files | ||
RUN: ls | sort | FileCheck %s \ | ||
RUN: --check-prefixes=BACKEND,INDEXFILES,IMPORTSFILES,EMPTYIMPORTS | ||
|
||
## JSON jobs description, retained with --save-temps. | ||
## Note that DTLTO temporary files include a PID component. | ||
NOBACKEND-NOT: {{^}}my.[[#]].dist-file.json{{$}} | ||
BACKEND: {{^}}my.[[#]].dist-file.json{{$}} | ||
|
||
## Index/imports files for t1.bc. | ||
NOIMPORTSFILES-NOT: {{^}}t1.bc.imports{{$}} | ||
IMPORTSFILES: {{^}}t1.bc.imports{{$}} | ||
NOINDEXFILES-NOT: {{^}}t1.bc.thinlto.bc{{$}} | ||
INDEXFILES: {{^}}t1.bc.thinlto.bc{{$}} | ||
|
||
## Index/imports files for t2.bc. | ||
NOIMPORTSFILES-NOT: {{^}}t2.bc.imports{{$}} | ||
IMPORTSFILES: {{^}}t2.bc.imports{{$}} | ||
NOINDEXFILES-NOT: {{^}}t2.bc.thinlto.bc{{$}} | ||
INDEXFILES: {{^}}t2.bc.thinlto.bc{{$}} | ||
|
||
## Empty index/imports files for unused t3.bc. | ||
NOEMPTYIMPORTS-NOT: {{^}}t3.bc.imports{{$}} | ||
EMPTYIMPORTS: {{^}}t3.bc.imports{{$}} | ||
NOINDEXFILES-NOT: {{^}}t3.bc.thinlto.bc{{$}} | ||
INDEXFILES: {{^}}t3.bc.thinlto.bc{{$}} | ||
|
||
#--- t1.ll | ||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
define void @t1() { | ||
ret void | ||
} |
This file contains hidden or 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,40 @@ | ||
# REQUIRES: x86 | ||
|
||
## Test that DTLTO options are passed correctly to the distributor and | ||
## remote compiler. | ||
|
||
RUN: rm -rf %t && split-file %s %t && cd %t | ||
|
||
RUN: opt -thinlto-bc foo.ll -o foo.o | ||
|
||
## Note: validate.py does not perform any compilation. Instead, it validates the | ||
## received JSON, pretty-prints the JSON and the supplied arguments, and then | ||
## exits with an error. This allows FileCheck directives to verify the | ||
## distributor inputs. | ||
RUN: not ld.lld foo.o \ | ||
RUN: -o my.elf \ | ||
RUN: --thinlto-distributor=%python \ | ||
RUN: --thinlto-distributor-arg=%llvm_src_root/utils/dtlto/validate.py \ | ||
RUN: --thinlto-distributor-arg=darg1=10 \ | ||
RUN: --thinlto-distributor-arg=darg2=20 \ | ||
RUN: --thinlto-remote-compiler=my_clang.exe \ | ||
RUN: --thinlto-remote-compiler-arg=carg1=20 \ | ||
RUN: --thinlto-remote-compiler-arg=carg2=30 2>&1 | FileCheck %s | ||
|
||
CHECK: distributor_args=['darg1=10', 'darg2=20'] | ||
|
||
CHECK: "linker_output": "my.elf" | ||
|
||
CHECK: "my_clang.exe" | ||
CHECK: "carg1=20" | ||
CHECK: "carg2=30" | ||
|
||
CHECK: error: DTLTO backend compilation: cannot open native object file: | ||
|
||
#--- foo.ll | ||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
define void @foo() { | ||
ret void | ||
} |
This file contains hidden or 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,40 @@ | ||
# REQUIRES: x86 | ||
|
||
## Test that DTLTO works with more than one LTO partition. | ||
|
||
RUN: rm -rf %t && split-file %s %t && cd %t | ||
|
||
RUN: sed 's/@f/@t1/g' f.ll > t1.ll | ||
RUN: sed 's/@f/@t2/g' f.ll > t2.ll | ||
|
||
## Generate bitcode. | ||
RUN: opt f.ll -o full.bc | ||
RUN: opt -thinlto-bc t1.ll -o thin1.bc | ||
RUN: opt -thinlto-bc t2.ll -o thin2.bc | ||
|
||
## Generate object files for mock.py to return. | ||
RUN: llc t1.ll --filetype=obj -o thin1.o | ||
RUN: llc t2.ll --filetype=obj -o thin2.o | ||
|
||
## Link with 3 LTO partitions. | ||
RUN: ld.lld full.bc thin1.bc thin2.bc \ | ||
RUN: --thinlto-distributor=%python \ | ||
RUN: --thinlto-distributor-arg=%llvm_src_root/utils/dtlto/mock.py \ | ||
RUN: --thinlto-distributor-arg=thin1.o \ | ||
RUN: --thinlto-distributor-arg=thin2.o \ | ||
RUN: --save-temps \ | ||
RUN: --lto-partitions=3 | ||
|
||
## DTLTO temporary object files include the task number and a PID component. The | ||
## task number should incorporate the LTO partition number. | ||
RUN: ls | sort | FileCheck %s | ||
CHECK: {{^}}thin1.3.[[PID:[a-zA-Z0-9_]+]].native.o{{$}} | ||
CHECK: {{^}}thin2.4.[[PID]].native.o{{$}} | ||
|
||
#--- f.ll | ||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" | ||
target triple = "x86_64-unknown-linux-gnu" | ||
|
||
define void @f() { | ||
ret void | ||
} |
This file contains hidden or 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
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I grepped this variable.
clang does it in a different way. Do you know the difference?
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The line in
lit.site.cfg.py.in
just sets thelit
config variableconfig.llvm_src_root
. This is also done inLLD
:llvm-project/lld/test/lit.site.cfg.py.in
Line 6 in d59e0ba
lit
tests. TheClang
tests add substitution based off this value here:llvm-project/clang/test/utils/update_cc_test_checks/lit.local.cfg
Line 45 in d59e0ba