[llvm] WIP - [DTLTO] Add remote compiler option forwarding coverage (PR #208589)
Ben Dunbobbin via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 9 17:02:01 PDT 2026
https://github.com/bd1976bris created https://github.com/llvm/llvm-project/pull/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.
>From cc3168480437dfd0ecfd13a5bcab752180646783 Mon Sep 17 00:00:00 2001
From: Ben <ben.dunbobbin at sony.com>
Date: Fri, 10 Jul 2026 00:58:30 +0100
Subject: [PATCH] Add DTLTO remote option forwarding coverage
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.
---
cross-project-tests/CMakeLists.txt | 1 +
cross-project-tests/dtlto/remote-options.test | 107 ++++++++++++++++++
2 files changed, 108 insertions(+)
create mode 100644 cross-project-tests/dtlto/remote-options.test
diff --git a/cross-project-tests/CMakeLists.txt b/cross-project-tests/CMakeLists.txt
index 4dab5d3d51fd6..85102065e79e6 100644
--- a/cross-project-tests/CMakeLists.txt
+++ b/cross-project-tests/CMakeLists.txt
@@ -26,6 +26,7 @@ set(CROSS_PROJECT_TEST_DEPS
llvm-config
llvm-dis
llvm-dwarfdump
+ llvm-lto2
llvm-modextract
llvm-objdump
not
diff --git a/cross-project-tests/dtlto/remote-options.test b/cross-project-tests/dtlto/remote-options.test
new file mode 100644
index 0000000000000..e6afd50901ddb
--- /dev/null
+++ b/cross-project-tests/dtlto/remote-options.test
@@ -0,0 +1,107 @@
+REQUIRES: x86-registered-target,ld.lld
+
+## Check that DTLTO serializes LTO configuration state into the remote Clang
+## command line.
+
+RUN: rm -rf %t && split-file %s %t && cd %t
+
+RUN: opt -thinlto-bc test.ll -o test.o
+RUN: opt -thinlto-bc coff.ll -o coff.o
+RUN: touch profile.prof
+
+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: %{command} = %{base} \
+DEFINE: test.o \
+DEFINE: -r=test.o,foo,px
+
+DEFINE: %{command-coff} = %{base} \
+DEFINE: coff.o \
+DEFINE: -r=coff.o,foo,px
+
+DEFINE: %{lld} = not ld.lld test.o \
+DEFINE: -o test.elf \
+DEFINE: --thinlto-distributor=%python \
+DEFINE: --thinlto-distributor-arg=%llvm_src_root/utils/dtlto/validate.py \
+DEFINE: --thinlto-remote-compiler=%clang
+
+ARGS: "args": [
+
+## Optimization level.
+RUN: %{command} -O0 2>&1 | FileCheck %s --check-prefixes=ARGS,O0,ERR
+RUN: %{command} -O3 2>&1 | FileCheck %s --check-prefixes=ARGS,O3,ERR
+O0: "-O0"
+O3: "-O3"
+
+## Address-significance table, function sections, and data sections.
+RUN: %{command} -addrsig -function-sections -data-sections 2>&1 | \
+RUN: FileCheck %s --check-prefixes=ARGS,SECTIONS,ERR
+SECTIONS: "-faddrsig"
+SECTIONS: "-ffunction-sections"
+SECTIONS: "-fdata-sections"
+
+RUN: %{command} 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: %{command} -relocation-model=pic 2>&1 | \
+RUN: FileCheck %s --check-prefixes=ARGS,PIC,ERR
+PIC: "-fpic"
+
+RUN: %{command} -relocation-model=static 2>&1 | \
+RUN: FileCheck %s --check-prefixes=ARGS,NO-PIC,ERR
+NO-PIC-NOT: "-fpic"
+
+RUN: %{command-coff} -relocation-model=pic -O3 2>&1 | \
+RUN: FileCheck %s --check-prefixes=COFF-PIC,ERR
+COFF-PIC-NOT: "-fpic"
+
+## Sample profile forwarding and common-input serialization.
+RUN: %{command} -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: %{command} 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"
+
+## 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. We check that we saw the expected failure mode
+## and not some other failure.
+ERR: DTLTO backend compilation: cannot open native object file:
+
+#--- test.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
+}
+
+#--- coff.ll
+target triple = "x86_64-pc-windows-msvc"
+
+define void @foo() {
+ ret void
+}
More information about the llvm-commits
mailing list