就我而言,我需要在模块中创建对全局变量的引用,然后在引用之后定义全局变量。
当我创建将使用全局变量的指令时,我不知道变量的类型。即使我实际上只需要符号的地址,我仍然需要通过指定类型来创建llvm :: GlobalVariable对象。
这引起了一个问题,当我稍后定义全局变量时,我知道了类型但不幸的是我无法替换之前创建的GlobalVariable对象。
这是伪代码:
llvm::Value *val = new llvm::GlobalVariable(module, llvm::Type::getInt32Ty(), false
, llvm::GlobalValue::ExternalLinkage, 0, "myvar");
//.... create instructions
builder.CreatePtrToInt(val, llvm::Type::getInt32Ty());
//Here I need to define and intialize the global variable.
//Now I know the exact type of the variable. It's different as int32
//for example it's int16.
llvm::Value *real_val = new llvm::GlobalVariable(module, llvm::Type::getInt16Ty()
, false,llvm::GlobalValue::ExternalLinkage, 0, "myvar");
显然,我无法创建具有相同名称的另一个变量。但是,如何将第一个GlobalVariable对象转换为实际类型并为其提供初始化器?
有没有其他方法可以在不创建GlobalVariable对象的情况下获取符号地址?