遍历模块中的所有结构

问题描述:

我在写一个ModulePass,我需要分析每个在给定模块中定义的结构。遍历模块中的所有结构

我知道带名称的结构被插入到ValueSymbolTable中,但我怎样才能遍历所有其他结构(没有名称和文字结构标识)?

与您当前上下文相关的LLVMContextImpl实例应该有两个数据结构,一个包含当前上下文中所有标识的结构(不管它们是否具有明确的名称),另一个包含所有文字结构。

要获得LLVMContextImpl实例:

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

对于确定的结构:

C->NamedStructTypes 

对于字面结构:

C->AnonStructTypes 

既为先返回迭代类型(StringMapDenseMap),允许你迭代它们并获取所有类型。

补充橡树的答案,这里有一个更完整的代码示例:

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; 
} 
+0

尽管此代码可能会帮助解决问题, 提供附加的内容关于_why_和/或_how_它 回答了这个问题会显著提高其 长期价值。请[编辑]你的答案,添加一些 的解释。 – 2016-07-04 09:51:56