0

全部

我想知道 llvm 如何传递从输入源定义的输出常量 char 数组。这是我想做的一个例子。

测试输入源

char* msg = "hello, world\n";

void msg_out(char * in) {
    printf("msg: %s \n", in);
}

main () {
    ...
    msg_out(msg);
    ...
}

llvm 通行证片段

...
const CallInst* ci = dyn_cast<CallInst>(val);
const Function* func = ci->getCalledFunction();

if (func->getName() == "msg_out") {
    errs() << ci->getOperand(0);
}
...

使用源代码,上面的 llvm pass 将打印以下输出。

输出

i8* getelementptr inbounds ([8 x i8]* @10, i32 0, i32 0)

但是,我想要实现的是

  1. 确定第一个参数是一个常量字符数组
  2. 如果是这样,打印出“你好,世界\n”

谁能让我知道如何实现这个?

非常感谢您提前提供的帮助!/康国

4

1 回答 1

1

首先,第一个参数不是常量字符数组;它是指向一个的指针,因此是getelementptr(gep)。在任何情况下,正确的方法是取消引用 gep 的指针,验证它是全局的,然后获取它的初始化程序。在您的情况下(并且由于 gep 实际上是一个常量表达式),它应该如下所示:

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();
    }
  }
}
于 2013-06-23T06:25:35.493 回答