迭代模块中的所有结构

问题描述 投票:0回答:5

我正在编写一个 ModulePass,我需要分析给定模块中定义的every结构。

我知道具有名称的已识别结构已插入 ValueSymbolTable 中,但如何迭代所有其他结构(未识别名称和文字结构)?

c++ types llvm type-systems llvm-ir
5个回答
6
投票

正确的做法是:

#include "llvm/IR/TypeFinder.h"

llvm::TypeFinder StructTypes;
StructTypes.run(M, true);

for (auto *STy : StructTypes)
  STy->dump();

您不应使用任何标头未发布的私有/不透明类型(如 LLVMContextImpl)。


2
投票

与当前上下文关联的

LLVMContextImpl
实例应该有两个数据结构,一个包含当前上下文中所有已识别的结构(无论它们是否有显式名称),另一个包含所有文字结构。

获取

LLVMContextImpl
实例:

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

对于已识别的结构:

C->NamedStructTypes

对于文字结构:

C->AnonStructTypes

两者都返回可迭代类型(第一个为

StringMap
,第二个为
DenseMap
),允许您迭代它们并获取所有类型。


2
投票
bool runOnModule(Module &M) override
{
    for(auto *S : M.getIdentifiedStructTypes())
    {
        S->dump();
    }
    return false;
}

1
投票

补充 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"

0
投票

这是一个非常简单的问题,为什么要浪费时间。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.