外部llvm GlobalVariable与TLS的可能错误?

时间:2015-04-15 09:04:31

标签: llvm jit thread-local-storage

我试图制作一个"线程本地" 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错误?

0 个答案:

没有答案