前面的文章中提到了如何利用LLVM的IR进行编程,这篇文章将讲述如何将LLVM IR外部的变量和函数与LLVM IR结合起来。
LLVM IR外部变量和外部函数
外部变量value
和外部函数foo
:
1 | int value = 10; |
声明LLVM IR中的外部变量和函数
声明一个外部变量value,为int类型。
1 | LLVMContext & context = llvm::getGlobalContext(); |
声明一个外部函数foo,这个函数的原型为int foo(int x)
1 | Function *f = cast<Function>(module->getOrInsertFunction("foo", Type::getInt32Ty(context), |
构建一个LLVM IR表示的函数
接下来构建一个LLVM IR表示的函数bar。在bar中读入value的值,并作为foo的参数调用foo,bar再返回foo的返回值。
1 | //create a LLVM function 'bar' |
创建ExecutionEngine
1 | //create execution engine first |
绑定LLVM IR外部的变量和函数
1 | //map global variable |
JIT并运行
1 | void *barAddr = ee->getPointerToFunction(bar); |
运行结果是20,正好符合语义。
重新绑定LLVM IR外部变量或者外部函数
重新绑定LLVM IR外部变量或函数可以通过updateGlobalMapping来实现。
1 | ee->updateGlobalMapping(v, &value1); |
不过重新绑定之后,需要重新JIT才可以将改变反应到生成代码上来。
本文示例地址:llvm-ir-global-mapping