2

我编写了一个函数传递,它初始化一个全局变量,然后将一个函数插入到 IR 中。我想将函数调用的结果设置为全局变量,但不确定如何将 CallInst 类型转换为 GlobalVariable 类型。这是我为全局变量声明编写的代码:

GlobalVariable *virtAddr = new GlobalVariable(*F.getParent(), 
    Type::getInt8PtrTy(F.getContext(),8),
    false,
    GlobalValue::ExternalLinkage,
    0,
    "virt_addr");
virtAddr->setAlignment(4);

然后我尝试在这一行设置全局变量:

virtAddr = builder.CreateCall(mmap,putsArgs,"mmap");

当我尝试编译时,我收到此错误:

error: assigning to 'llvm::GlobalVariable *' from incompatible type
'llvm::CallInst *'

谢谢你的帮助!

4

1 回答 1

2

这段代码:

GlobalVariable *virtAddr = new GlobalVariable(...);
virtAddr = builder.CreateCall(mmap,putsArgs,"mmap");

不会“将 CallInst 转换为 GlobalVariable”,就像此代码将“将 3 转换为 4”一样:

int x = 3;
x = 4;

换句话说,这是对变量的常规 C++ 赋值。在您的情况下,值和变量甚至没有兼容的类型,因此您会收到标准的 C++ 类型错误。

那么如何函数调用的结果(或任何其他值)分配给全局变量?好吧,全局变量总是代表一个指向某个内存位置的指针;所以如果你想在那里存储任何东西,你需要使用 a StoreInst,将全局变量作为地址,将调用指令作为要存储的值。

于 2014-03-25T17:38:32.347 回答