[DTLTO] Add remote compiler option forwarding coverage (#208589)

Add a cross-project DTLTO test that checks the existing LTO
configuration state serialized into the remote Clang command line. The
test uses the validate.py distributor to inspect the generated DTLTO
JSON.

Cover all the existing forwarded options.

Add paired negative checks for optional flags so the test also verifies
they are not emitted when the corresponding configuration state is not
set.
This commit is contained in:
Ben Dunbobbin 2026-07-16 09:56:40 +01:00 committed by GitHub
parent 9c6a9f5fa3
commit c012610ab9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 91 additions and 0 deletions

View file

@ -26,6 +26,7 @@ set(CROSS_PROJECT_TEST_DEPS
llvm-config
llvm-dis
llvm-dwarfdump
llvm-lto2
llvm-modextract
llvm-objdump
not

View file

@ -0,0 +1,90 @@
REQUIRES: ld.lld
## Check that DTLTO passes LTO configuration to the remote Clang via the
## command line.
RUN: rm -rf %t && split-file %s %t && cd %t
RUN: %clang --target=x86_64-unknown-linux-gnu -flto=thin -c test.c -o elf.o
RUN: %clang --target=x86_64-pc-windows-msvc -flto=thin -c test.c -o coff.o
RUN: touch profile.prof
## The validate.py distributor prints the DTLTO JSON and then exits without
## producing native objects, so each llvm-lto2 command is expected to fail after
## the JSON has been emitted.
DEFINE: %{base} = not llvm-lto2 run \
DEFINE: -dtlto-distributor=%python \
DEFINE: -dtlto-distributor-arg=%llvm_src_root/utils/dtlto/validate.py \
DEFINE: -dtlto-compiler=%clang \
DEFINE: -o test.out
DEFINE: %{lld} = not ld.lld elf.o \
DEFINE: --thinlto-distributor=%python \
DEFINE: --thinlto-distributor-arg=%llvm_src_root/utils/dtlto/validate.py \
DEFINE: --thinlto-remote-compiler=%clang \
DEFINE: -o test.elf
DEFINE: %{lto2-elf} = %{base} elf.o -r=elf.o,foo,px
DEFINE: %{lto2-coff} = %{base} coff.o -r=coff.o,foo,px
ARGS: "args": [
## Optimization level.
RUN: %{lto2-elf} -O0 2>&1 | FileCheck %s --check-prefixes=ARGS,O0,ERR
RUN: %{lto2-elf} -O3 2>&1 | FileCheck %s --check-prefixes=ARGS,O3,ERR
O0: "-O0"
O3: "-O3"
## Address-significance table, function sections, and data sections.
RUN: %{lto2-elf} -addrsig -function-sections -data-sections 2>&1 | \
RUN: FileCheck %s --check-prefixes=ARGS,SECTIONS,ERR
SECTIONS: "-faddrsig"
SECTIONS: "-ffunction-sections"
SECTIONS: "-fdata-sections"
RUN: %{lto2-elf} 2>&1 | FileCheck %s --check-prefixes=ARGS,NO-SECTIONS,ERR
NO-SECTIONS-NOT: "-faddrsig"
NO-SECTIONS-NOT: "-ffunction-sections"
NO-SECTIONS-NOT: "-fdata-sections"
## PIC is forwarded as -fpic for ELF targets but not for COFF targets because
## Clang does not accept -fpic for every target.
RUN: %{lto2-elf} -relocation-model=pic 2>&1 | \
RUN: FileCheck %s --check-prefixes=ARGS,PIC,ERR
PIC: "-fpic"
RUN: %{lto2-elf} -relocation-model=static 2>&1 | \
RUN: FileCheck %s --check-prefixes=ARGS,NO-PIC,ERR
NO-PIC-NOT: "-fpic"
RUN: %{lto2-coff} -relocation-model=pic 2>&1 | \
RUN: FileCheck %s --check-prefixes=COFF-PIC,ERR
COFF-PIC-NOT: "-fpic"
## Sample profile forwarding and common-input serialization.
RUN: %{lto2-elf} -lto-sample-profile-file=profile.prof 2>&1 | \
RUN: FileCheck %s --check-prefixes=ARGS,SAMPLE,ERR
SAMPLE: "-fprofile-sample-use=profile.prof"
SAMPLE: "inputs": [
SAMPLE: "profile.prof"
RUN: %{lto2-elf} 2>&1 | FileCheck %s --check-prefixes=ARGS,NO-SAMPLE,ERR
NO-SAMPLE-NOT: "-fprofile-sample-use=profile.prof"
NO-SAMPLE-NOT: "profile.prof"
## PGO warning mismatch control is an LLD-driver option rather than an
## llvm-lto2 option, so check it through the ELF linker.
RUN: %{lld} --no-lto-pgo-warn-mismatch 2>&1 | \
RUN: FileCheck %s --check-prefixes=ARGS,PGO-WARN,ERR
PGO-WARN: "-mllvm"
PGO-WARN-NEXT: "-no-pgo-warn-mismatch"
RUN: %{lld} 2>&1 | \
RUN: FileCheck %s --check-prefixes=ARGS,NO-PGO-WARN,ERR
NO-PGO-WARN-NOT: "-no-pgo-warn-mismatch"
## Check for the expected error from the use of validate.py.
ERR: DTLTO backend compilation: cannot open native object file:
#--- test.c
void foo(void) {}