2013-06-22 20 views
0

所有1.4.3输入的字符常量数组传递

我想知道如何从输入 源定义的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); 
} 
... 

随着源,上述LLVM通将打印以下输出。

输出

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

不过,我希望实现反而是

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

任何人都可以让我知道如何实现这一点?

非常感谢您的帮助! /Kangkook

回答

1

首先,的第一个参数不是的一个常数字符数组;它是一个指针,因此是getelementptr(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(); 
    } 
    } 
}