mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[ThinLTO] Do metadata linking during batch function importing
Summary: Since we are currently not doing incremental importing there is no need to link metadata as a postpass. The module linker will only link in the imported subroutines due to the functionality added by r256003. (Note that the metadata postpass linking functionalitiy is still used by llvm-link, and may be needed here in the future if a more incremental strategy is adopted.) Reviewers: joker.eph Subscribers: joker.eph, llvm-commits Differential Revision: http://reviews.llvm.org/D16424 llvm-svn: 258458
This commit is contained in:
parent
42b3bd4662
commit
2a387148a1
@ -137,8 +137,6 @@ public:
|
||||
// may be exported to another backend compilation.
|
||||
if (ImportIndex && !FunctionsToImport)
|
||||
HasExportedFunctions = ImportIndex->hasExportedFunctions(SrcM);
|
||||
assert((ValIDToTempMDMap || !FunctionsToImport) &&
|
||||
"Function importing must provide a ValIDToTempMDMap");
|
||||
}
|
||||
|
||||
bool run();
|
||||
|
@ -41,8 +41,8 @@ static std::unique_ptr<Module> loadFile(const std::string &FileName,
|
||||
LLVMContext &Context) {
|
||||
SMDiagnostic Err;
|
||||
DEBUG(dbgs() << "Loading '" << FileName << "'\n");
|
||||
// Metadata isn't loaded or linked until after all functions are
|
||||
// imported, after which it will be materialized and linked.
|
||||
// Metadata isn't loaded until functions are imported, to minimize
|
||||
// the memory overhead.
|
||||
std::unique_ptr<Module> Result =
|
||||
getLazyIRFileModule(FileName, Err, Context,
|
||||
/* ShouldLazyLoadMetadata = */ true);
|
||||
@ -295,9 +295,6 @@ bool FunctionImporter::importFunctions(Module &DestModule) {
|
||||
ModuleToFunctionsToImportMap, Index, ModuleLoaderCache);
|
||||
assert(Worklist.empty() && "Worklist hasn't been flushed in GetImportList");
|
||||
|
||||
StringMap<std::unique_ptr<DenseMap<unsigned, MDNode *>>>
|
||||
ModuleToTempMDValsMap;
|
||||
|
||||
// Do the actual import of functions now, one Module at a time
|
||||
for (auto &FunctionsToImportPerModule : ModuleToFunctionsToImportMap) {
|
||||
// Get the module for the import
|
||||
@ -307,36 +304,19 @@ bool FunctionImporter::importFunctions(Module &DestModule) {
|
||||
assert(&DestModule.getContext() == &SrcModule->getContext() &&
|
||||
"Context mismatch");
|
||||
|
||||
// Save the mapping of value ids to temporary metadata created when
|
||||
// importing this function. If we have already imported from this module,
|
||||
// add new temporary metadata to the existing mapping.
|
||||
auto &TempMDVals = ModuleToTempMDValsMap[SrcModule->getModuleIdentifier()];
|
||||
if (!TempMDVals)
|
||||
TempMDVals = llvm::make_unique<DenseMap<unsigned, MDNode *>>();
|
||||
// If modules were created with lazy metadata loading, materialize it
|
||||
// now, before linking it (otherwise this will be a noop).
|
||||
SrcModule->materializeMetadata();
|
||||
UpgradeDebugInfo(*SrcModule);
|
||||
|
||||
// Link in the specified functions.
|
||||
if (TheLinker.linkInModule(std::move(SrcModule), Linker::Flags::None,
|
||||
&Index, &FunctionsToImport, TempMDVals.get()))
|
||||
&Index, &FunctionsToImport))
|
||||
report_fatal_error("Function Import: link error");
|
||||
|
||||
ImportedCount += FunctionsToImport.size();
|
||||
}
|
||||
|
||||
// Now link in metadata for all modules from which we imported functions.
|
||||
for (StringMapEntry<std::unique_ptr<DenseMap<unsigned, MDNode *>>> &SME :
|
||||
ModuleToTempMDValsMap) {
|
||||
// Load the specified source module.
|
||||
auto &SrcModule = ModuleLoaderCache(SME.getKey());
|
||||
// The modules were created with lazy metadata loading. Materialize it
|
||||
// now, before linking it.
|
||||
SrcModule.materializeMetadata();
|
||||
UpgradeDebugInfo(SrcModule);
|
||||
|
||||
// Link in all necessary metadata from this module.
|
||||
if (TheLinker.linkInMetadata(SrcModule, SME.getValue().get()))
|
||||
return false;
|
||||
}
|
||||
|
||||
DEBUG(dbgs() << "Imported " << ImportedCount << " functions for Module "
|
||||
<< DestModule.getModuleIdentifier() << "\n");
|
||||
return ImportedCount;
|
||||
|
Loading…
Reference in New Issue
Block a user