Skip to content

Commit 60e07a9

Browse files
committed
[AMDGPU][OpenMP] Use llvm-link to link ocml libraries
This fixes the 'unused linker option: -lm' warning when compiling program with -c. Reviewed By: JonChesterfield Differential Revision: https://reviews.llvm.org/D107952
1 parent bae9527 commit 60e07a9

File tree

3 files changed

+35
-32
lines changed

3 files changed

+35
-32
lines changed

clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,34 @@ static bool checkSystemForAMDGPU(const ArgList &Args, const AMDGPUToolChain &TC,
8686
} // namespace
8787

8888
const char *AMDGCN::OpenMPLinker::constructLLVMLinkCommand(
89-
Compilation &C, const JobAction &JA, const InputInfoList &Inputs,
90-
const ArgList &Args, StringRef SubArchName,
91-
StringRef OutputFilePrefix) const {
89+
const toolchains::AMDGPUOpenMPToolChain &AMDGPUOpenMPTC, Compilation &C,
90+
const JobAction &JA, const InputInfoList &Inputs, const ArgList &Args,
91+
StringRef SubArchName, StringRef OutputFilePrefix) const {
9292
ArgStringList CmdArgs;
9393

9494
for (const auto &II : Inputs)
9595
if (II.isFilename())
9696
CmdArgs.push_back(II.getFilename());
97+
98+
if (Args.hasArg(options::OPT_l)) {
99+
auto Lm = Args.getAllArgValues(options::OPT_l);
100+
bool HasLibm = false;
101+
for (auto &Lib : Lm) {
102+
if (Lib == "m") {
103+
HasLibm = true;
104+
break;
105+
}
106+
}
107+
108+
if (HasLibm) {
109+
SmallVector<std::string, 12> BCLibs =
110+
AMDGPUOpenMPTC.getCommonDeviceLibNames(Args, SubArchName.str());
111+
llvm::for_each(BCLibs, [&](StringRef BCFile) {
112+
CmdArgs.push_back(Args.MakeArgString(BCFile));
113+
});
114+
}
115+
}
116+
97117
// Add an intermediate output file.
98118
CmdArgs.push_back("-o");
99119
const char *OutputFileName =
@@ -182,8 +202,8 @@ void AMDGCN::OpenMPLinker::ConstructJob(Compilation &C, const JobAction &JA,
182202
assert(Prefix.length() && "no linker inputs are files ");
183203

184204
// Each command outputs different files.
185-
const char *LLVMLinkCommand =
186-
constructLLVMLinkCommand(C, JA, Inputs, Args, GPUArch, Prefix);
205+
const char *LLVMLinkCommand = constructLLVMLinkCommand(
206+
AMDGPUOpenMPTC, C, JA, Inputs, Args, GPUArch, Prefix);
187207

188208
// Produce readable assembly if save-temps is enabled.
189209
if (C.getDriver().isSaveTempsEnabled())
@@ -234,27 +254,6 @@ void AMDGPUOpenMPToolChain::addClangTargetOptions(
234254

235255
addOpenMPDeviceRTL(getDriver(), DriverArgs, CC1Args, BitcodeSuffix,
236256
getTriple());
237-
238-
if (!DriverArgs.hasArg(options::OPT_l))
239-
return;
240-
241-
auto Lm = DriverArgs.getAllArgValues(options::OPT_l);
242-
bool HasLibm = false;
243-
for (auto &Lib : Lm) {
244-
if (Lib == "m") {
245-
HasLibm = true;
246-
break;
247-
}
248-
}
249-
250-
if (HasLibm) {
251-
SmallVector<std::string, 12> BCLibs =
252-
getCommonDeviceLibNames(DriverArgs, GPUArch);
253-
llvm::for_each(BCLibs, [&](StringRef BCFile) {
254-
CC1Args.push_back("-mlink-builtin-bitcode");
255-
CC1Args.push_back(DriverArgs.MakeArgString(BCFile));
256-
});
257-
}
258257
}
259258

260259
llvm::opt::DerivedArgList *AMDGPUOpenMPToolChain::TranslateArgs(

clang/lib/Driver/ToolChains/AMDGPUOpenMP.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
namespace clang {
1717
namespace driver {
1818

19+
namespace toolchains {
20+
class AMDGPUOpenMPToolChain;
21+
}
22+
1923
namespace tools {
2024

2125
namespace AMDGCN {
@@ -35,11 +39,11 @@ class LLVM_LIBRARY_VISIBILITY OpenMPLinker : public Tool {
3539

3640
private:
3741
/// \return llvm-link output file name.
38-
const char *constructLLVMLinkCommand(Compilation &C, const JobAction &JA,
39-
const InputInfoList &Inputs,
40-
const llvm::opt::ArgList &Args,
41-
llvm::StringRef SubArchName,
42-
llvm::StringRef OutputFilePrefix) const;
42+
const char *constructLLVMLinkCommand(
43+
const toolchains::AMDGPUOpenMPToolChain &AMDGPUOpenMPTC, Compilation &C,
44+
const JobAction &JA, const InputInfoList &Inputs,
45+
const llvm::opt::ArgList &Args, llvm::StringRef SubArchName,
46+
llvm::StringRef OutputFilePrefix) const;
4347

4448
/// \return llc output file name.
4549
const char *constructLlcCommand(Compilation &C, const JobAction &JA,

clang/test/Driver/amdgpu-openmp-toolchain.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,4 @@
7676
// CHECK-EMIT-LLVM-IR: clang{{.*}}"-cc1"{{.*}}"-triple" "amdgcn-amd-amdhsa"{{.*}}"-emit-llvm"
7777

7878
// RUN: env LIBRARY_PATH=%S/Inputs/hip_dev_lib %clang -### -target x86_64-pc-linux-gnu -fopenmp -fopenmp-targets=amdgcn-amd-amdhsa -Xopenmp-target=amdgcn-amd-amdhsa -march=gfx803 -lm --rocm-device-lib-path=%S/Inputs/rocm/amdgcn/bitcode %s 2>&1 | FileCheck %s --check-prefix=CHECK-LIB-DEVICE
79-
// CHECK-LIB-DEVICE: clang{{.*}}"-cc1"{{.*}}"-triple" "amdgcn-amd-amdhsa"{{.*}}"-mlink-builtin-bitcode"{{.*}}libomptarget-amdgcn-gfx803.bc"{{.*}}"-mlink-builtin-bitcode"{{.*}}ocml.bc" "-mlink-builtin-bitcode"{{.*}}ockl.bc" "-mlink-builtin-bitcode"{{.*}}oclc_daz_opt_on.bc" "-mlink-builtin-bitcode"{{.*}}oclc_unsafe_math_off.bc" "-mlink-builtin-bitcode"{{.*}}oclc_finite_only_off.bc" "-mlink-builtin-bitcode"{{.*}}oclc_correctly_rounded_sqrt_on.bc" "-mlink-builtin-bitcode"{{.*}}oclc_wavefrontsize64_on.bc" "-mlink-builtin-bitcode"{{.*}}oclc_isa_version_803.bc"
79+
// CHECK-LIB-DEVICE: {{.*}}llvm-link{{.*}}ocml.bc"{{.*}}ockl.bc"{{.*}}oclc_daz_opt_on.bc"{{.*}}oclc_unsafe_math_off.bc"{{.*}}oclc_finite_only_off.bc"{{.*}}oclc_correctly_rounded_sqrt_on.bc"{{.*}}oclc_wavefrontsize64_on.bc"{{.*}}oclc_isa_version_803.bc"

0 commit comments

Comments
 (0)