遍历模块中的所有结构
Iterate over all structs in a module
我正在编写一个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"
相关文章:
- 如何循环打印顶点结构
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 预处理器:插入结构名称中的前一个行号
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 孤立代码块在结构中引发异常
- 有什么方法可以遍历结构吗
- 尝试导入pybind-opencv模块时出现libgtk错误
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 无法将结构注册为增强几何体3D点
- 多成员Constexpr结构初始化
- C++将文本文件中的数据读取到结构数组中
- 如何重构类层次结构以避免菱形问题
- CMAKE-输出目录结构和QML模块
- C 模块体系结构,模块循环依赖性
- 不同模块中的ambigus结构定义
- C++ 结构函数体调用另一个结构函数,同一个模块
- Python扩展模块包结构(命名空间)
- 遍历模块中的所有结构