On Sun, Jan 10, 2010 at 8:58 AM, Michael Muller <mmuller at enduden.com> wrote:> > Michael Muller wrote: >> >> Hi all, >> >> I'm trying to use a function defined in one LLVM module from another module >> (in the JIT) but for some reason it's not working out. My sequence of >> activity is roughly like this: >> >> 1) Create moduleA >> 2) Create moduleB with "func()" >> 3) execEng = ExecutionEngine::create( >> new ExistingModuleProvider(moduleB)); >> 4) execute "func()" (this works fine) >> 4) add "func()" to moduleA as a declaration (no code blocks) with External >> linkage. >> 5) execEng->addModuleProvider(new ExistingModuleProvider(moduleA)); >> 6) run a function in moduleA that calls "func()" >> >> I get: >> LLVM ERROR: Program used external function 'func' which could not be resolved! >> >> I'm guessing I'm either going about this wrong or missing something. Can >> anyone offer me some insight? > > I've played around with this some more. > > It looks like the only way that I can get this to work is to do an > ExecutionEngine::addGlobalMapping() on the function declaration in moduleA to > map it to the function pointer in moduleB. > > This seems awkward, is there a better way to do this? >I'm doing the same thing, and had to do it in the same way. Just because the JIT loads two modules doesn't mean that they're automatically linked together within the JIT... one module cannot call functions in the other unless the external functions are declared and explicitly mapped using addGlobalMapping. I'm guessing it's meant to be that way.
Won't passing llvm::Function* around vs strings (function names), also work, at code generation time, without the need for a module A dec to module B impl. mapping? Garrison On Jan 10, 2010, at 10:31, Kenneth Uildriks wrote:> On Sun, Jan 10, 2010 at 8:58 AM, Michael Muller <mmuller at enduden.com> wrote: >> >> Michael Muller wrote: >>> >>> Hi all, >>> >>> I'm trying to use a function defined in one LLVM module from another module >>> (in the JIT) but for some reason it's not working out. My sequence of >>> activity is roughly like this: >>> >>> 1) Create moduleA >>> 2) Create moduleB with "func()" >>> 3) execEng = ExecutionEngine::create( >>> new ExistingModuleProvider(moduleB)); >>> 4) execute "func()" (this works fine) >>> 4) add "func()" to moduleA as a declaration (no code blocks) with External >>> linkage. >>> 5) execEng->addModuleProvider(new ExistingModuleProvider(moduleA)); >>> 6) run a function in moduleA that calls "func()" >>> >>> I get: >>> LLVM ERROR: Program used external function 'func' which could not be resolved! >>> >>> I'm guessing I'm either going about this wrong or missing something. Can >>> anyone offer me some insight? >> >> I've played around with this some more. >> >> It looks like the only way that I can get this to work is to do an >> ExecutionEngine::addGlobalMapping() on the function declaration in moduleA to >> map it to the function pointer in moduleB. >> >> This seems awkward, is there a better way to do this? >> > > I'm doing the same thing, and had to do it in the same way. > > Just because the JIT loads two modules doesn't mean that they're > automatically linked together within the JIT... one module cannot call > functions in the other unless the external functions are declared and > explicitly mapped using addGlobalMapping. I'm guessing it's meant to > be that way. > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
On Sun, Jan 10, 2010 at 12:38 PM, Garrison Venn <gvenn.cfe.dev at gmail.com> wrote:> Won't passing llvm::Function* around vs strings (function names), also work, at code generation time, > without the need for a module A dec to module B impl. mapping? > > GarrisonNope. You cannot place a call instruction into one module whose callee is a Function from another module. You have to put a declaration into the same module, and have your call instruction call that. And then they need to be linked together, either by llvm-link or (if JITting) by addGlobalMapping.