[PATCH] D117246: [OpenMP] Add support for linking AMDGPU images
Joseph Huber via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 31 20:12:31 PST 2022
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGce16ca3c7419: [OpenMP] Add support for linking AMDGPU images (authored by jhuber6).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D117246/new/
https://reviews.llvm.org/D117246
Files:
clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
Index: clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
===================================================================
--- clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
+++ clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
@@ -501,7 +501,7 @@
// Create a new file to write the linked device image to.
SmallString<128> TempFile;
if (std::error_code EC = sys::fs::createTemporaryFile(
- TheTriple.getArchName() + "-" + Arch, "cubin", TempFile))
+ "lto-" + TheTriple.getArchName() + "-" + Arch, "cubin", TempFile))
return createFileError(TempFile, EC);
TempFiles.push_back(static_cast<std::string>(TempFile));
@@ -576,6 +576,50 @@
return static_cast<std::string>(TempFile);
}
} // namespace nvptx
+namespace amdgcn {
+Expected<std::string> link(ArrayRef<std::string> InputFiles,
+ ArrayRef<std::string> LinkerArgs, Triple TheTriple,
+ StringRef Arch) {
+ // AMDGPU uses the lld binary to link device object files.
+ ErrorOr<std::string> LLDPath =
+ sys::findProgramByName("lld", sys::path::parent_path(LinkerExecutable));
+ if (!LLDPath)
+ LLDPath = sys::findProgramByName("lld");
+ if (!LLDPath)
+ return createStringError(LLDPath.getError(),
+ "Unable to find 'lld' in path");
+
+ // Create a new file to write the linked device image to.
+ SmallString<128> TempFile;
+ if (std::error_code EC = sys::fs::createTemporaryFile(
+ TheTriple.getArchName() + "-" + Arch + "-image", "out", TempFile))
+ return createFileError(TempFile, EC);
+ TempFiles.push_back(static_cast<std::string>(TempFile));
+
+ SmallVector<StringRef, 16> CmdArgs;
+ CmdArgs.push_back(*LLDPath);
+ CmdArgs.push_back("-flavor");
+ CmdArgs.push_back("gnu");
+ CmdArgs.push_back("--no-undefined");
+ CmdArgs.push_back("-shared");
+ CmdArgs.push_back("-o");
+ CmdArgs.push_back(TempFile);
+
+ // Copy system library paths used by the host linker.
+ for (StringRef Arg : LinkerArgs)
+ if (Arg.startswith("-L"))
+ CmdArgs.push_back(Arg);
+
+ // Add extracted input files.
+ for (StringRef Input : InputFiles)
+ CmdArgs.push_back(Input);
+
+ if (sys::ExecuteAndWait(*LLDPath, CmdArgs))
+ return createStringError(inconvertibleErrorCode(), "'lld' failed");
+
+ return static_cast<std::string>(TempFile);
+}
+} // namespace amdgcn
Expected<std::string> linkDevice(ArrayRef<std::string> InputFiles,
ArrayRef<std::string> LinkerArgs,
@@ -585,7 +629,7 @@
case Triple::nvptx64:
return nvptx::link(InputFiles, LinkerArgs, TheTriple, Arch);
case Triple::amdgcn:
- // TODO: AMDGCN linking support.
+ return amdgcn::link(InputFiles, LinkerArgs, TheTriple, Arch);
case Triple::x86:
case Triple::x86_64:
// TODO: x86 linking support.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D117246.404794.patch
Type: text/x-patch
Size: 2856 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220201/e6e11bab/attachment.bin>
More information about the cfe-commits
mailing list