我试图制作一个"线程本地" LLVM中的全局变量(MSVC,Windows)。 通常可以像这样初始化外部全局变量:
TheExecutionEngine->addGlobalMapping(module->getGlobalVariable("bsp"), &somevalue);
但是当我创建TLS GlobalVariable时(设置ThreadLocalModel = GlobalVariable :: LocalDynamicTLSModel) ,addGlobalMapping似乎无法正常工作。 这是一个例子:
InitializeNativeTarget();
InitializeNativeTargetAsmPrinter();
InitializeNativeTargetAsmParser();
llvm::LLVMContext& context = llvm::getGlobalContext();
llvm::Module *module = new llvm::Module("top", context);
llvm::IRBuilder<> builder(context);
GlobalVariable* bsp=new GlobalVariable(*module,Type::getInt32Ty(context),false,GlobalValue::ExternalLinkage,0,"bsp",0,GlobalVariable::LocalDynamicTLSModel);
llvm::FunctionType *funcType =
llvm::FunctionType::get(builder.getInt32Ty(), false);
llvm::Function *mainFunc =
llvm::Function::Create(funcType, llvm::Function::ExternalLinkage, "main", module);
llvm::BasicBlock *entry = llvm::BasicBlock::Create(context, "entrypoint", mainFunc);
builder.SetInsertPoint(entry);
//builder.CreateStore(ConstInt(32,123),bsp);
builder.CreateRet(builder.CreateLoad(bsp));
module->dump( );
ExecutionEngine *TheExecutionEngine;
long ou=1;
TheExecutionEngine = EngineBuilder(module).create();
module->getGlobalVariable("bsp")->dump();
TheExecutionEngine->addGlobalMapping(module->getGlobalVariable("bsp"),&ou);
typedef int (*PF)();
PF fun=(PF)TheExecutionEngine->getPointerToFunction(mainFunc);
printf("%d %d\n",ou,fun());
system("pause");
在这里,我创建了一个功能&#34; main&#34;在llvm中,它返回全局变量bsp
的值。
在我运行llvm模块之前,我在C ++中设置了一个变量(&#34; long ou = 1;&#34;),并将llvm变量bsp
映射到C ++变量&#34; ou&#34;(TheExecutionEngine-&gt; addGlobalMapping(module-&gt; getGlobalVariable(&#34; bsp&#34;),&amp; ou);)。
最后我点击该函数并运行它。 &#34;乐趣()&#34;预计返回值1,但它返回一个随机数。
我已经在llvm 3.4.2上使用&#34;旧JIT&#34; (不是MCJIT) 我认为llvm全局变量未成功映射到C ++变量。
也许我以错误的方式使用线程局部全局变量,或者它是一个llvm错误?