就我而言,我需要在模块中创建对全局变量的引用,然后在引用之后定义全局变量。
当我创建将使用全局变量的指令时,我不知道变量的类型。即使我实际上只需要符号的地址,我仍然需要通过指定类型来创建 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 对象的情况下获取符号地址?