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

如何在LLVM中将CallInst类型转换为GlobalVariable,llvm,llvm-ir,llvm-c++-api,Llvm,Llvm Ir,Llvm C++ Api,我编写了一个函数传递,它初始化一个全局变量,然后将一个函数插入IR。我想将函数调用的结果设置为全局变量,但不确定如何将CallInst类型转换为GlobalVariable类型。以下是我为全局变量声明编写的代码: GlobalVariable *virtAddr = new GlobalVariable(*F.getParent(), Type::getInt8PtrTy(F.getContext(),8), false, GlobalValue::ExternalLi

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

此代码:

GlobalVariable *virtAddr = new GlobalVariable(...);
virtAddr = builder.CreateCall(mmap,putsArgs,"mmap");
与此代码“将3转换为4”一样,不会“将CallInst转换为GlobalVariable”:

换句话说,它是一个普通的C++赋值到一个变量。在你的情况下,值和变量甚至没有兼容的类型,所以你得到了一个标准的C++类型错误。
那么,如何将函数调用的结果(或任何其他值)分配到全局变量中呢?全局变量总是表示指向某个内存位置的指针;因此,如果要在那里存储任何内容,需要使用
StoreInst
,将全局变量作为地址,调用指令作为存储值。

非常感谢!我能够添加这一行:builder.CreateStore(x,virtAddr,false);结果给了我想要的红外代码。其中x只是设置为builder.CreateCall(mmap,putsArgs,“mmap”)的值类型;
int x = 3;
x = 4;