forked from OSchip/llvm-project
[ORC] Verify modules when running LLLazyJIT in LLI, and deal with fallout.
The verifier identified several modules that were broken due to incorrect linkage on declarations. To fix this, CompileOnDemandLayer2::extractFunction has been updated to change decls to external linkage. llvm-svn: 336150
This commit is contained in:
parent
9f02a94dad
commit
adae9bfa24
|
@ -322,11 +322,15 @@ std::unique_ptr<Module> CompileOnDemandLayer2::extractFunctions(
|
|||
ValueToValueMapTy VMap;
|
||||
|
||||
auto Materializer = createLambdaValueMaterializer([&](Value *V) -> Value * {
|
||||
GlobalValue *NewGV = nullptr;
|
||||
if (auto *F = dyn_cast<Function>(V))
|
||||
return cloneFunctionDecl(*ExtractedFunctionsModule, *F);
|
||||
NewGV = cloneFunctionDecl(*ExtractedFunctionsModule, *F);
|
||||
else if (auto *GV = dyn_cast<GlobalVariable>(V))
|
||||
return cloneGlobalVariableDecl(*ExtractedFunctionsModule, *GV);
|
||||
return nullptr;
|
||||
NewGV = cloneGlobalVariableDecl(*ExtractedFunctionsModule, *GV);
|
||||
|
||||
if (NewGV)
|
||||
NewGV->setLinkage(GlobalValue::ExternalLinkage);
|
||||
return NewGV;
|
||||
});
|
||||
|
||||
std::vector<std::pair<Function *, Function *>> OrigToNew;
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/IR/TypeBuilder.h"
|
||||
#include "llvm/IR/Verifier.h"
|
||||
#include "llvm/IRReader/IRReader.h"
|
||||
#include "llvm/Object/Archive.h"
|
||||
#include "llvm/Object/ObjectFile.h"
|
||||
|
@ -767,7 +768,16 @@ int runOrcLazyJIT(LLVMContext &Ctx, std::vector<std::unique_ptr<Module>> Ms,
|
|||
auto J =
|
||||
ExitOnErr(orc::LLLazyJIT::Create(std::move(ES), std::move(TM), DL, Ctx));
|
||||
|
||||
J->setLazyCompileTransform(createDebugDumper());
|
||||
auto Dump = createDebugDumper();
|
||||
|
||||
J->setLazyCompileTransform(
|
||||
[&](std::unique_ptr<Module> M) {
|
||||
if (verifyModule(*M, &dbgs())) {
|
||||
dbgs() << "Bad module: " << *M << "\n";
|
||||
exit(1);
|
||||
}
|
||||
return Dump(std::move(M));
|
||||
});
|
||||
J->getMainVSO().setFallbackDefinitionGenerator(
|
||||
orc::DynamicLibraryFallbackGenerator(
|
||||
std::move(LibLLI), DL, [](orc::SymbolStringPtr) { return true; }));
|
||||
|
@ -776,8 +786,10 @@ int runOrcLazyJIT(LLVMContext &Ctx, std::vector<std::unique_ptr<Module>> Ms,
|
|||
orc::LocalCXXRuntimeOverrides2 CXXRuntimeOverrides;
|
||||
ExitOnErr(CXXRuntimeOverrides.enable(J->getMainVSO(), Mangle));
|
||||
|
||||
for (auto &M : Ms)
|
||||
for (auto &M : Ms) {
|
||||
orc::makeAllSymbolsExternallyAccessible(*M);
|
||||
ExitOnErr(J->addLazyIRModule(std::move(M)));
|
||||
}
|
||||
|
||||
ExitOnErr(J->runConstructors());
|
||||
|
||||
|
|
Loading…
Reference in New Issue