[cfe-dev] JIT doens't resolve address
via cfe-dev
cfe-dev at lists.llvm.org
Thu Apr 20 06:43:40 PDT 2017
Hello LLVM-World,
I was following the "Building a JIT in LLVM"-Tutorial and tried to load a
normal main. My code is the following:
class Jitter
{
private:
std::unique_ptr<TargetMachine> TM;
const DataLayout DL;
ObjectLinkingLayer<> ObjectLayer;
IRCompileLayer<decltype(ObjectLayer)> CompileLayer;
public:
typedef decltype(CompileLayer)::ModuleSetHandleT ModuleHandle;
Jitter() : TM(EngineBuilder().selectTarget()), DL(TM->
createDataLayout()),
CompileLayer(ObjectLayer, SimpleCompiler(*TM))
{printf("!");
llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr);
}
TargetMachine &getTargetMachine() { return *TM; }
ModuleHandle addModule(std::unique_ptr<Module> &&M) {
// Build our symbol resolver:
// Lambda 1: Look back into the JIT itself to find symbols that are part
of
// the same "logical dylib".
// Lambda 2: Search for external symbols in the host process.
auto Resolver = createLambdaResolver(
[&](const std::string &Name)
{
printf("FLUSH :0\n");
if (auto Sym = CompileLayer.findSymbol(Name, false))
return Sym;
return JITSymbol(nullptr);
},
[](const std::string &S)
{
printf("PLUSH :0\n");
if (auto SymAddr =
RTDyldMemoryManager::getSymbolAddressInProcess(S))
return JITSymbol(SymAddr, JITSymbolFlags::Exported);
return JITSymbol(nullptr);
});
// Build a singleton module set to hold our module.
std::vector<std::unique_ptr<Module>> Ms;
Ms.push_back(std::move(M));
// Add the set to the JIT with the resolver we created above and a newly
// created SectionMemoryManager.
return CompileLayer.addModuleSet(std::move(Ms),
make_unique<SectionMemoryManager>(),
std::move(Resolver));
}
JITSymbol findSymbol(const std::string Name) {
std::string MangledName;
raw_string_ostream MangledNameStream(MangledName);
Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
printf("Tzearch for: %s\n\n", MangledNameStream.str());
return CompileLayer.findSymbol(MangledNameStream.str(), false);
}
void removeModule(ModuleHandle H) {
CompileLayer.removeModuleSet(H);
}
};
And calling from main with:
int main()
{
llvm::InitializeNativeTarget();
llvm::InitializeNativeTargetAsmPrinter();
llvm::InitializeNativeTargetAsmParser();
llvm::LLVMContext context;
llvm::SMDiagnostic dia;
std::unique_ptr<llvm::Module> M = llvm::parseIRFile(
"./jit_main.ll", dia, context);
Jitter jit;
printf("Wuff?");
Jitter::ModuleHandle h = jit.addModule(std::move(M));
printf("KNUFF!\n");
printf("Kuchen! 0x%p\n", jit.findSymbol("main").getAddress());
system("PAUSE");
return 0;
}
The Code runs without a fail, but when the programm tries to resolve
"main" the address is 0. The strange thing: the printf "FLUSH :0\n" and "
PLUSH :0\n" are never called, so did the code never compiled? What I'm
doing wrong?
Kind regards
Björn
Als GmbH eingetragen im Handelsregister Bad Homburg v.d.H. HRB 9816,
USt.ID-Nr. DE 114 165 789
Geschäftsführer: Hiroshi Kawamura, Dr Hiroshi Nakamura, Markus Bode, Heiko
Lampert, Takashi Nagano, Takeshi Fukushima.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170420/74f93a8d/attachment.html>
More information about the cfe-dev
mailing list