如何在LLVM中将CallInst类型转换为GlobalVariable

时间:2014-03-25 16:32:35

标签: llvm llvm-ir llvm-c++-api

我编写了一个函数传递,初始化一个全局变量,然后将一个Function插入到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 *'

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

此代码:

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

不会“将CallInst转换为GlobalVariable”,此代码将“转换为3到4”:

int x = 3;
x = 4;

换句话说,它是对变量的常规C ++赋值。在你的情况下,值和变量甚至没有兼容的类型,所以你得到一个标准的C ++类型错误。

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