如何从StoreInst的LLVM中获取函数名称

时间:2015-02-24 21:07:21

标签: c++ llvm llvm-ir

我有一个结构,它有一个指向如下功能的指针。

typedef struct
{
    void (*p)();
    int n;
} myStruct;

我用它如下:

myStruct * a = malloc( sizeof(myStruct));
a->n=88;
a->p = &booooo;

a->p()

在LLVM中,如何获取功能(booooo)和struct element(a-> p)的名称以将其保存在符号表中并稍后打印。 我可以在StoreInst中找到该函数的名称。 当我打印它的值时,我得到了这个结果:

void (...)* bitcast (void ()* @booooo to void (...)*)

如何从值中仅获取名称(booooo)。

2 个答案:

答案 0 :(得分:1)

正如上一个问题所解释的那样[略有不同],你最好使用Clang编译器生成的AST表单,而不是LLVM IR表单。与LLVM IR相比,它更直接地表示C或C ++代码,并且更容易使用。

但是从StoreInst开始,您可以使用getValueOperand获取正在存储的值,然后使用值getName。当然,就像我在前面的回答评论中所说的那样,要使代码难以得出原始值存储的内容并不是很难。

换句话说,如果我们有llvm::Instruction *inst,我们可以这样做:

if (llvm::StoreInst* si = llvm::dyn_cast<llvm::StoreInst>(inst))
{
    std::string name = si->getValueOperand()->getName();
}

[代码未经过测试,未编译,未提供担保,我只是将其作为此答案的一部分编写,意图可能有效]

答案 1 :(得分:1)

LLVM IR中至少有两种类型的转换:BitCastInst和bitcast值。你有晚了。幸运的是,有一种方法可以检索bitcast中的原始值:stripPointerCasts()。我花了一些时间来弄清楚这种区别。

这是我对例程的使用,我试图识别名为(BasicBlock::iterator I)的函数:

if (CallInst *ci = dyn_cast<CallInst>(&*I)) {
    Function *f = ci->getCalledFunction();

    if (f == NULL) 
    { 
        Value* v = ci->getCalledValue();
        f = dyn_cast<Function>(v->stripPointerCasts());
        if (f == NULL)
        {
            continue; 
        }
    }

    const char* fname = f->getName().data();