Is there a preferred approach for an LLVM-based JIT-compiler to make
calls from run-time generated functions in module A to bitcode-loaded
functions in module B?
A naive CallInst across the boundary fails verification. Calling it as
an external function fails to resolve, even if both ModuleA and ModuleB
are in the same ExecutionEngine. I can think of two ways around this:
1. Create a constant function pointer in ModuleA using the value from
EE.getPointerToFunction(FunctionB). This seems trivial, but I am
concerned it will prevent many optimizations.
2. Copy functions from ModuleB into ModuleA. This appears to be a
non-trivial operation. I could use Linker::LinkModules(ModuleA,
ModuleB), but it seems rather inefficient to clone an entire module just
to get at one function. Furthermore, since we maintain many separate
run-time-generated modules, it would be especially wasteful to clone
many copies of ModuleB into each of them.
Any suggestions?
-Sean