[llvm] [DTLTO][LLVM] Integrated Distributed ThinLTO (DTLTO) (PR #127749)
via llvm-commits
llvm-commits at lists.llvm.org
Mon May 19 11:14:13 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"),
----------------
bd1976bris wrote:
For DTLTO, we need to use unique paths for these files so that two links that both use the same bitcode module can't collide. We want this to be handled automatically - without the user having to specify additional linking options. Can I ask how Bazel handles this situation?
https://github.com/llvm/llvm-project/pull/127749
More information about the llvm-commits
mailing list