llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Joseph Huber (jhuber6) <details> <summary>Changes</summary> 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! ``` --- Full diff: https://github.com/llvm/llvm-project/pull/112025.diff 4 Files Affected: - (modified) clang/include/clang/Driver/Options.td (+3) - (modified) clang/lib/Driver/ToolChains/AMDGPU.cpp (+9) - (modified) clang/lib/Driver/ToolChains/Cuda.cpp (+9) - (added) clang/test/Driver/gpustartfiles.c (+7) ``````````diff 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" `````````` </details> https://github.com/llvm/llvm-project/pull/112025 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits