https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/100652
>From 5017fe0cc33af9b7731786122c21602258b51c9a Mon Sep 17 00:00:00 2001 From: Joseph Huber <hube...@outlook.com> Date: Thu, 25 Jul 2024 15:40:40 -0500 Subject: [PATCH 1/2] [Clang] Suppress missing architecture error when doing LTO Summary: The `nvlink-wrapper` can do LTO now, which means we can still create some LLVM-IR without needing an architecture. In the case that we try to invoke `nvlink` internally, that will still fail. This patch simply defers the error until later so we can use `--lto-emit-llvm` to get the IR without specifying an architecture. --- clang/lib/Driver/ToolChains/Cuda.cpp | 8 +++++--- clang/test/Driver/cuda-cross-compiling.c | 7 +++++++ clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp | 7 +++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp index e98e574d6cc2b..6e10e3d006767 100644 --- a/clang/lib/Driver/ToolChains/Cuda.cpp +++ b/clang/lib/Driver/ToolChains/Cuda.cpp @@ -596,14 +596,16 @@ void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-v"); StringRef GPUArch = Args.getLastArgValue(options::OPT_march_EQ); - if (GPUArch.empty()) { + if (GPUArch.empty() && !C.getDriver().isUsingLTO()) { C.getDriver().Diag(diag::err_drv_offload_missing_gpu_arch) << getToolChain().getArchName() << getShortName(); return; } - CmdArgs.push_back("-arch"); - CmdArgs.push_back(Args.MakeArgString(GPUArch)); + if (!GPUArch.empty()) { + CmdArgs.push_back("-arch"); + CmdArgs.push_back(Args.MakeArgString(GPUArch)); + } if (Args.hasArg(options::OPT_ptxas_path_EQ)) CmdArgs.push_back(Args.MakeArgString( diff --git a/clang/test/Driver/cuda-cross-compiling.c b/clang/test/Driver/cuda-cross-compiling.c index c2e538c25329e..5f24e7a5accb0 100644 --- a/clang/test/Driver/cuda-cross-compiling.c +++ b/clang/test/Driver/cuda-cross-compiling.c @@ -84,6 +84,13 @@ // MISSING: error: must pass in an explicit nvptx64 gpu architecture to 'ptxas' // MISSING: error: must pass in an explicit nvptx64 gpu architecture to 'nvlink' +// Do not error when performing LTO. +// +// RUN: %clang -target nvptx64-nvidia-cuda -flto %s -### 2>&1 \ +// RUN: | FileCheck -check-prefix=MISSING-LTO %s + +// MISSING-LTO-NOT: error: must pass in an explicit nvptx64 gpu architecture to 'nvlink' + // RUN: %clang -target nvptx64-nvidia-cuda -flto -c %s -### 2>&1 \ // RUN: | FileCheck -check-prefix=GENERIC %s // RUN: %clang -target nvptx64-nvidia-cuda -march=sm_52 -march=generic -flto -c %s -### 2>&1 \ diff --git a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp index 30c45eda66288..7851414ba7f4d 100644 --- a/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp +++ b/clang/tools/clang-nvlink-wrapper/ClangNVLinkWrapper.cpp @@ -302,6 +302,9 @@ Expected<StringRef> runPTXAs(StringRef File, const ArgList &Args) { findProgram(Args, "ptxas", {CudaPath + "/bin", GivenPath}); if (!PTXAsPath) return PTXAsPath.takeError(); + if (!Args.hasArg(OPT_arch)) + return createStringError( + "must pass in an explicit nvptx64 gpu architecture to 'ptxas'"); auto TempFileOrErr = createTempFile( Args, sys::path::stem(Args.getLastArgValue(OPT_o, "a.out")), "cubin"); @@ -694,6 +697,10 @@ Error runNVLink(ArrayRef<StringRef> Files, const ArgList &Args) { if (!NVLinkPath) return NVLinkPath.takeError(); + if (!Args.hasArg(OPT_arch)) + return createStringError( + "must pass in an explicit nvptx64 gpu architecture to 'nvlink'"); + ArgStringList NewLinkerArgs; for (const opt::Arg *Arg : Args) { // Do not forward arguments only intended for the linker wrapper. >From 287ff705c2af09ff20cb1a942ca2f3e05a717735 Mon Sep 17 00:00:00 2001 From: Joseph Huber <hube...@outlook.com> Date: Fri, 26 Jul 2024 16:41:29 -0500 Subject: [PATCH 2/2] Remove hacks from libc --- libc/cmake/modules/LLVMLibCLibraryRules.cmake | 2 +- libc/startup/gpu/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libc/cmake/modules/LLVMLibCLibraryRules.cmake b/libc/cmake/modules/LLVMLibCLibraryRules.cmake index ad931d445720d..0b1878d7b5222 100644 --- a/libc/cmake/modules/LLVMLibCLibraryRules.cmake +++ b/libc/cmake/modules/LLVMLibCLibraryRules.cmake @@ -113,7 +113,7 @@ function(add_bitcode_entrypoint_library target_name base_target_name) add_executable(${target_name} ${objects}) target_link_options(${target_name} PRIVATE - "-r" "-nostdlib" "-flto" "-Wl,--lto-emit-llvm" "-march= ") + "-r" "-nostdlib" "-flto" "-Wl,--lto-emit-llvm") endfunction(add_bitcode_entrypoint_library) # A rule to build a library from a collection of entrypoint objects. diff --git a/libc/startup/gpu/CMakeLists.txt b/libc/startup/gpu/CMakeLists.txt index 3830bf39916af..5e5745063fc8c 100644 --- a/libc/startup/gpu/CMakeLists.txt +++ b/libc/startup/gpu/CMakeLists.txt @@ -34,7 +34,7 @@ function(add_startup_object name) RUNTIME_OUTPUT_DIRECTORY ${LIBC_LIBRARY_DIR} RUNTIME_OUTPUT_NAME ${name}.o) target_link_options(${fq_target_name}.exe PRIVATE - "-nostdlib" "-flto" "-Wl,--lto-emit-llvm" "-march= ") + "-nostdlib" "-flto" "-Wl,--lto-emit-llvm") endif() endfunction() _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits