2013-04-30 88 views
1

我在寫一個ModulePass,我需要分析每個在給定模塊中定義的結構。遍歷模塊中的所有結構

我知道帶名稱的結構被插入到ValueSymbolTable中,但我怎樣才能遍歷所有其他結構(沒有名稱和文字結構標識)?

回答

2

與您當前上下文相關的LLVMContextImpl實例應該有兩個數據結構,一個包含當前上下文中所有標識的結構(不管它們是否具有明確的名稱),另一個包含所有文字結構。

要獲得LLVMContextImpl實例:

Module& M = ... 
LLVMContextImpl* C = M.getContext().pImpl; 

對於確定的結構:

C->NamedStructTypes 

對於字面結構:

C->AnonStructTypes 

既爲先返回迭代類型(StringMapDenseMap),允許你迭代它們並獲取所有類型。

0

補充橡樹的答案,這裏有一個更完整的代碼示例:

Module& M = ... 
LLVMContextImpl* C = M.getContext().pImpl; 
for (StringMap<StructType *>::iterator i = C->NamedStructTypes.begin(); i != C->NamedStructTypes.end(); ++i) 
{ 
    StructType *t = i->getValue(); 
    t->dump(); fprintf(stderr, "\n"); 
} 

LLVMContextImpl.h,是一個私有實現的頭,是不是LLVM的公共報頭中的一個。您可以從LLVM源代碼得到它 - 無論是從那裏將它複製到你的頭搜索路徑,或者快速&髒的檢測,做到:

#include "/path/to/llvm/src/lib/VMCore/LLVMContextImpl.h" 
1

這樣做的正確的方法是:

#include "llvm/IR/TypeFinder.h" 

llvm::TypeFinder StructTypes; 
StructTypes.run(M, true); 

for (auto *STy : StructTypes) 
    STy->dump(); 

您不應該使用其頭文件未發佈的任何私有/不透明類型(如LLVMContextImpl)。

0
bool runOnModule(Module &M) override 
{ 
    for(auto *S : M.getIdentifiedStructTypes()) 
    { 
     S->dump(); 
    } 
    return false; 
} 
+0

儘管此代碼可能會幫助解決問題, 提供附加的內容關於_why_和/或_how_它 回答了這個問題會顯著提高其 長期價值。請[編輯]你的答案,添加一些 的解釋。 – 2016-07-04 09:51:56