3

就我而言,我需要在模块中创建对全局变量的引用,然后在引用之后定义全局变量。

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

4

0 回答 0