[clang] Reapply "[AMDGPU] Use the AMDGPUToolChain when targeting C/C++ directly" (PR #125744)
Joseph Huber via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 6 07:14:47 PST 2025
https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/125744
>From ce7701b7c95ee1e59c7942b23833a7a7336abfb7 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Tue, 4 Feb 2025 12:06:34 -0600
Subject: [PATCH] Reapply "[AMDGPU] Use the AMDGPUToolChain when targeting
C/C++ directly (#99687)"
Summary:
This reverts commit 740e6aeccdb2f8eeee549ba80b15ff3d5dd3392e.
After discussions it was determined that the behavior for IR inputs
needs to be maintained at least for now. In the future we should put a
deprecation notice on this behavior. This patch keeps the old beahvior
for OpenCL and IR inputs, while others will be standalone. This is good
enough for standard compile flows.
---
clang/lib/Driver/Driver.cpp | 21 ++++++++++++++++++--
clang/test/Driver/amdgpu-toolchain-opencl.cl | 5 +++++
clang/test/Driver/amdgpu-toolchain.c | 8 ++++++++
3 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 5a4737fb381e6a0..a91b8591bbd359b 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -146,6 +146,7 @@ getNVIDIAOffloadTargetTriple(const Driver &D, const ArgList &Args,
D.Diag(diag::err_drv_invalid_or_unsupported_offload_target) << TT->str();
return std::nullopt;
}
+
static std::optional<llvm::Triple>
getHIPOffloadTargetTriple(const Driver &D, const ArgList &Args) {
if (!Args.hasArg(options::OPT_offload_EQ)) {
@@ -168,6 +169,17 @@ getHIPOffloadTargetTriple(const Driver &D, const ArgList &Args) {
return std::nullopt;
}
+template <typename F> static bool usesInput(const ArgList &Args, F &&Fn) {
+ return llvm::any_of(Args, [&](Arg *A) {
+ return (A->getOption().matches(options::OPT_x) &&
+ Fn(types::lookupTypeForTypeSpecifier(A->getValue()))) ||
+ (A->getOption().getKind() == Option::InputClass &&
+ StringRef(A->getValue()).rfind('.') != StringRef::npos &&
+ Fn(types::lookupTypeForExtension(
+ &A->getValue()[StringRef(A->getValue()).rfind('.') + 1])));
+ });
+}
+
// static
std::string Driver::GetResourcesPath(StringRef BinaryPath) {
// Since the resource directory is embedded in the module hash, it's important
@@ -6673,9 +6685,14 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
case llvm::Triple::CUDA:
TC = std::make_unique<toolchains::NVPTXToolChain>(*this, Target, Args);
break;
- case llvm::Triple::AMDHSA:
- TC = std::make_unique<toolchains::ROCMToolChain>(*this, Target, Args);
+ case llvm::Triple::AMDHSA: {
+ bool DL =
+ usesInput(Args, types::isOpenCL) || usesInput(Args, types::isLLVMIR);
+ TC = DL ? std::make_unique<toolchains::ROCMToolChain>(*this, Target, Args)
+ : std::make_unique<toolchains::AMDGPUToolChain>(*this, Target,
+ Args);
break;
+ }
case llvm::Triple::AMDPAL:
case llvm::Triple::Mesa3D:
TC = std::make_unique<toolchains::AMDGPUToolChain>(*this, Target, Args);
diff --git a/clang/test/Driver/amdgpu-toolchain-opencl.cl b/clang/test/Driver/amdgpu-toolchain-opencl.cl
index 755d5e0ad8c502f..fb21301744b9151 100644
--- a/clang/test/Driver/amdgpu-toolchain-opencl.cl
+++ b/clang/test/Driver/amdgpu-toolchain-opencl.cl
@@ -35,3 +35,8 @@
// RUN: %clang -### --target=amdgcn-amd-amdhsa-opencl -x cl -c -emit-llvm -mcpu=fiji -nogpulib %s 2>&1 | FileCheck -check-prefix=CHECK-WARN-ATOMIC %s
// CHECK-WARN-ATOMIC: "-cc1"{{.*}} "-Werror=atomic-alignment"
+
+// RUN: %clang -### --target=amdgcn-amd-amdhsa -x cl -c -emit-llvm -mcpu=fiji %s 2>&1 \
+// RUN: -mcode-object-version=5 --rocm-device-lib-path=%S/Inputs/rocm/amdgcn/bitcode \
+// RUN: | FileCheck -check-prefix=DEVICE-LIBS %s
+// DEVICE-LIBS: "-mlink-builtin-bitcode" "[[ROCM_PATH:.+]]opencl.bc"
diff --git a/clang/test/Driver/amdgpu-toolchain.c b/clang/test/Driver/amdgpu-toolchain.c
index c1c5aa8e90e6868..f32940578251b51 100644
--- a/clang/test/Driver/amdgpu-toolchain.c
+++ b/clang/test/Driver/amdgpu-toolchain.c
@@ -36,3 +36,11 @@
// RUN: %clang -target amdgcn-amd-amdhsa -march=gfx90a -stdlib -startfiles \
// RUN: -nogpulib -nogpuinc -### %s 2>&1 | FileCheck -check-prefix=STARTUP %s
// STARTUP: ld.lld{{.*}}"-lc" "-lm" "{{.*}}crt1.o"
+
+// RUN: %clang -### --target=amdgcn-amd-amdhsa -mcpu=gfx906 %s 2>&1 | FileCheck -check-prefix=ROCM %s
+// ROCM-NOT: -mlink-builtin-bitcode
+
+// RUN: %clang -### --target=amdgcn-amd-amdhsa -mcpu=fiji -x ir %s \
+// RUN: --rocm-device-lib-path=%S/Inputs/rocm/amdgcn/bitcode 2>&1 \
+// RUN: | FileCheck -check-prefix=DEVICE-LIBS %s
+// DEVICE-LIBS: "-mlink-builtin-bitcode" "[[ROCM_PATH:.+]]ockl.bc"
More information about the cfe-commits
mailing list