[clang] [AMDGPU] Use the AMDGPUToolChain when targeting C/C++ directly (PR #99687)
Joseph Huber via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 19 12:14:13 PDT 2024
https://github.com/jhuber6 created https://github.com/llvm/llvm-project/pull/99687
Summary:
The `getToolChain` pass uses the triple to determine which toolchain to
create. Currently the `amdgcn-amd-amdhsa` triple maps to the
`ROCmToolChain` which uses things expected to be provided by `ROCm`.
This is neded for OpenCL, but directly targeting C++ does not want this
since it's primarily being used for creating GPU runtime code. As far as
I know I'm the only user of this, so this shouldn't change anything.
Unfortunately, there's no good logic for detercting this, so I simply
checked ahead of time if the input is either `foo.cl` or `-x cl foo.c`
to choose between the two. This allows us to use the AMDGPU target
normally, as otherwise it will error without passing `-nogpulib`.
>From 28aa0aa20cd0ec1ff439d0adc1df73ededf46f86 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Fri, 19 Jul 2024 14:07:18 -0500
Subject: [PATCH] [AMDGPU] Use the AMDGPUToolChain when targeting C/C++
directly
Summary:
The `getToolChain` pass uses the triple to determine which toolchain to
create. Currently the `amdgcn-amd-amdhsa` triple maps to the
`ROCmToolChain` which uses things expected to be provided by `ROCm`.
This is neded for OpenCL, but directly targeting C++ does not want this
since it's primarily being used for creating GPU runtime code. As far as
I know I'm the only user of this, so this shouldn't change anything.
Unfortunately, there's no good logic for detercting this, so I simply
checked ahead of time if the input is either `foo.cl` or `-x cl foo.c`
to choose between the two. This allows us to use the AMDGPU target
normally, as otherwise it will error without passing `-nogpulib`.
---
clang/lib/Driver/Driver.cpp | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 8e44d5afa40e0..7bd78846766b8 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -6404,9 +6404,20 @@ 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 IsOpenCL = llvm::any_of(
+ Args.filtered(options::OPT_INPUT, options::OPT_x), [](auto &Arg) {
+ if (Arg->getOption().matches(options::OPT_INPUT))
+ return StringRef(Arg->getValue()).ends_with(".cl");
+ return StringRef(Arg->getValue()).ends_with("cl");
+ });
+ TC =
+ IsOpenCL
+ ? 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);
More information about the cfe-commits
mailing list