我在寫一個ModulePass,我需要分析每個在給定模塊中定義的結構。遍歷模塊中的所有結構
我知道帶名稱的結構被插入到ValueSymbolTable中,但我怎樣才能遍歷所有其他結構(沒有名稱和文字結構標識)?
我在寫一個ModulePass,我需要分析每個在給定模塊中定義的結構。遍歷模塊中的所有結構
我知道帶名稱的結構被插入到ValueSymbolTable中,但我怎樣才能遍歷所有其他結構(沒有名稱和文字結構標識)?
與您當前上下文相關的LLVMContextImpl
實例應該有兩個數據結構,一個包含當前上下文中所有標識的結構(不管它們是否具有明確的名稱),另一個包含所有文字結構。
要獲得LLVMContextImpl
實例:
Module& M = ...
LLVMContextImpl* C = M.getContext().pImpl;
對於確定的結構:
C->NamedStructTypes
對於字面結構:
C->AnonStructTypes
既爲先返回迭代類型(StringMap
,DenseMap
),允許你迭代它們並獲取所有類型。
補充橡樹的答案,這裏有一個更完整的代碼示例:
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"
這樣做的正確的方法是:
#include "llvm/IR/TypeFinder.h"
llvm::TypeFinder StructTypes;
StructTypes.run(M, true);
for (auto *STy : StructTypes)
STy->dump();
您不應該使用其頭文件未發佈的任何私有/不透明類型(如LLVMContextImpl)。
bool runOnModule(Module &M) override
{
for(auto *S : M.getIdentifiedStructTypes())
{
S->dump();
}
return false;
}
儘管此代碼可能會幫助解決問題, 提供附加的內容關於_why_和/或_how_它 回答了這個問題會顯著提高其 長期價值。請[編輯]你的答案,添加一些 的解釋。 – 2016-07-04 09:51:56