This patch introduces support for Integrated Distributed ThinLTO (DTLTO) in ELF LLD. DTLTO enables the distribution of ThinLTO backend compilations via external distribution systems, such as Incredibuild, during the traditional link step: https://llvm.org/docs/DTLTO.html. It is expected that users will invoke DTLTO through the compiler driver (e.g., Clang) rather than calling LLD directly. A Clang-side interface for DTLTO will be added in a follow-up patch. Note: Bitcode members of archives (thin or non-thin) are not currently supported. This will be addressed in a future change. As a consequence of this lack of support, this patch is not sufficient to allow for self-hosting an LLVM build with DTLTO. Theoretically, --start-lib/--end-lib could be used instead of archives in a self-host build. However, it's unclear how --start-lib/--end-lib can be easily used with the LLVM build system. Testing: - ELF LLD `lit` test coverage has been added, using a mock distributor to avoid requiring Clang. - Cross-project `lit` tests cover integration with Clang. For the design discussion of the DTLTO feature, see: #126654.
41 lines
1.2 KiB
Plaintext
41 lines
1.2 KiB
Plaintext
# 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
|
|
}
|