[llvm] r325819 - [ThinLTO] Always create linked objects file for --thinlto-index-only=
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 22 11:06:15 PST 2018
Author: vitalybuka
Date: Thu Feb 22 11:06:15 2018
New Revision: 325819
URL: http://llvm.org/viewvc/llvm-project?rev=325819&view=rev
Log:
[ThinLTO] Always create linked objects file for --thinlto-index-only=
Summary:
ThinLTO indexing may decide to skip all objects. If we don't write something to
the list build system may consider this as failure or linker can reuse a file
from the previews build.
Reviewers: pcc, tejohnson
Subscribers: mehdi_amini, inglorion, eraman, hiraditya, llvm-commits
Differential Revision: https://reviews.llvm.org/D43415
Added:
llvm/trunk/test/tools/gold/X86/thinlto_no_objects.ll
Modified:
llvm/trunk/include/llvm/LTO/LTO.h
llvm/trunk/lib/LTO/LTO.cpp
llvm/trunk/tools/gold/gold-plugin.cpp
llvm/trunk/tools/llvm-lto2/llvm-lto2.cpp
Modified: llvm/trunk/include/llvm/LTO/LTO.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/LTO/LTO.h?rev=325819&r1=325818&r2=325819&view=diff
==============================================================================
--- llvm/trunk/include/llvm/LTO/LTO.h (original)
+++ llvm/trunk/include/llvm/LTO/LTO.h Thu Feb 22 11:06:15 2018
@@ -210,13 +210,15 @@ ThinBackend createInProcessThinBackend(u
/// appends ".thinlto.bc" and writes the index to that path. If
/// ShouldEmitImportsFiles is true it also writes a list of imported files to a
/// similar path with ".imports" appended instead.
+/// LinkedObjectsFile is an output stream to write the list of object files for
+/// the final ThinLTO linking. Can be nullptr.
/// OnWrite is callback which receives module identifier and notifies LTO user
/// that index file for the module (and optionally imports file) was created.
using IndexWriteCallback = std::function<void(const std::string &)>;
ThinBackend createWriteIndexesThinBackend(std::string OldPrefix,
std::string NewPrefix,
bool ShouldEmitImportsFiles,
- std::string LinkedObjectsFile,
+ raw_fd_ostream *LinkedObjectsFile,
IndexWriteCallback OnWrite);
/// This class implements a resolution-based interface to LLVM's LTO
Modified: llvm/trunk/lib/LTO/LTO.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTO.cpp?rev=325819&r1=325818&r2=325819&view=diff
==============================================================================
--- llvm/trunk/lib/LTO/LTO.cpp (original)
+++ llvm/trunk/lib/LTO/LTO.cpp Thu Feb 22 11:06:15 2018
@@ -1038,10 +1038,7 @@ namespace {
class WriteIndexesThinBackend : public ThinBackendProc {
std::string OldPrefix, NewPrefix;
bool ShouldEmitImportsFiles;
-
- std::string LinkedObjectsFileName;
- std::unique_ptr<llvm::raw_fd_ostream> LinkedObjectsFile;
-
+ raw_fd_ostream *LinkedObjectsFile;
lto::IndexWriteCallback OnWrite;
public:
@@ -1049,11 +1046,11 @@ public:
Config &Conf, ModuleSummaryIndex &CombinedIndex,
const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries,
std::string OldPrefix, std::string NewPrefix, bool ShouldEmitImportsFiles,
- std::string LinkedObjectsFileName, lto::IndexWriteCallback OnWrite)
+ raw_fd_ostream *LinkedObjectsFile, lto::IndexWriteCallback OnWrite)
: ThinBackendProc(Conf, CombinedIndex, ModuleToDefinedGVSummaries),
OldPrefix(OldPrefix), NewPrefix(NewPrefix),
ShouldEmitImportsFiles(ShouldEmitImportsFiles),
- LinkedObjectsFileName(LinkedObjectsFileName), OnWrite(OnWrite) {}
+ LinkedObjectsFile(LinkedObjectsFile), OnWrite(OnWrite) {}
Error start(
unsigned Task, BitcodeModule BM,
@@ -1065,21 +1062,14 @@ public:
std::string NewModulePath =
getThinLTOOutputFile(ModulePath, OldPrefix, NewPrefix);
- std::error_code EC;
- if (!LinkedObjectsFileName.empty()) {
- if (!LinkedObjectsFile) {
- LinkedObjectsFile = llvm::make_unique<raw_fd_ostream>(
- LinkedObjectsFileName, EC, sys::fs::OpenFlags::F_None);
- if (EC)
- return errorCodeToError(EC);
- }
+ if (LinkedObjectsFile)
*LinkedObjectsFile << NewModulePath << '\n';
- }
std::map<std::string, GVSummaryMapTy> ModuleToSummariesForIndex;
gatherImportedSummariesForModule(ModulePath, ModuleToDefinedGVSummaries,
ImportList, ModuleToSummariesForIndex);
+ std::error_code EC;
raw_fd_ostream OS(NewModulePath + ".thinlto.bc", EC,
sys::fs::OpenFlags::F_None);
if (EC)
@@ -1101,11 +1091,9 @@ public:
};
} // end anonymous namespace
-ThinBackend lto::createWriteIndexesThinBackend(std::string OldPrefix,
- std::string NewPrefix,
- bool ShouldEmitImportsFiles,
- std::string LinkedObjectsFile,
- IndexWriteCallback OnWrite) {
+ThinBackend lto::createWriteIndexesThinBackend(
+ std::string OldPrefix, std::string NewPrefix, bool ShouldEmitImportsFiles,
+ raw_fd_ostream *LinkedObjectsFile, IndexWriteCallback OnWrite) {
return [=](Config &Conf, ModuleSummaryIndex &CombinedIndex,
const StringMap<GVSummaryMapTy> &ModuleToDefinedGVSummaries,
AddStreamFn AddStream, NativeObjectCache Cache) {
Added: llvm/trunk/test/tools/gold/X86/thinlto_no_objects.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/gold/X86/thinlto_no_objects.ll?rev=325819&view=auto
==============================================================================
--- llvm/trunk/test/tools/gold/X86/thinlto_no_objects.ll (added)
+++ llvm/trunk/test/tools/gold/X86/thinlto_no_objects.ll Thu Feb 22 11:06:15 2018
@@ -0,0 +1,18 @@
+; Check that thinlto-index-only= always creates linked objects file, even
+; if nothing to add there.
+
+; Non-ThinLTO file should not get into list of linked objects.
+; RUN: opt %s -o %t.o
+
+; RUN: rm -f %t3
+; RUN: %gold -plugin %llvmshlibdir/LLVMgold%shlibext \
+; RUN: --plugin-opt=thinlto \
+; RUN: --plugin-opt=thinlto-index-only=%t3 \
+; RUN: -o %t5 \
+; RUN: %t.o
+
+; RUN: cat %t3 | count 0
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
Modified: llvm/trunk/tools/gold/gold-plugin.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/gold/gold-plugin.cpp?rev=325819&r1=325818&r2=325819&view=diff
==============================================================================
--- llvm/trunk/tools/gold/gold-plugin.cpp (original)
+++ llvm/trunk/tools/gold/gold-plugin.cpp Thu Feb 22 11:06:15 2018
@@ -736,7 +736,12 @@ static void getThinLTOOldAndNewPrefix(st
std::tie(OldPrefix, NewPrefix) = PrefixReplace.split(';');
}
-static std::unique_ptr<LTO> createLTO(IndexWriteCallback OnIndexWrite) {
+/// Creates instance of LTO.
+/// OnIndexWrite is callback to let caller know when LTO writes index files.
+/// LinkedObjectsFile is an output stream to write the list of object files for
+/// the final ThinLTO linking. Can be nullptr.
+static std::unique_ptr<LTO> createLTO(IndexWriteCallback OnIndexWrite,
+ raw_fd_ostream *LinkedObjectsFile) {
Config Conf;
ThinBackend Backend;
@@ -760,9 +765,9 @@ static std::unique_ptr<LTO> createLTO(In
if (options::thinlto_index_only) {
std::string OldPrefix, NewPrefix;
getThinLTOOldAndNewPrefix(OldPrefix, NewPrefix);
- Backend = createWriteIndexesThinBackend(
- OldPrefix, NewPrefix, options::thinlto_emit_imports_files,
- options::thinlto_linked_objects_file, OnIndexWrite);
+ Backend = createWriteIndexesThinBackend(OldPrefix, NewPrefix,
+ options::thinlto_emit_imports_files,
+ LinkedObjectsFile, OnIndexWrite);
}
Conf.OverrideTriple = options::triple;
@@ -844,6 +849,21 @@ static void writeEmptyDistributedBuildOu
}
}
+// Creates and returns output stream with a list of object files for final
+// linking of distributed ThinLTO.
+static std::unique_ptr<raw_fd_ostream> CreateLinkedObjectsFile() {
+ if (options::thinlto_linked_objects_file.empty())
+ return nullptr;
+ assert(options::thinlto_index_only);
+ std::error_code EC;
+ auto LinkedObjectsFile = llvm::make_unique<raw_fd_ostream>(
+ options::thinlto_linked_objects_file, EC, sys::fs::OpenFlags::F_None);
+ if (EC)
+ message(LDPL_FATAL, "Failed to create '%s': %s",
+ options::thinlto_linked_objects_file.c_str(), EC.message().c_str());
+ return LinkedObjectsFile;
+}
+
/// Runs LTO and return a list of pairs <FileName, IsTemporary>.
static std::vector<std::pair<SmallString<128>, bool>> runLTO() {
// Map to own RAII objects that manage the file opening and releasing
@@ -856,10 +876,12 @@ static std::vector<std::pair<SmallString
// Owns string objects and tells if index file was already created.
StringMap<bool> ObjectToIndexFileState;
- std::unique_ptr<LTO> Lto =
- createLTO([&ObjectToIndexFileState](const std::string &Identifier) {
+ std::unique_ptr<raw_fd_ostream> LinkedObjects = CreateLinkedObjectsFile();
+ std::unique_ptr<LTO> Lto = createLTO(
+ [&ObjectToIndexFileState](const std::string &Identifier) {
ObjectToIndexFileState[Identifier] = true;
- });
+ },
+ LinkedObjects.get());
std::string OldPrefix, NewPrefix;
if (options::thinlto_index_only)
Modified: llvm/trunk/tools/llvm-lto2/llvm-lto2.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-lto2/llvm-lto2.cpp?rev=325819&r1=325818&r2=325819&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-lto2/llvm-lto2.cpp (original)
+++ llvm/trunk/tools/llvm-lto2/llvm-lto2.cpp Thu Feb 22 11:06:15 2018
@@ -243,7 +243,11 @@ static int run(int argc, char **argv) {
ThinBackend Backend;
if (ThinLTODistributedIndexes)
- Backend = createWriteIndexesThinBackend("", "", true, "", {});
+ Backend = createWriteIndexesThinBackend(/* OldPrefix */ "",
+ /* NewPrefix */ "",
+ /* ShouldEmitImportsFiles */ true,
+ /* LinkedObjectsFile */ nullptr,
+ /* OnWrite */ {});
else
Backend = createInProcessThinBackend(Threads);
LTO Lto(std::move(Conf), std::move(Backend));
More information about the llvm-commits
mailing list