我编写了一个函数传递,初始化一个全局变量,然后将一个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 *'
感谢您的帮助!
答案 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指令作为要存储的值。