[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