如何在Cranelift中获取通过Module::declare_data声明的全局变量地址?
获取Module::declare_data声明的全局变量地址
首先纠正你的误解:InstBuilder::global_value的返回值本身就是全局变量的地址,并不是按值加载的结果。按值加载需要额外调用load指令来完成。
具体操作逻辑:
- 当你用
Module::declare_data声明全局变量时,会得到一个GlobalVariable类型的对象(指针或引用)。 - 在IR构建阶段,调用
InstBuilder::global_value并传入该全局变量的名称或直接引用,得到的Value*类型结果,就是这个全局变量的内存地址(对应LLVM IR中的@var语法,代表变量的指针)。 - 如果需要读取变量的实际值,才需要再调用
InstBuilder::load,把这个地址作为参数传入,得到加载后的数值。
举个简单的代码示例:
// 声明全局变量 GlobalVariable* globalVar = module->declare_data("my_global", Type::getInt32Ty(context), false); // 在函数内获取全局变量的地址 Value* globalAddr = builder.global_value(globalVar); // 此时globalAddr的类型是i32*,即全局变量的地址 // 若要获取变量的值,需调用load指令 Value* globalValue = builder.load(globalAddr);
至于Module::declare_data_in_func,它的作用是在函数内部创建一个指向全局变量的别名引用,本质和直接获取全局变量地址的逻辑一致,只是适用场景不同。
简单来说:你之前把“全局变量地址”和“全局变量的值”搞混了——global_value给的是地址,load才是拿值的操作。
内容的提问来源于stack exchange,提问作者Spartan2909
相关产品推荐
相关产品推荐

