[clang] 062317f - [HIP] Add HIP runtime library arguments for linker
Yaxun Liu via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 28 08:12:32 PDT 2022
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"
More information about the cfe-commits
mailing list