[llvm] [DTLTO][LLVM] Integrated Distributed ThinLTO (DTLTO) (PR #127749)
Teresa Johnson via llvm-commits
llvm-commits at lists.llvm.org
Fri May 16 09:54:07 PDT 2025
================
@@ -2142,3 +2182,322 @@ std::vector<int> lto::generateModulesOrdering(ArrayRef<BitcodeModule *> R) {
});
return ModulesOrdering;
}
+
+namespace {
+// For this out-of-process backend no codegen is done when invoked for each
+// task. Instead we generate the required information (e.g. the summary index
+// shard, import list, etc..) to allow for the codegen to be performed
+// externally (similar to WriteIndexesThinBackend). This backend's `wait`
+// function then invokes an external distributor process to do backend
+// compilations.
+class OutOfProcessThinBackend : public CGThinBackend {
+ using SString = SmallString<128>;
+
+ BumpPtrAllocator Alloc;
+ StringSaver Saver{Alloc};
+
+ SString LinkerOutputFile;
+
+ SString DistributorPath;
+ ArrayRef<StringRef> DistributorArgs;
+
+ SString RemoteCompiler;
+ ArrayRef<StringRef> RemoteCompilerArgs;
+
+ bool SaveTemps;
+
+ SmallVector<StringRef, 0> CodegenOptions;
+ DenseSet<StringRef> CommonInputs;
+
+ // Information specific to individual backend compilation job.
+ struct Job {
+ unsigned Task;
+ StringRef ModuleID;
+ StringRef NativeObjectPath;
+ StringRef SummaryIndexPath;
+ ImportsFilesContainer ImportFiles;
+ };
+ // The set of backend compilations jobs.
+ SmallVector<Job> Jobs;
+
+ // A unique string to identify the current link.
+ SmallString<8> UID;
+
+ // The offset to the first ThinLTO task.
+ unsigned ThinLTOTaskOffset;
+
+ // The target triple to supply for backend compilations.
+ StringRef Triple;
+
+public:
+ OutOfProcessThinBackend(
+ const Config &Conf, ModuleSummaryIndex &CombinedIndex,
+ ThreadPoolStrategy ThinLTOParallelism,
+ const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
+ AddStreamFn AddStream, lto::IndexWriteCallback OnWrite,
+ bool ShouldEmitIndexFiles, bool ShouldEmitImportsFiles,
+ StringRef LinkerOutputFile, StringRef Distributor,
+ ArrayRef<StringRef> DistributorArgs, StringRef RemoteCompiler,
+ ArrayRef<StringRef> RemoteCompilerArgs, bool SaveTemps)
+ : CGThinBackend(Conf, CombinedIndex, ModuleToDefinedGVSummaries,
+ AddStream, OnWrite, ShouldEmitIndexFiles,
+ ShouldEmitImportsFiles, ThinLTOParallelism),
+ LinkerOutputFile(LinkerOutputFile), DistributorPath(Distributor),
+ DistributorArgs(DistributorArgs), RemoteCompiler(RemoteCompiler),
+ RemoteCompilerArgs(RemoteCompilerArgs), SaveTemps(SaveTemps) {}
+
+ virtual void setup(unsigned ThinLTONumTasks, unsigned ThinLTOTaskOffset,
+ StringRef Triple) override {
+ UID = itostr(sys::Process::getProcessId());
+ Jobs.resize((size_t)ThinLTONumTasks);
+ this->ThinLTOTaskOffset = ThinLTOTaskOffset;
+ this->Triple = Triple;
+ }
+
+ Error start(
+ unsigned Task, BitcodeModule BM,
+ const FunctionImporter::ImportMapTy &ImportList,
+ const FunctionImporter::ExportSetTy &ExportList,
+ const std::map<GlobalValue::GUID, GlobalValue::LinkageTypes> &ResolvedODR,
+ MapVector<StringRef, BitcodeModule> &ModuleMap) override {
+
+ StringRef ModulePath = BM.getModuleIdentifier();
+
+ SString ObjFilePath = sys::path::parent_path(LinkerOutputFile);
+ sys::path::append(ObjFilePath, sys::path::stem(ModulePath) + "." +
+ itostr(Task) + "." + UID + ".native.o");
+
+ Job &J = Jobs[Task - ThinLTOTaskOffset];
+ J = {Task,
+ ModulePath,
+ Saver.save(ObjFilePath.str()),
+ Saver.save(ObjFilePath.str() + ".thinlto.bc"),
+ {}};
----------------
teresajohnson wrote:
Add a comment that this is filled in by emitFiles below
https://github.com/llvm/llvm-project/pull/127749
More information about the llvm-commits
mailing list