[PATCH] D141543: [LinkerWrapper] Emit assembly files from LTO with `save-temps`
Joseph Huber via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 11 13:16:17 PST 2023
jhuber6 created this revision.
jhuber6 added reviewers: jdoerfert, JonChesterfield, arsenm, tianshilei1992.
Herald added a subscriber: inglorion.
Herald added a project: All.
jhuber6 requested review of this revision.
Herald added subscribers: cfe-commits, wdng.
Herald added a project: clang.
Currently in LTO mode we don't emit any `.s` files for non-NVPTX targets
during LTO. This makes it diffcult to investigate any failures in the
assembly. This patch makes the save-temps mode output an assembly file
and then assembles it separately. I decided to simply invoke `clang` for
this as it would be a lot of effort to invoke the `MCStramer` interface
directly.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D141543
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
@@ -510,6 +510,43 @@
}
}
+Expected<StringRef> assemble(StringRef InputFile, const ArgList &Args) {
+ llvm::TimeTraceScope TimeScope("Clang Assembler");
+ // Use `clang` to invoke the generic assembler.
+ Expected<std::string> ClangPath =
+ findProgram("clang", {getMainExecutable("clang")});
+ if (!ClangPath)
+ return ClangPath.takeError();
+
+ const llvm::Triple Triple(Args.getLastArgValue(OPT_triple_EQ));
+ StringRef Arch = Args.getLastArgValue(OPT_arch_EQ);
+ // Create a new file to write the linked device image to. Assume that the
+ // input filename already has the device and architecture.
+ auto TempFileOrErr = createOutputFile(sys::path::stem(InputFile), "o");
+ if (!TempFileOrErr)
+ return TempFileOrErr.takeError();
+
+ SmallVector<StringRef, 16> CmdArgs;
+ StringRef OptLevel = Args.getLastArgValue(OPT_opt_level, "O2");
+ CmdArgs.push_back(*ClangPath);
+ CmdArgs.push_back("-o");
+ CmdArgs.push_back(*TempFileOrErr);
+ CmdArgs.push_back("-fPIC");
+ CmdArgs.push_back("-c");
+ CmdArgs.push_back(Args.MakeArgString("--target=" + Triple.getTriple()));
+ CmdArgs.push_back(Args.MakeArgString("-" + OptLevel));
+ if (Triple.isAMDGPU())
+ CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
+ else
+ CmdArgs.push_back(Args.MakeArgString("-march=" + Arch));
+ CmdArgs.push_back(InputFile);
+
+ if (Error Err = executeCommands(*ClangPath, CmdArgs))
+ return std::move(Err);
+
+ return *TempFileOrErr;
+}
+
Expected<StringRef> link(ArrayRef<StringRef> InputFiles, const ArgList &Args) {
llvm::TimeTraceScope TimeScope("Generic linker");
const llvm::Triple Triple(Args.getLastArgValue(OPT_triple_EQ));
@@ -685,7 +722,8 @@
};
}
Conf.PostOptModuleHook = Hook;
- Conf.CGFileType = Triple.isNVPTX() ? CGFT_AssemblyFile : CGFT_ObjectFile;
+ Conf.CGFileType =
+ (Triple.isNVPTX() || SaveTemps) ? CGFT_AssemblyFile : CGFT_ObjectFile;
// TODO: Handle remark files
Conf.HasWholeProgramVisibility = Args.hasArg(OPT_whole_program);
@@ -852,7 +890,7 @@
const Twine &ModuleName) -> std::unique_ptr<CachedFileStream> {
int FD = -1;
auto &TempFile = Files[Task];
- StringRef Extension = (Triple.isNVPTX()) ? "s" : "o";
+ StringRef Extension = (Triple.isNVPTX() || SaveTemps) ? "s" : "o";
std::string TaskStr = Task ? "." + std::to_string(Task) : "";
auto TempFileOrErr =
createOutputFile(sys::path::filename(ExecutableName) + "-device-" +
@@ -885,9 +923,12 @@
}
// Is we are compiling for NVPTX we need to run the assembler first.
- if (Triple.isNVPTX()) {
+ if (Triple.isNVPTX() || SaveTemps) {
for (StringRef &File : Files) {
- auto FileOrErr = nvptx::assemble(File, Args, !SingleOutput);
+
+ auto FileOrErr = Triple.isNVPTX()
+ ? nvptx::assemble(File, Args, !SingleOutput)
+ : generic::assemble(File, Args);
if (!FileOrErr)
return FileOrErr.takeError();
File = *FileOrErr;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D141543.488359.patch
Type: text/x-patch
Size: 3254 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230111/8fd714ee/attachment.bin>
More information about the cfe-commits
mailing list