[clang] [Clang] Add a flag to include GPU startup files (PR #112025)
Joseph Huber via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 11 10:28:11 PDT 2024
https://github.com/jhuber6 created https://github.com/llvm/llvm-project/pull/112025
Summary:
The C library for GPUs provides the ability to target regular C/C++
programs by providing the C library and a file containing kernels that
call the `main` function. This is mostly used for unit tests, this patch
provides a quick way to add them without needing to know the paths. I
currently do this explicitly, but according to the libc++ contributors
we don't want to need to specify these paths manually. See the
discussion in https://github.com/llvm/llvm-project/pull/104515.
I just default to `lib/` if the target-specific one isn't found because
the linker will handle giving a reasonable error message if it's not
found. Basically the use-case looks like this.
```console
$ clang test.c --target=amdgcn-amd-amdhsa -mcpu=native -gpustartfiles
$ amdhsa-loader a.out
PASS!
```
>From a014a06d5b06bb8c94b4d86636fb57f342e184db Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Fri, 11 Oct 2024 12:21:49 -0500
Subject: [PATCH] [Clang] Add a flag to include GPU startup files
Summary:
The C library for GPUs provides the ability to target regular C/C++
programs by providing the C library and a file containing kernels that
call the `main` function. This is mostly used for unit tests, this patch
provides a quick way to add them without needing to know the paths. I
currently do this explicitly, but according to the libc++ contributors
we don't want to need to specify these paths manually. See the
discussion in https://github.com/llvm/llvm-project/pull/104515.
I just default to `lib/` if the target-specific one isn't found because
the linker will handle giving a reasonable error message if it's not
found. Basically the use-case looks like this.
```console
$ clang test.c --target=amdgcn-amd-amdhsa -mcpu=native -gpustartfiles
$ amdhsa-loader a.out
PASS!
```
---
clang/include/clang/Driver/Options.td | 3 +++
clang/lib/Driver/ToolChains/AMDGPU.cpp | 9 +++++++++
clang/lib/Driver/ToolChains/Cuda.cpp | 9 +++++++++
clang/test/Driver/gpustartfiles.c | 7 +++++++
4 files changed, 28 insertions(+)
create mode 100644 clang/test/Driver/gpustartfiles.c
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index d306c751505e98..b7f7a7cb47f754 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1316,6 +1316,9 @@ defm offload_via_llvm : BoolFOption<"offload-via-llvm",
BothFlags<[], [ClangOption], " LLVM/Offload as portable offloading runtime.">>;
}
+def gpustartfiles : Flag<["-"], "gpustartfiles">, Group<Link_Group>,
+ HelpText<"Link the GPU C startup utilities automatically, used for testing.">;
+
// CUDA options
let Group = cuda_Group in {
def cuda_include_ptx_EQ : Joined<["--"], "cuda-include-ptx=">,
diff --git a/clang/lib/Driver/ToolChains/AMDGPU.cpp b/clang/lib/Driver/ToolChains/AMDGPU.cpp
index 2c85d21ebd738c..9a648be4ea3915 100644
--- a/clang/lib/Driver/ToolChains/AMDGPU.cpp
+++ b/clang/lib/Driver/ToolChains/AMDGPU.cpp
@@ -648,6 +648,15 @@ void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
Args.MakeArgString("-plugin-opt=-mattr=" + llvm::join(Features, ",")));
}
+ if (Args.hasArg(options::OPT_gpustartfiles)) {
+ auto IncludePath = getToolChain().getStdlibPath();
+ if (!IncludePath)
+ IncludePath = "/lib";
+ SmallString<128> P(*IncludePath);
+ llvm::sys::path::append(P, "crt1.o");
+ CmdArgs.append({"-lc", "-lm", Args.MakeArgString(P)});
+ }
+
CmdArgs.push_back("-o");
CmdArgs.push_back(Output.getFilename());
C.addCommand(std::make_unique<Command>(
diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp
index 7a70cf1c5694fd..ff96ff989db630 100644
--- a/clang/lib/Driver/ToolChains/Cuda.cpp
+++ b/clang/lib/Driver/ToolChains/Cuda.cpp
@@ -641,6 +641,15 @@ void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
CmdArgs.push_back(Args.MakeArgString(Twine("-L") + DefaultLibPath));
+ if (Args.hasArg(options::OPT_gpustartfiles)) {
+ auto IncludePath = getToolChain().getStdlibPath();
+ if (!IncludePath)
+ IncludePath = "/lib";
+ SmallString<128> P(*IncludePath);
+ llvm::sys::path::append(P, "crt1.o");
+ CmdArgs.append({"-lc", "-lm", Args.MakeArgString(P)});
+ }
+
C.addCommand(std::make_unique<Command>(
JA, *this,
ResponseFileSupport{ResponseFileSupport::RF_Full, llvm::sys::WEM_UTF8,
diff --git a/clang/test/Driver/gpustartfiles.c b/clang/test/Driver/gpustartfiles.c
new file mode 100644
index 00000000000000..c1b7a6fa922df4
--- /dev/null
+++ b/clang/test/Driver/gpustartfiles.c
@@ -0,0 +1,7 @@
+// RUN: %clang -target nvptx64-nvidia-cuda -march=sm_61 -gpustartfiles \
+// RUN: -nogpulib -nogpuinc -### %s 2>&1 | FileCheck -check-prefix=NVPTX %s
+// NVPTX: clang-nvlink-wrapper{{.*}}"-lc" "-lm" "{{.*}}crt1.o"
+//
+// RUN: %clang -target amdgcn-amd-amdhsa -march=gfx90a -gpustartfiles \
+// RUN: -nogpulib -nogpuinc -### %s 2>&1 | FileCheck -check-prefix=AMDGPU %s
+// AMDGPU: ld.lld{{.*}}"-lc" "-lm" "{{.*}}crt1.o"
More information about the cfe-commits
mailing list