我正在编写一个 ModulePass,我需要分析给定模块中定义的每个结构。
我知道在 ValueSymbolTable 中插入了带有名称的已识别结构,但是如何遍历所有其他结构(没有名称和文字结构识别)?
我正在编写一个 ModulePass,我需要分析给定模块中定义的每个结构。
我知道在 ValueSymbolTable 中插入了带有名称的已识别结构,但是如何遍历所有其他结构(没有名称和文字结构识别)?
这样做的正确方法是:
#include "llvm/IR/TypeFinder.h"
llvm::TypeFinder StructTypes;
StructTypes.run(M, true);
for (auto *STy : StructTypes)
STy->dump();
您不应使用未发布标头的任何私有/不透明类型(如 LLVMContextImpl)。
与当前上下文关联的LLVMContextImpl
实例应该有两个数据结构,一个包含当前上下文中所有已识别的结构(无论它们是否具有显式名称),另一个包含所有文字结构。
获取LLVMContextImpl
实例:
Module& M = ...
LLVMContextImpl* C = M.getContext().pImpl;
对于已识别的结构:
C->NamedStructTypes
对于文字结构:
C->AnonStructTypes
两者都返回可迭代类型(StringMap
第一个,DenseMap
第二个),允许您迭代它们并获取所有类型。
bool runOnModule(Module &M) override
{
for(auto *S : M.getIdentifiedStructTypes())
{
S->dump();
}
return false;
}
补充 Oak 的答案,这里有一个更完整的代码示例:
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"