C++ 如何从StoreInst';LLVM中的s值

C++ 如何从StoreInst';LLVM中的s值,c++,llvm,llvm-ir,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元素(a->p)以将其保存在符号表中并在以后打印。 我可以在StoreInst中

我有一个结构,它有一个指向函数的指针,如下所示

typedef struct
{
    void (*p)();
    int n;
} myStruct;
我使用它如下:

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

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

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

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

如前一个问题中所述,询问相同的问题[略有不同],最好使用Clang编译器生成的AST表单,而不是LLVM IR表单。它比C语言或C++代码更直接地表示LLVM IR,并且更易于通用。p> 但是从
StoreInst
中,可以使用
getValueOperand
获取正在存储的值,然后使用该值的
getName
。当然,正如我在前面的回答中所说的,让代码很难导出存储的原始值并不是很难

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

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

[代码未经测试、未编译、未提供任何保证,我只是将其作为答案的一部分编写,目的是使其能够工作]

正如前面的问题中所解释的,提出同样的问题[略有不同],最好使用Clang编译器生成的AST形式,而不是LLVM IR形式。它比C语言或C++代码更直接地表示LLVM IR,并且更易于通用。p> 但是从
StoreInst
中,可以使用
getValueOperand
获取正在存储的值,然后使用该值的
getName
。当然,正如我在前面的回答中所说的,让代码很难导出存储的原始值并不是很难

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

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

[代码未经测试、未编译、未提供任何保证,我只是将其作为答案的一部分编写,目的是使其能够工作]

正如前面的问题中所解释的,提出同样的问题[略有不同],最好使用Clang编译器生成的AST形式,而不是LLVM IR形式。它比C语言或C++代码更直接地表示LLVM IR,并且更易于通用。p> 但是从
StoreInst
中,可以使用
getValueOperand
获取正在存储的值,然后使用该值的
getName
。当然,正如我在前面的回答中所说的,让代码很难导出存储的原始值并不是很难

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

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

[代码未经测试、未编译、未提供任何保证,我只是将其作为答案的一部分编写,目的是使其能够工作]

正如前面的问题中所解释的,提出同样的问题[略有不同],最好使用Clang编译器生成的AST形式,而不是LLVM IR形式。它比C语言或C++代码更直接地表示LLVM IR,并且更易于通用。p> 但是从
StoreInst
中,可以使用
getValueOperand
获取正在存储的值,然后使用该值的
getName
。当然,正如我在前面的回答中所说的,让代码很难导出存储的原始值并不是很难

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

if (llvm::StoreInst* si = llvm::dyn_cast<llvm::StoreInst>(inst))
{
    std::string name = si->getValueOperand()->getName();
}
if(llvm::StoreInst*si=llvm::dyn_cast(inst))
{
std::string name=si->GetValueOperator()->getName();
}
[代码未经测试、未编译、未提供任何保证,我只是将其作为答案的一部分编写,目的是使其能够工作]

LLVM IR中有(至少)两种类型的强制转换:BitCastInst和bitcast值。你有晚一点的。幸运的是,有一种方法可以检索比特广播中的原始值:
stripPointerCasts()
。我花了一些时间才弄明白这种区别

下面是我对例程的用法,我试图识别调用的函数(
BasicBlock::iterator I
):

if(CallInst*ci=dyn_cast(&*I)){
函数*f=ci->getCalledFunction();
如果(f==NULL)
{ 
Value*v=ci->getCalledValue();
f=dyn_cast(v->stripPointerCasts());
如果(f==NULL)
{
继续;
}
}
const char*fname=f->getName().data();
在LLVM IR中有(至少)两种类型的强制转换:BitCastInst和bitcast值。您有后者。幸运的是,有一种方法可以检索bitcast中的原始值:
stripPointerCasts()
。我花了一些时间才弄清楚这一区别

下面是我对例程的用法,我试图识别调用的函数(
BasicBlock::iterator I
):

if(CallInst*ci=dyn_cast(&*I)){
函数*f=ci->getCalledFunction();
如果(f==NULL)
{ 
Value*v=ci->getCalledValue();
f=dyn_cast(v->stripPointerCasts());
如果(f==NULL)
{
继续;
}
}
const char*fname=f->getName().data();
LLVM IR中有(至少)两种类型的强制转换:BitCastInst和bitcast值。您有后者。幸运的是,有