如何正确实现 LLVM InstVisitor?

2023-11-30

为了学习 LLVM,我制作了一个 ModulePass,它贯穿了函数、基本块和最后的指令。在某些时候,我想深入研究说明并进行分析。在阅读文档时我遇到了http://llvm.org/docs/doxygen/html/classllvm_1_1InstVisitor.html并且文档建议使用这些结构来有效地遍历 IR,而不是做大量的操作if(auto* I = dyn_cast<>()) lines.

我尝试对文档示例进行变体,但是对于BranchInst:

struct BranchInstVisitor : public InstVisitor<BranchInst> {                                               
    unsigned Count;                                                                                       
    BranchInstVisitor() : Count(0) {}                                                                     

    void visitBranchInst(BranchInst &BI){                                                                 
        Count++;                                                                                          
        errs() << "BI found! " << Count << "\n";                                                          
    }                                                                                                     

}; // End of BranchInstVisitor

在我的ModulePass,我创建了访客:

for(Module::iterator F = M.begin(), modEnd = M.end(); F != modEnd; ++F){
    BranchInstVisitor BIV; 
    BIV.visit(F);
    ...

不幸的是,我打电话给visit(F)当我编译时失败:

error: invalid static_cast from type ‘llvm::InstVisitor<llvm::BranchInst>* const’ to type ‘llvm::BranchInst*’ static_cast<SubClass*>(this)->visitFunction(F);

如何正确实现 LLVM InstVisitor? InstVisitors 是否应该在通行证之外运行?如果我错过了文档,请告诉我该去哪里。


模板参数应该是您声明的类型,而不是指令类型,如下所示:

struct BranchInstVisitor : public InstVisitor<BranchInstVisitor>

每个访问者可以覆盖任意数量的visit*你想要的方法——并不是每个访问者都依赖于一种类型的指令。那不会很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何正确实现 LLVM InstVisitor? 的相关文章

  • LLVM IR 指令和源代码行之间的映射

    如果使用 llvm gcc 或 Dragonegg 我如何存储 LLVM IR 指令和源代码行之间的映射 内部 LLVM IR 调试信息应用于此目的 看http llvm org docs SourceLevelDebugging html
  • 使用 python libclang 检索评论

    在下面的头文件中我想得到相应的 reflect对类和成员变量的注释 ifndef HEADER FOO define HEADER FOO reflect class Foo public private int m int reflect
  • Xcode“来自调试器的消息:对 k 数据包收到意外响应:正常”

    在模拟器上测试我的应用程序时收到此消息 来自调试器的消息 对 k 数据包收到意外响应 正常 这是什么意思 我的应用程序是否存在任何危险 使用 Xcode 6 4 和 7 2 如果你看一下文件进程GDBRemote cpp http llvm
  • 对于使用块的 clang 程序,您需要链接哪些库

    我发现 如下 在编译使用块的代码时需要使用 fblocks 我需要链接哪个库才能让链接器解析 NSConcreteStackBlock 在 Ubuntu 9 10 AMD64 上 chris chris desktop clang ctes
  • 如何强制 Xcode 使用自定义编译器?

    我想强制 Xcode 使用自定义编译器 从 src 构建的 clang llvm 以便我可以使用 clang 插件 我的Xcode版本是7 3 1 人们说使用自定义工具链是可能的 我没有对它们进行研究 因为更简单的解决方案对我来说效果很好
  • 通过修改LLVM Backend来Clobber X86寄存器

    我正在尝试稍微改变 X86 目标的 LLVM 后端 以产生一些所需的行为 更具体地说 我想模拟一个像 gcc 的 fcall used 这样的标志reg option https gcc gnu org onlinedocs gcc Cod
  • 可以从 LLVM-IR 自动生成 llvm c++ api 代码吗?

    clang 3 0 在线演示页面http llvm org demo index cgi http llvm org demo index cgi提供输出 LLVM C API 代码的选项 表示输入程序的 LLVM IR 生成 LLVM C
  • 在 llvm 上运行 x86 程序

    是否可以使用llvm来运行x86程序 IE 我想使用 llvm 作为 x86 模拟器来运行 x86 程序 然后对 x86 程序进行检测 Thanks 我想你正在寻找LibCPU http LibCPU Org It has x86 前端 h
  • LLVM 的 amd64 输出中向量的对齐

    我正在尝试通过 LLVM 在结构内部使用向量 我的结构有以下 C 定义 struct Foo uint32 t len uint32 t data 32 attribute aligned 16 下面是一些 LLVM 代码 用于将 42 添
  • 如何使用 LLVM IRBuilder 从外部 DLL 调用函数?

    如何从 LLVM 调用外部 DLL 的函数 如何从 LLVM 代码调用 DLL 文件中定义的函数 由于您的问题缺少重要信息 我猜您想实现以下目标 我猜你会使用 c c 接口并且该函数有一个签名void fun void 我还猜测您将使用 L
  • LLVM 6.0.0 的构建大小很大 (42G)

    I built llvm 6 0 0从源头开始 一切正常 我只是想知道它的尺寸怎么这么大 42G 我可以轻松删除一些目标文件或其他文件以使构建目录更小吗 du hs GIT llvm 6 0 0 build 42G home oren GI
  • 如果别名会降低运行时性能,为什么编译器要执行别名?

    我出于纯粹的兴趣而学习 C 和计算机科学主题 这让我对编译器产生了兴趣 我读过的所有内容都告诉我 别名会导致程序集输出速度变慢 需要在每次迭代时重新加载值 我已经能够使用 Intel C C 编译器使用该标志在一些基准测试中获得轻微的提高
  • 使用 Clang AST 打印函数的参数

    我想将参数传递给函数 例如 如果我接到电话 printf d d i j 输出应该是 d dij 我可以使用 RecursiveASTVisitor 中的 VisitCallExpr 进行函数调用 还能够获取参数数量和参数类型 但我不知道如
  • 使用 libclang 从内存中的 C 代码生成程序集

    我需要实现一个使用 LLVM Clang 作为后端将 C 代码编译为 eBPF 字节码的库 代码将从内存中读取 我也需要在内存中获取生成的汇编代码 到目前为止 我已经能够使用以下代码编译为 LLVM IR include
  • 链接 llvm 库

    我正在开发一个基于 llvm 的编译器 当我尝试生成可执行文件时 会发生以下错误 bin llvmcode s 35 对 operator new unsigned long 的未定义引用 请注意 在生成的 IR 中 调用了位于 llvm
  • 字节码和位码有什么区别[重复]

    这个问题在这里已经有答案了 可能的重复 LLVM 和 java 字节码有什么区别 https stackoverflow com questions 454720 what are the differences between llvm
  • LLVM cpp 后端,它会取代 c 后端吗?

    我的问题是关于 CPP 后端 它与 C 后端的用途相同吗 C 后端是我最喜欢的 LLVM 功能之一 我对它被删除感到非常沮丧 真正的区别是什么 我非常感谢任何帮助 参考 LLVM 3 1 发行说明 http llvm org release
  • 如何在 LLVM IR 中使用 RISC-V Vector (RVV) 指令?

    In 这个演示文稿 https llvm org devmtg 2019 04 slides TechTalk Kruppe Espasa RISC V Vectors and LLVM pdfKruppe 和 Espasa 概述了 RIS
  • 如何从 LLVM 指令获取文件名和目录?

    我需要在 llvm 过程中提取目录和文件名 当前版本的 llvm 已移动getFilename and getDirectory from DebugLoc to DebugInfoMetadata 我找不到班级成员getFilename直
  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题

随机推荐