2015-02-24 93 views
0

我有一個結構,它有一個指針,其功能如下。如何從StoreInst的Value中獲取函數的名稱在LLVM中

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

我用它作爲folllowing:

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

a->p() 

在LLVM,我怎樣才能得到功能(booooo)和結構單元(A-> P)的名稱,將其保存在符號表格並在稍後打印。 我可以在StoreInst中找到函數的名稱。 當我打印出它的價值,我得到這個結果:

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

?我怎樣才能僅從數值名稱(booooo)。

回答

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(); 
} 

[代碼沒有經過測試,沒有編譯,不保證所提供的,我只是寫它作爲這個答案的意圖的一部分它可能工作]

+0

我想,它沒有工作): – Dalia 2015-02-25 00:49:47

+0

詳解「沒有工作」 - 什麼不行? – 2015-02-25 08:24:59

+0

我測試過了,沒有輸出。我嘗試了Brian的解決方案,它工作。 – Dalia 2015-02-25 21:01:03

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(); 
+0

THAAAANKS(:它工作 – Dalia 2015-02-25 01:11:30

相關問題