遍历模块中的所有结构
问题描述:
我在写一个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