[clang] 980a461 - clang: Consolidate -aux-triple handling (#196551)
via cfe-commits
cfe-commits at lists.llvm.org
Fri May 8 10:50:39 PDT 2026
Author: Matt Arsenault
Date: 2026-05-08T18:50:35+01:00
New Revision: 980a4619fc78bc07ecd3577c31673861ce408f9d
URL: https://github.com/llvm/llvm-project/commit/980a4619fc78bc07ecd3577c31673861ce408f9d
DIFF: https://github.com/llvm/llvm-project/commit/980a4619fc78bc07ecd3577c31673861ce408f9d.diff
LOG: clang: Consolidate -aux-triple handling (#196551)
All of the offload languages were essentially doing the
same thing, with overcomplicated conditions conditional on
the language.
Added:
Modified:
clang/include/clang/Driver/Action.h
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/Driver/sycl-offload-jit-xarch.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Driver/Action.h b/clang/include/clang/Driver/Action.h
index dbf1187da4db9..67937b00f6bcf 100644
--- a/clang/include/clang/Driver/Action.h
+++ b/clang/include/clang/Driver/Action.h
@@ -96,6 +96,9 @@ class Action {
OFK_OpenMP = 0x04,
OFK_HIP = 0x08,
OFK_SYCL = 0x10,
+
+ OFK_DeviceFirst = OFK_Cuda,
+ OFK_DeviceLast = OFK_SYCL
};
static const char *getClassName(ActionClass AC);
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index bdffa4fdd7e6b..92b3045dceff2 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -4997,18 +4997,9 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
}
}
- const llvm::Triple *AuxTriple =
- (IsCuda || IsHIP || IsSYCL) ? TC.getAuxTriple() : nullptr;
- bool IsWindowsMSVC = RawTriple.isWindowsMSVCEnvironment();
bool IsUEFI = RawTriple.isUEFI();
bool IsIAMCU = RawTriple.isOSIAMCU();
- // Adjust IsWindowsXYZ for CUDA/HIP/SYCL compilations. Even when compiling in
- // device mode (i.e., getToolchain().getTriple() is NVPTX/AMDGCN, not
- // Windows), we need to pass Windows-specific flags to cc1.
- if (IsCuda || IsHIP || IsSYCL)
- IsWindowsMSVC |= AuxTriple && AuxTriple->isWindowsMSVCEnvironment();
-
// C++ is not supported for IAMCU.
if (IsIAMCU && types::isCXX(Input.getType()))
D.Diag(diag::err_drv_clang_unsupported) << "C++ for IAMCU";
@@ -5022,6 +5013,34 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
CmdArgs.push_back("-triple");
CmdArgs.push_back(Args.MakeArgStringRef(TripleStr));
+ bool IsWindowsMSVC = RawTriple.isWindowsMSVCEnvironment();
+
+ const llvm::Triple *AuxTriple = TC.getAuxTriple();
+ if (AuxTriple) {
+ CmdArgs.push_back("-aux-triple");
+ CmdArgs.push_back(Args.MakeArgStringRef(AuxTriple->str()));
+
+ // Adjust IsWindowsXYZ for CUDA/HIP/SYCL compilations. Even when compiling
+ // in device mode (i.e., getToolchain().getTriple() is NVPTX/AMDGCN, not
+ // Windows), we need to pass Windows-specific flags to cc1.
+ IsWindowsMSVC |= AuxTriple->isWindowsMSVCEnvironment();
+ } else if (JA.getOffloadingHostActiveKinds() != Action::OFK_None) {
+ // Figure out the device side triple for the host-side compilation.
+ for (unsigned I = Action::OFK_DeviceFirst; I <= Action::OFK_DeviceLast;
+ ++I) {
+ Compilation::const_offload_toolchains_range OffloadToolChains =
+ C.getOffloadToolChains(static_cast<Action::OffloadKind>(I));
+ if (OffloadToolChains.first == OffloadToolChains.second)
+ continue;
+
+ const llvm::Triple &DeviceAuxTriple =
+ OffloadToolChains.first->second->getTriple();
+ CmdArgs.push_back("-aux-triple");
+ CmdArgs.push_back(Args.MakeArgStringRef(DeviceAuxTriple.str()));
+ break;
+ }
+ }
+
if (const Arg *MJ = Args.getLastArg(options::OPT_MJ)) {
DumpCompilationDatabase(C, MJ->getValue(), TripleStr, Output, Input, Args);
Args.ClaimAllArgs(options::OPT_MJ);
@@ -5032,38 +5051,17 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Args.ClaimAllArgs(options::OPT_gen_cdb_fragment_path);
}
- if (IsCuda || IsHIP) {
- CmdArgs.push_back("-aux-triple");
-
- // We have to pass the triple of the host if compiling for a CUDA/HIP device
- // and vice-versa.
- if (IsCudaDevice || IsHIPDevice) {
- StringRef AuxTripleStr =
- C.getSingleOffloadToolChain<Action::OFK_Host>()->getTriple().str();
- CmdArgs.push_back(Args.MakeArgStringRef(AuxTripleStr));
- } else {
- // Host-side compilation.
- StringRef AuxTripleStr =
- (IsCuda ? C.getOffloadToolChains(Action::OFK_Cuda).first->second
- : C.getOffloadToolChains(Action::OFK_HIP).first->second)
- ->getTriple()
- .str();
- CmdArgs.push_back(Args.MakeArgStringRef(AuxTripleStr));
- }
-
- if (JA.isDeviceOffloading(Action::OFK_HIP) &&
- (getToolChain().getTriple().isAMDGPU() ||
- (getToolChain().getTriple().isSPIRV() &&
- getToolChain().getTriple().getVendor() == llvm::Triple::AMD))) {
- // Device side compilation printf
- if (Args.getLastArg(options::OPT_mprintf_kind_EQ)) {
- CmdArgs.push_back(Args.MakeArgString(
- "-mprintf-kind=" +
- Args.getLastArgValue(options::OPT_mprintf_kind_EQ)));
- // Force compiler error on invalid conversion specifiers
- CmdArgs.push_back(
- Args.MakeArgStringRef("-Werror=format-invalid-specifier"));
- }
+ if ((getToolChain().getTriple().isAMDGPU() ||
+ (getToolChain().getTriple().isSPIRV() &&
+ getToolChain().getTriple().getVendor() == llvm::Triple::AMD))) {
+ // Device side compilation printf
+ if (Args.getLastArg(options::OPT_mprintf_kind_EQ)) {
+ CmdArgs.push_back(Args.MakeArgString(
+ "-mprintf-kind=" +
+ Args.getLastArgValue(options::OPT_mprintf_kind_EQ)));
+ // Force compiler error on invalid conversion specifiers
+ CmdArgs.push_back(
+ Args.MakeArgStringRef("-Werror=format-invalid-specifier"));
}
}
@@ -5095,12 +5093,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
if (IsSYCL) {
if (IsSYCLDevice) {
- // Host triple is needed when doing SYCL device compilations.
- llvm::Triple AuxT = C.getDefaultToolChain().getTriple();
- std::string NormalizedTriple = AuxT.normalize();
- CmdArgs.push_back("-aux-triple");
- CmdArgs.push_back(Args.MakeArgString(NormalizedTriple));
-
// We want to compile sycl kernels.
CmdArgs.push_back("-fsycl-is-device");
@@ -6150,12 +6142,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
// Prepare `-aux-target-cpu` and `-aux-target-feature` unless
// `--gpu-use-aux-triple-only` is specified.
- if (!Args.getLastArg(options::OPT_gpu_use_aux_triple_only) &&
- (IsCudaDevice || IsHIPDevice || IsSYCLDevice)) {
+ if (AuxTriple && !Args.getLastArg(options::OPT_gpu_use_aux_triple_only)) {
const ArgList &HostArgs =
C.getArgsForToolChain(nullptr, StringRef(), Action::OFK_None);
- std::string HostCPU =
- getCPUName(D, HostArgs, *TC.getAuxTriple(), /*FromAs*/ false);
+ std::string HostCPU = getCPUName(D, HostArgs, *AuxTriple, /*FromAs*/ false);
if (!HostCPU.empty()) {
CmdArgs.push_back("-aux-target-cpu");
CmdArgs.push_back(Args.MakeArgString(HostCPU));
diff --git a/clang/test/Driver/sycl-offload-jit-xarch.cpp b/clang/test/Driver/sycl-offload-jit-xarch.cpp
index e8a685f50fe84..53af2b16a33f1 100644
--- a/clang/test/Driver/sycl-offload-jit-xarch.cpp
+++ b/clang/test/Driver/sycl-offload-jit-xarch.cpp
@@ -4,7 +4,7 @@
// and clang-linker-wrapper call.
// RUN: %clang -fsycl --offload-targets=spirv64-unknown-unknown -Xarch_spirv64 -O3 -### %s 2>&1 \
// RUN: | FileCheck -check-prefix=SYCL-DEVICE-O3 %s
-// SYCL-DEVICE-O3: "-triple" "spirv64-unknown-unknown" "-O3"{{.*}} "-fsycl-is-device"
+// SYCL-DEVICE-O3: "-triple" "spirv64-unknown-unknown" "-aux-triple" "{{.*}}" "-O3"{{.*}} "-fsycl-is-device"
// SYCL-DEVICE-O3: {{"[^"]*clang-linker-wrapper[^"]*".* "--device-compiler=spirv64-unknown-unknown=-O3"}}
// Verify that `-Xarch_spirv64` forwards libraries to the device linker.
More information about the cfe-commits
mailing list