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 <hube...@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); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits