mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-09 05:31:37 +00:00
Modify FunctionImport to take a callback to load modules
When linking static archive, there is no individual module files to load. Instead they can be mmap'ed and could be initialized from a buffer directly. The callback provide flexibility to override the scheme for loading module from the summary. Differential Revision: http://reviews.llvm.org/D15101 From: Mehdi Amini <mehdi.amini@apple.com> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254479 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3278230451
commit
f7d58f12fa
@ -18,15 +18,26 @@ class LLVMContext;
|
||||
class Module;
|
||||
class FunctionInfoIndex;
|
||||
|
||||
/// The function importer is automatically importing function from other modules
|
||||
/// based on the provided summary informations.
|
||||
class FunctionImporter {
|
||||
/// Helper to load on demand a Module from file and cache it for subsequent
|
||||
/// queries. It can be used with the FunctionImporter.
|
||||
class ModuleLazyLoaderCache {
|
||||
/// The context that will be used for importing.
|
||||
LLVMContext &Context;
|
||||
|
||||
/// Cache of lazily loaded module for import.
|
||||
StringMap<std::unique_ptr<Module>> ModuleMap;
|
||||
|
||||
/// The context that will be used for importing.
|
||||
LLVMContext &Context;
|
||||
public:
|
||||
/// Create the loader, Module will be initialized in \p Context.
|
||||
ModuleLazyLoaderCache(LLVMContext &Context) : Context(Context) {}
|
||||
|
||||
/// Retrieve a Module from the cache or lazily load it on demand.
|
||||
Module &operator()(StringRef FileName);
|
||||
};
|
||||
|
||||
/// The function importer is automatically importing function from other modules
|
||||
/// based on the provided summary informations.
|
||||
class FunctionImporter {
|
||||
|
||||
/// The summaries index used to trigger importing.
|
||||
const FunctionInfoIndex &Index;
|
||||
@ -35,13 +46,15 @@ class FunctionImporter {
|
||||
DiagnosticHandlerFunction DiagnosticHandler;
|
||||
|
||||
/// Retrieve a Module from the cache or lazily load it on demand.
|
||||
Module &getOrLoadModule(StringRef FileName);
|
||||
std::function<Module &(StringRef FileName)> getLazyModule;
|
||||
|
||||
public:
|
||||
/// Create a Function Importer.
|
||||
FunctionImporter(LLVMContext &Context, const FunctionInfoIndex &Index,
|
||||
DiagnosticHandlerFunction DiagnosticHandler)
|
||||
: Context(Context), Index(Index), DiagnosticHandler(DiagnosticHandler) {}
|
||||
FunctionImporter(const FunctionInfoIndex &Index,
|
||||
DiagnosticHandlerFunction DiagnosticHandler,
|
||||
std::function<Module &(StringRef FileName)> ModuleLoader)
|
||||
: Index(Index), DiagnosticHandler(DiagnosticHandler),
|
||||
getLazyModule(ModuleLoader) {}
|
||||
|
||||
/// Import functions in Module \p M based on the summary informations.
|
||||
bool importFunctions(Module &M);
|
||||
|
@ -51,7 +51,7 @@ static std::unique_ptr<Module> loadFile(const std::string &FileName,
|
||||
}
|
||||
|
||||
// Get a Module for \p FileName from the cache, or load it lazily.
|
||||
Module &FunctionImporter::getOrLoadModule(StringRef FileName) {
|
||||
Module &ModuleLazyLoaderCache::operator()(StringRef FileName) {
|
||||
auto &Module = ModuleMap[FileName];
|
||||
if (!Module)
|
||||
Module = loadFile(FileName, Context);
|
||||
@ -86,7 +86,6 @@ static void findExternalCalls(const Function &F, StringSet<> &CalledFunctions,
|
||||
// The current implementation imports every called functions that exists in the
|
||||
// summaries index.
|
||||
bool FunctionImporter::importFunctions(Module &M) {
|
||||
assert(&Context == &M.getContext());
|
||||
|
||||
bool Changed = false;
|
||||
|
||||
@ -142,7 +141,8 @@ bool FunctionImporter::importFunctions(Module &M) {
|
||||
<< "\n");
|
||||
|
||||
// Get the module for the import (potentially from the cache).
|
||||
auto &Module = getOrLoadModule(FileName);
|
||||
auto &Module = getLazyModule(FileName);
|
||||
assert(&Module.getContext() == &M.getContext());
|
||||
|
||||
// The function that we will import!
|
||||
GlobalValue *SGV = Module.getNamedValue(CalledFunctionName);
|
||||
@ -255,7 +255,10 @@ public:
|
||||
}
|
||||
|
||||
// Perform the import now.
|
||||
FunctionImporter Importer(M.getContext(), *Index, diagnosticHandler);
|
||||
ModuleLazyLoaderCache Loader(M.getContext());
|
||||
FunctionImporter Importer(*Index, diagnosticHandler,
|
||||
[&](StringRef Name)
|
||||
-> Module &{ return Loader(Name); });
|
||||
return Importer.importFunctions(M);
|
||||
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user