[llvm] [LTO] Fix a crash with thin LTO caching and asm output (PR #138203)
Alexey Karyakin via llvm-commits
llvm-commits at lists.llvm.org
Mon May 12 12:56:38 PDT 2025
================
@@ -439,27 +439,33 @@ static void codegen(const Config &Conf, TargetMachine *TM,
std::unique_ptr<CachedFileStream> &Stream = *StreamOrErr;
TM->Options.ObjectFilenameForDebug = Stream->ObjectPathName;
- legacy::PassManager CodeGenPasses;
- TargetLibraryInfoImpl TLII(Mod.getTargetTriple());
- CodeGenPasses.add(new TargetLibraryInfoWrapperPass(TLII));
- // No need to make index available if the module is empty.
- // In theory these passes should not use the index for an empty
- // module, however, this guards against doing any unnecessary summary-based
- // analysis in the case of a ThinLTO build where this might be an empty
- // regular LTO combined module, with a large combined index from ThinLTO.
- if (!isEmptyModule(Mod))
- CodeGenPasses.add(
- createImmutableModuleSummaryIndexWrapperPass(&CombinedIndex));
- if (Conf.PreCodeGenPassesHook)
- Conf.PreCodeGenPassesHook(CodeGenPasses);
- if (TM->addPassesToEmitFile(CodeGenPasses, *Stream->OS,
- DwoOut ? &DwoOut->os() : nullptr,
- Conf.CGFileType))
- report_fatal_error("Failed to setup codegen");
- CodeGenPasses.run(Mod);
-
- if (DwoOut)
- DwoOut->keep();
+ // Create the LTO pipeline in its own scope so it gets deleted before
+ // Stream->commit() is called. The commit function of CacheFile deletes
----------------
quic-akaryaki wrote:
It seems to me that MCAsmStreamer should not call flush() on the stream because it's only given a pointer to a base class created by someone else and it does not know the semantics of the actual concrete object. It should be safe to assume that MCAsmStreamer only writes to the stream and the actual owner closes the stream when appropriate and makes sure that the writes make it to the underlying file. I'm not sure if CacheStream should close the stream or just flush it but closing it may be a protection against accidental writing after commit(). I will experiment with this.
https://github.com/llvm/llvm-project/pull/138203
More information about the llvm-commits
mailing list