全部
我想知道llvm如何传递从输入定义的输出常量char数组 资源。这是我想要做的一个例子。
测试输入源
char* msg = "hello, world\n";
void msg_out(char * in) {
printf("msg: %s \n", in);
}
main () {
...
msg_out(msg);
...
}
llvm pass snippet
...
const CallInst* ci = dyn_cast<CallInst>(val);
const Function* func = ci->getCalledFunction();
if (func->getName() == "msg_out") {
errs() << ci->getOperand(0);
}
...
使用源代码,上面的llvm传递将打印以下输出。
输出
i8* getelementptr inbounds ([8 x i8]* @10, i32 0, i32 0)
但是,我想要实现的是
有谁能让我知道如何实现这个?
非常感谢您的帮助! / Kangkook
答案 0 :(得分:1)
首先,第一个参数不是一个常量字符数组;它是指向一个的指针,因此是getelementptr
(gep)。在任何情况下,执行此操作的正确方法是取消引用gep的指针,验证它是全局的,然后获取其初始化程序。在你的情况下(因为gep实际上是constant expression),它应该是这样的:
Value* op0 = ci->getOperand(0);
if (GetElementPtrConstantExpr* gep = dyn_cast<GetElementPtrConstantExpr>(op0)) {
if (GlobalVariable* global = dyn_cast<GlobalVariable>(gep->getOperand(0))) {
if (ConstantDataArray* array = dyn_cast<ConstantDataArray>(global->getInitializer())) {
if (array->isCString()) return array->getAsCString();
}
}
}