================ @@ -1,265 +1,311 @@ -//===- Dtlto.cpp - Distributed ThinLTO implementation --------------------===// +//===- DTLTO.cpp - Distributed ThinLTO implementation ---------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// -// // \file // This file implements support functions for Distributed ThinLTO, focusing on -// preparing input files for distribution. +// preparing complilation jobs for distribution. // //===----------------------------------------------------------------------===// #include "llvm/DTLTO/DTLTO.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" -#include "llvm/BinaryFormat/Magic.h" #include "llvm/LTO/LTO.h" -#include "llvm/Object/Archive.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBufferRef.h" #include "llvm/Support/Path.h" #include "llvm/Support/Process.h" -#include "llvm/Support/Signals.h" #include "llvm/Support/TimeProfiler.h" #include "llvm/Support/raw_ostream.h" -#ifdef _WIN32 -#include "llvm/Support/Windows/WindowsSupport.h" -#endif #include <string> using namespace llvm; -namespace { - -// Saves the content of Buffer to Path overwriting any existing file. -Error save(StringRef Buffer, StringRef Path) { - std::error_code EC; - raw_fd_ostream OS(Path.str(), EC, sys::fs::OpenFlags::OF_None); - if (EC) - return createStringError(inconvertibleErrorCode(), - "Failed to create file %s: %s", Path.data(), - EC.message().c_str()); - OS.write(Buffer.data(), Buffer.size()); - if (OS.has_error()) - return createStringError(inconvertibleErrorCode(), - "Failed writing to file %s", Path.data()); - return Error::success(); -} +// Remove temporary files created to enable distribution. +void lto::DTLTO::cleanup() { + if (!SaveTemps) { + // Remove one file, report error if any. + auto removeFile = [](StringRef FileName) -> void { + std::error_code EC = sys::fs::remove(FileName, true); + if (EC && + EC != std::make_error_code(std::errc::no_such_file_or_directory)) + errs() << "warning: could not remove the file '" << FileName + << "': " << EC.message() << "\n"; + }; -// Saves the content of Input to Path overwriting any existing file. -Error save(lto::InputFile *Input, StringRef Path) { - MemoryBufferRef MB = Input->getFileBuffer(); - return save(MB.getBuffer(), Path); + TimeTraceScope JobScope("Remove DTLTO temporary files"); + for (const auto &Name : CleanupList) + removeFile(Name); + } + Base::cleanup(); } -// Normalize and save a path. Aside from expanding Windows 8.3 short paths, -// no other normalization is currently required here. These paths are -// machine-local and break distribution systems; other normalization is -// handled by the DTLTO distributors. -Expected<StringRef> normalizePath(StringRef Path, StringSaver &Saver) { -#if defined(_WIN32) - if (Path.empty()) - return Path; - SmallString<256> Expanded; - if (std::error_code EC = llvm::sys::windows::makeLongFormPath(Path, Expanded)) - return createStringError(inconvertibleErrorCode(), - "Normalization failed for path %s: %s", - Path.str().c_str(), EC.message().c_str()); - return Saver.save(Expanded.str()); -#else - return Saver.save(Path); -#endif -} +// Runs the DTLTO thin link phase, producing per-module summary indices, +// import lists, and cache keys for distribution. +Error lto::DTLTO::performThinLink() { + auto ThinIndexBackend = lto::createWriteIndexesThinBackend( + hardware_concurrency(), "", "", "", true, nullptr, nullptr); + setThinBackend(ThinIndexBackend); + setLTOMode(lto::LTO::LTOKind::LTOK_UnifiedThin); -// Compute the file path for a thin archive member. -// -// For thin archives, an archive member name is typically a file path relative -// to the archive file's directory. This function resolves that path. -SmallString<256> computeThinArchiveMemberPath(StringRef ArchivePath, - StringRef MemberName) { - assert(!ArchivePath.empty() && "An archive file path must be non empty."); - SmallString<256> MemberPath; - if (sys::path::is_relative(MemberName)) { - MemberPath = sys::path::parent_path(ArchivePath); - sys::path::append(MemberPath, MemberName); - } else - MemberPath = MemberName; - sys::path::remove_dots(MemberPath, /*remove_dot_dot=*/true); - return MemberPath; + size_t NumTasks = getMaxTasks(); + SummaryIndexFiles.resize(NumTasks); + ImportsFilesLists.resize(NumTasks); + CacheKeysList.resize(NumTasks); + + lto::Config &Cfg = getConfig(); + Cfg.OnSummaryIndexStoreCb = + [&](size_t task) -> std::unique_ptr<raw_svector_ostream> { + return std::make_unique<raw_svector_ostream>(SummaryIndexFiles[task]); + }; + Cfg.OnCacheKeyStoreCb = [&](size_t task) -> std::string & { + return CacheKeysList[task]; + }; + Cfg.OnImportsListStoreCb = [&](size_t task) -> std::vector<std::string> & { ---------------- kbelochapka wrote:
Added the `if` statement that prevents the callback initialization if `ShouldEmitImportFiles` is false. https://github.com/llvm/llvm-project/pull/192629 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
