[llvm-dev] Using Global Variables in MCJIT
Lang Hames via llvm-dev
llvm-dev at lists.llvm.org
Tue Dec 15 10:54:22 PST 2015
Hi Naveet,
Sorry about the delayed reply. Your repro case is currently passing for me
on MacOSX - are you still seeing this issue?
Cheers,
Lang.
On Thu, Nov 12, 2015 at 7:06 PM, Navneet Potti via llvm-dev <
llvm-dev at lists.llvm.org> wrote:
> Hi folks,
> I’m trying to JIT compile some functions in an existing C/C++ program at
> runtime, but I’m running into some trouble with global variable
> initialization. Specifically, the approach I’ve taken is to use Clang to
> precompile the program into IR bitcode modules in addition to the
> executable. At runtime, the program loads the modules, transforms them
> (program specialization), compiles and executes them. As it turns out, I
> have some global variables that get initialized and modified during
> execution of the “host” program. Currently, these globals are also getting
> initialized in the JIT compiled code, whereas I’d like them to be mapped to
> the host global variables instead. Can someone help me with this?
>
> A small repro is excerpted below. Full source code is in the attached zip
> file. The file somefunc.cpp gets precompiled during build, and is loaded in
> the main() function in testCompile.cpp. The global variable xyz is
> initialized to point to 25 in somefunc.cpp, but I’d like it to point to 10
> as in main() instead. In other words, the assertion in main() should
> succeed.
>
> I tried a few different ways to solve this problem. The ChangeGlobal()
> function attempts (unsuccessfully) to achieve this updateGlobalMapping().
> The second, more hacky approach uses a new global variable initialized
> appropriately. I can get this latter approach to work for some types of
> globals, but is there a more elegant approach than this?
>
> Cheers,
> Navneet Potti
>
>
>
>
> ————— somefunc.h ————————
> extern int *xyz;
>
> —————— somefunc.cpp ——————
> int abc = 25;
> int *xyz = &abc;
>
> int somefunc() {
> return *xyz;
> }
>
> —————— testCompile.cpp ——————
> class JitCompiler {
> public:
> JitCompiler(const std::string module_file);
> void LoadModule(const std::string& file);
> template <typename FnType>
> FnType CompileFunc(FnType fn, const std::string& fn_name);
> void ChangeGlobal();
>
> private:
> std::unique_ptr<LLVMContext> context_;
> Module *module_;
> std::unique_ptr<ExecutionEngine> engine_;
> };
>
> void JitCompiler::ChangeGlobal() {
> // ----------------- #1: UpdateGlobalMapping -----------------
> //auto g = engine_->FindGlobalVariableNamed("xyz");
> //engine_->updateGlobalMapping(g, &xyz);
> //assert(engine_->getGlobalValueAddress("xyz") == (uint64_t) &xyz);
>
> // ----------------- #2: Replace with new global ————————
> // ------- Ugly hack that works for globals of type T** ----------
> auto g = engine_->FindGlobalVariableNamed("xyz");
> Constant *addr_i = ConstantInt::get(*context_, APInt(64,
> (uint64_t) xyz));
> auto addr = ConstantExpr::getIntToPtr(
> addr_i,
> g->getType()->getPointerElementType());
>
> GlobalVariable *n = new GlobalVariable(
> *module_,
> g->getType()->getPointerElementType(),
> g->isConstant(),
> g->getLinkage(),
> addr,
> g->getName() + "_new");
> g->replaceAllUsesWith(n);
> n->takeName(g);
> g->eraseFromParent();
> }
>
> int main() {
> xyz = new int (10);
> JitCompiler jit("somefunc.bc");
>
> jit.ChangeGlobal();
> auto fn = jit.CompileFunc(&somefunc, "somefunc");
> assert(somefunc() == fn());
> }
>
>
>
>
>
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151215/5a669e66/attachment.html>
More information about the llvm-dev
mailing list