输出输入';llvm过程中的s常量字符数组

输出输入';llvm过程中的s常量字符数组,llvm,llvm-ir,Llvm,Llvm Ir,全部 我想知道llvm如何通过输入定义输出常量字符数组 来源。下面是我想做的一个例子 测试输入源 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);

全部

我想知道llvm如何通过输入定义输出常量字符数组 来源。下面是我想做的一个例子

测试输入源

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);
}
...
i8* getelementptr inbounds ([8 x i8]* @10, i32 0, i32 0)
然而,我想要实现的是

  • 标识第一个参数是一个常量字符数组
  • 如果是,请打印“你好,世界”\n
  • 有人能告诉我如何实施这个吗

    非常感谢您的帮助!
    /Kangkook首先,第一个参数不是常量字符数组;它是一个指向一的指针,因此是
    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();
        }
      }
    }
    
    Value*op0=ci->getOperator(0);
    if(GetElementPtrConstantExpr*gep=dyn_cast(op0)){
    if(GlobalVariable*global=dyn_cast(gep->getOperand(0))){
    if(ConstantDataArray*array=dyn_cast(全局->getInitializer()){
    if(array->isCString())返回array->getAsCString();
    }
    }
    }