我有一个结构,它有一个指向如下功能的指针。
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)。
答案 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();