遍历模块中的所有结构

Iterate over all structs in a module

本文关键字:结构 模块 遍历      更新时间:2023-10-16

我正在编写一个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"