Author: Yaxun (Sam) Liu Date: 2022-04-28T11:12:23-04:00 New Revision: 062317f72ebfc19b0f3733b4181bb09344707653
URL: https://github.com/llvm/llvm-project/commit/062317f72ebfc19b0f3733b4181bb09344707653 DIFF: https://github.com/llvm/llvm-project/commit/062317f72ebfc19b0f3733b4181bb09344707653.diff LOG: [HIP] Add HIP runtime library arguments for linker Add -L -l options for linker. Reviewed by: Artem Belevich Differential Revision: https://reviews.llvm.org/D124545 Added: clang/test/Driver/hip-runtime-libs-linux.hip clang/test/Driver/hip-runtime-libs-msvc.hip Modified: clang/include/clang/Driver/Options.td clang/include/clang/Driver/ToolChain.h clang/lib/Driver/ToolChains/CommonArgs.cpp clang/lib/Driver/ToolChains/CommonArgs.h clang/lib/Driver/ToolChains/Gnu.cpp clang/lib/Driver/ToolChains/Linux.cpp clang/lib/Driver/ToolChains/Linux.h clang/lib/Driver/ToolChains/MSVC.cpp clang/lib/Driver/ToolChains/MSVC.h Removed: ################################################################################ diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 780e814bef396..d2097427ed711 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -927,6 +927,8 @@ def cuda_gpu_arch_EQ : Joined<["--"], "cuda-gpu-arch=">, Flags<[NoXarchOption]>, Alias<offload_arch_EQ>; def hip_link : Flag<["--"], "hip-link">, HelpText<"Link clang-offload-bundler bundles for HIP">; +def no_hip_rt: Flag<["-"], "no-hip-rt">, + HelpText<"Do not link against HIP runtime libraries">; def no_offload_arch_EQ : Joined<["--"], "no-offload-arch=">, Flags<[NoXarchOption]>, HelpText<"Remove CUDA/HIP offloading device architecture (e.g. sm_35, gfx906) from the list of devices to compile for. " "'all' resets the list to its default value.">; diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index a3da1db2f15ef..5d95a644fde1a 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -696,6 +696,11 @@ class ToolChain { virtual llvm::SmallVector<BitCodeLibraryInfo, 12> getHIPDeviceLibs(const llvm::opt::ArgList &Args) const; + /// Add the system specific linker arguments to use + /// for the given HIP runtime library type. + virtual void AddHIPRuntimeLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const {} + /// Return sanitizers which are available in this toolchain. virtual SanitizerMask getSupportedSanitizers() const; diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 96a54228626f6..03a887a7527b7 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -2089,3 +2089,17 @@ void tools::addOpenMPDeviceRTL(const Driver &D, << LibOmpTargetName << ArchPrefix; } } +void tools::addHIPRuntimeLibArgs(const ToolChain &TC, + const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) { + if (Args.hasArg(options::OPT_hip_link) && + !Args.hasArg(options::OPT_nostdlib) && + !Args.hasArg(options::OPT_no_hip_rt)) { + TC.AddHIPRuntimeLibArgs(Args, CmdArgs); + } else { + // Claim "no HIP libraries" arguments if any + for (auto Arg : Args.filtered(options::OPT_no_hip_rt)) { + Arg->claim(); + } + } +} diff --git a/clang/lib/Driver/ToolChains/CommonArgs.h b/clang/lib/Driver/ToolChains/CommonArgs.h index 2bba1ee285e62..1c43cd329b85c 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.h +++ b/clang/lib/Driver/ToolChains/CommonArgs.h @@ -120,6 +120,9 @@ bool addOpenMPRuntime(llvm::opt::ArgStringList &CmdArgs, const ToolChain &TC, bool ForceStaticHostRuntime = false, bool IsOffloadingHost = false, bool GompNeedsRT = false); +void addHIPRuntimeLibArgs(const ToolChain &TC, const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs); + const char *getAsNeededOption(const ToolChain &TC, bool as_needed); llvm::opt::Arg *getLastProfileUseArg(const llvm::opt::ArgList &Args); diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index e0fcabc3e250a..183828dcaa734 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -580,6 +580,9 @@ void tools::gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA, bool NeedsXRayDeps = addXRayRuntime(ToolChain, Args, CmdArgs); addLinkerCompressDebugSectionsOption(ToolChain, Args, CmdArgs); AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs, JA); + + addHIPRuntimeLibArgs(ToolChain, Args, CmdArgs); + // The profile runtime also needs access to system libraries. getToolChain().addProfileRTLibs(Args, CmdArgs); diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 6be2e801d8361..a7c1cc0e22c50 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -676,6 +676,15 @@ void Linux::AddHIPIncludeArgs(const ArgList &DriverArgs, RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args); } +void Linux::AddHIPRuntimeLibArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + CmdArgs.append( + {Args.MakeArgString(StringRef("-L") + RocmInstallation.getLibPath()), + "-rpath", Args.MakeArgString(RocmInstallation.getLibPath())}); + + CmdArgs.push_back("-lamdhip64"); +} + void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { if (GCCInstallation.isValid()) { diff --git a/clang/lib/Driver/ToolChains/Linux.h b/clang/lib/Driver/ToolChains/Linux.h index a5648d79d655f..188cb1f097884 100644 --- a/clang/lib/Driver/ToolChains/Linux.h +++ b/clang/lib/Driver/ToolChains/Linux.h @@ -37,6 +37,8 @@ class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF { llvm::opt::ArgStringList &CC1Args) const override; void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + void AddHIPRuntimeLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const override; void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; RuntimeLibType GetDefaultRuntimeLibType() const override; diff --git a/clang/lib/Driver/ToolChains/MSVC.cpp b/clang/lib/Driver/ToolChains/MSVC.cpp index a470d44a50148..0ba034f4c9a7a 100644 --- a/clang/lib/Driver/ToolChains/MSVC.cpp +++ b/clang/lib/Driver/ToolChains/MSVC.cpp @@ -286,6 +286,8 @@ void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA, A.renderAsInput(Args, CmdArgs); } + addHIPRuntimeLibArgs(TC, Args, CmdArgs); + TC.addProfileRTLibs(Args, CmdArgs); std::vector<const char *> Environment; @@ -475,6 +477,13 @@ void MSVCToolChain::AddHIPIncludeArgs(const ArgList &DriverArgs, RocmInstallation.AddHIPIncludeArgs(DriverArgs, CC1Args); } +void MSVCToolChain::AddHIPRuntimeLibArgs(const ArgList &Args, + ArgStringList &CmdArgs) const { + CmdArgs.append({Args.MakeArgString(StringRef("-libpath:") + + RocmInstallation.getLibPath()), + "amdhip64.lib"}); +} + void MSVCToolChain::printVerboseInfo(raw_ostream &OS) const { CudaInstallation.print(OS); RocmInstallation.print(OS); diff --git a/clang/lib/Driver/ToolChains/MSVC.h b/clang/lib/Driver/ToolChains/MSVC.h index cedbca93e23b7..f09256ba124ec 100644 --- a/clang/lib/Driver/ToolChains/MSVC.h +++ b/clang/lib/Driver/ToolChains/MSVC.h @@ -96,6 +96,9 @@ class LLVM_LIBRARY_VISIBILITY MSVCToolChain : public ToolChain { void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override; + void AddHIPRuntimeLibArgs(const llvm::opt::ArgList &Args, + llvm::opt::ArgStringList &CmdArgs) const override; + bool getWindowsSDKLibraryPath( const llvm::opt::ArgList &Args, std::string &path) const; bool getUniversalCRTLibraryPath(const llvm::opt::ArgList &Args, diff --git a/clang/test/Driver/hip-runtime-libs-linux.hip b/clang/test/Driver/hip-runtime-libs-linux.hip new file mode 100644 index 0000000000000..641e676c523a4 --- /dev/null +++ b/clang/test/Driver/hip-runtime-libs-linux.hip @@ -0,0 +1,43 @@ +// UNSUPPORTED: system-windows + +// RUN: touch %t.o + +// Test HIP runtime lib args specified by --rocm-path. +// RUN: %clang -### --hip-link -target x86_64-linux-gnu \ +// RUN: --rocm-path=%S/Inputs/rocm %t.o 2>&1 \ +// RUN: | FileCheck -check-prefixes=ROCM-PATH %s + +// Test HIP runtime lib args specified by environment variable ROCM_PATH. +// RUN: env ROCM_PATH=%S/Inputs/rocm %clang -### --hip-link \ +// RUN: -target x86_64-linux-gnu %t.o 2>&1 \ +// RUN: | FileCheck -check-prefixes=ROCM-PATH %s + +// Test detecting latest /opt/rocm-{release} directory. +// RUN: rm -rf %T/opt +// RUN: mkdir -p %T/opt +// RUN: cp -r %S/Inputs/rocm %T/opt/rocm-3.9.0-1234 +// RUN: cp -r %S/Inputs/rocm %T/opt/rocm-3.10.0 +// RUN: %clang -### --hip-link -target x86_64-linux-gnu \ +// RUN: --sysroot=%T %t.o 2>&1 \ +// RUN: | FileCheck -check-prefixes=ROCM-REL %s + +// Test HIP runtime lib is not linked without --hip-link. +// RUN: %clang -### -target x86_64-linux-gnu \ +// RUN: --rocm-path=%S/Inputs/rocm %t.o 2>&1 \ +// RUN: | FileCheck -check-prefixes=NOHIPRT %s + +// Test HIP runtime lib is not linked with -nostdlib. +// RUN: %clang -### --hip-link -nostdlib -target x86_64-linux-gnu \ +// RUN: --rocm-path=%S/Inputs/rocm %t.o 2>&1 \ +// RUN: | FileCheck -check-prefixes=NOHIPRT %s + +// Test HIP runtime lib is not linked with -no-hip-rt. +// RUN: %clang -### --hip-link -no-hip-rt -target x86_64-linux-gnu \ +// RUN: --rocm-path=%S/Inputs/rocm %t.o 2>&1 \ +// RUN: | FileCheck -check-prefixes=NOHIPRT %s + +// ROCM-PATH: "-L[[HIPRT:.*/Inputs/rocm/lib]]" "-rpath" "[[HIPRT]]" "-lamdhip64" +// ROCM-REL: "-L[[HIPRT:.*/opt/rocm-3.10.0/lib]]" "-rpath" "[[HIPRT]]" "-lamdhip64" +// NOHIPRT-NOT: "-L{{.*/Inputs/rocm/lib}}" +// NOHIPRT-NOT: "-rpath" "{{.*/Inputs/rocm/lib}}" +// NOHIPRT-NOT: "-lamdhip64" diff --git a/clang/test/Driver/hip-runtime-libs-msvc.hip b/clang/test/Driver/hip-runtime-libs-msvc.hip new file mode 100644 index 0000000000000..e907d534d9e94 --- /dev/null +++ b/clang/test/Driver/hip-runtime-libs-msvc.hip @@ -0,0 +1,10 @@ +// REQUIRES: system-windows + +// RUN: touch %t.o + +// Test HIP runtime lib args specified by --rocm-path. +// RUN: %clang -### --hip-link -target x86_64-pc-windows-msvc \ +// RUN: --rocm-path=%S/Inputs/rocm %t.o 2>&1 \ +// RUN: | FileCheck %s + +// CHECK: "-libpath:{{.*Inputs.*rocm.*lib}}" "amdhip64.lib" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits