Clang 项目的 AST

2024-02-11

我使用 Clang python 绑定来提取 c/c++ 文件的 AST。它非常适合我编写的一个简单程序。问题是当我想将它用于像 openssl 这样的大项目时。我可以为项目的任何单个文件运行 clang,但 clang 似乎错过了项目的一些标头,并且只提供了文件的一些函数的 AST,而不是所有函数。我通过-I设置了包含文件夹,但仍然获得部分功能。

这是我的代码:

import clang.cindex as cl    
cl.Config.set_library_path(clang_lib_dir)
index = cl.Index.create()
lib = 'Path to include folder'
args = ['-I{}'.format(lib)]
translation_unit = index.parse(source_file, args=args)
my_get_info(translation_unit.cursor)

我收到太多头文件未找到错误。

UPDATE

我用Make通过clang编译openssl?我可以将 -emit-ast 选项传递给 clang 来转储每个文件的 ast,但我现在无法通过 clang python 绑定读取它。

有什么线索可以保存翻译单元的序列化表示,以便我能够通过 index.read() 读取它吗?

谢谢你!


您“简单地”需要提供正确的args。但请注意两个可能的问题。

不同的文件可能需要不同的参数进行解析。最简单的解决方案是获取编译数据库 https://clang.llvm.org/docs/JSONCompilationDatabase.html然后从中提取编译命令。如果你这样做,请注意你需要过滤掉一些参数并删除诸如-c FooBar.cpp(可能还有其他一些),否则你可能会得到类似 ASTReadError 的东西。

另一个问题是包含路径(-I ...) 可能相对于源目录。即,如果一个文件main.cpp从目录编译/opt/project/ with -I include/path参数,然后在调用之前index.parse(source_file, args=args)你需要介入(chdir) 进入/opt/project,完成后您可能需要返回到原始工作目录。所以代码可能如下所示(伪代码):

cwd = getcwd()
chdir('/opt/project')
translation_unit = index.parse(source_file, args=args)
chdir(cwd)

我希望它有帮助。

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

Clang 项目的 AST 的相关文章

  • 为什么 macOS 会杀死由 clang 创建的静态可执行文件?

    我有一个用于 m1 arm cpu 的最小 c 程序 返回 42 void start asm mov x0 42 asm mov x16 1 asm svc 0x80 此代码在告诉 clang 使用 start 符号后进行编译并返回正确的
  • 使用遗留头文件作为 c++20 模块

    我正在将旧代码转换为可作为 C 模块导入的代码 问题是我希望它仍然可以工作并且可以像旧的标头 源版本一样轻松维护 我该怎么做 如果可能的话 是否可以创建一个导出标头内容的模块 也可以接受任何其他可以让您维护旧的 cpp h 文件和模块文件的
  • 警告:格式字符串不是字符串文字[重复]

    这个问题在这里已经有答案了 我从以下行收到 格式字符串不是字符串文字 警告 NSString formattedString NSString alloc initWithFormat format arguments valist 我在以
  • 用于代码分析的 Java 库

    有没有任何 Java 库可以帮助构建AST http en wikipedia org wiki Abstract syntax tree来自指定的 java 源文件 反之亦然 从 ASTree 对象生成代码 我需要类似的东西this ht
  • LLVM 执行哪些优化?

    我想具体了解一下LLVM的各个优化级别分别对应什么 也就是说 我想知道当我使用 llvm 或 clang 或 opt 的 0x 选项时 哪些优化过程是准确执行的 在前端之外 以及按什么顺序执行 相应工具的 man 没有提供关于此事的太多信息
  • 从源代码构建 Clang 时什么时候需要 libc++ 源代码?

    我多年来一直在 Linux 和 OS X 上构建 Clang LLVM 下载页面 http llvm org releases download html 我一直使用以下来源 LLVM LLVM 源 编译器前端 Clang 源 编译器 RT
  • 获取Apple clang版本和对应的上游LLVM版本

    我想了解我的 macbook 中安装了哪个版本的 clang Apple 以查看 c 11 和 或 c 14 功能是否可用 我输入了这个命令 clang version response Apple LLVM version 7 0 0 c
  • 统一不同 clang-format 版本的输出

    我们尝试使用 clang format 工具稍微美化我们的代码 为了在我们所做的所有机器上获得统一的结果clang format style llvm dump config 已进行了一些调整并存储到 repo 中 问题是 clang 10
  • 如何嵌入LLVM?

    LLVM 核心项目包括 编译器 将源代码转换为 LLVM IR VM 执行编译后的IR代码 如何将 VM 嵌入到 C 应用程序中 LLVM 实际上是一个可以链接到的库的集合 因此嵌入起来非常容易 更多时候 LLVM 会获取您生成的 IR 并
  • 未优化的 clang++ 代码在简单的 main() 中生成不需要的“movl $0, -4(%rbp)”

    我创建了一个最小的 C 程序 int main return 1234 并使用 clang 5 0 禁用优化 默认 O0 得到的汇编代码是 https gcc godbolt org z OYLghAFBqd5QCxAYwPYBMCmBRd
  • 解析树和抽象语法树(AST)有什么区别?

    它们是由编译过程的不同阶段生成的吗 或者它们只是同一事物的不同名称 这是基于表达评估器 http www antlr3 org works help tutorial calculator html泰伦斯 帕尔的语法 本例的语法 gramm
  • 在 Clang 中以可移植且最佳的方式将 uint64_t 转换为字节数组

    如果你想转换uint64 t to a uint8 t 8 小端 在小端架构上你可以做一个丑陋的reinterpret cast lt gt or memcpy e g void from memcpy const std uint64 t
  • Clang C++ 抑制每个文件的 -Wno-deprecated-声明

    在 Xcode 中 在项目级别我有以下设置 Xcode 设置以抑制不推荐使用的函数警告 https i stack imgur com 4eNeY png 这会将 Wno deprecated declarations 添加到编译中 我可以
  • 使用 Java 通过访问者模式从 AST 构建控制流图

    我试图弄清楚如何实现我的 LEParserCfgVisitor 类 以便从已使用 JavaCC 生成的抽象语法树构建控制流图 我知道已经存在一些工具 但我正在尝试这样做 为我的编译器期末考试做准备 我知道我需要一个将图形保存在内存中的数据结
  • Clang 和二进制折叠表达式 — 空参数包的诅咒

    具体来说 Clang 3 6 0 目前由 Coliru 托管 所有这些片段都是从以下位置调用的 int main foo std cout lt lt n n foo 1 2 3 以下代码 template
  • 防止运行测试时优化掉未使用的静态函数

    我正在编写一个将利用 LLVM 的库 通过inkwell https github com TheDan64 inkwell 来 JIT 编译一些函数 这些函数需要能够回调我的代码中的一些 Rust 函数 我让它工作 但我的单元测试不起作用
  • 指定不同访问器中静态局部变量的构造/销毁顺序

    我遇到了崩溃cxa finalize运行一个程序 这是一个程序 而不是其中的库 ac test exe Assertion failed AcLock cpp 54 AcLock libc abi dylib terminate calle
  • clang 上的尾随参数包缺少默认参数

    Clang 抱怨尾随参数包不是默认的 但据我所知它是标准的并且是可能的 我做错了吗还是clang的错误 这是我的仓库 如果你想查看完整的源代码 是这里 https github com OzanCansel speech blob mast
  • Spirit qi 解析为嵌套函数的抽象语法树

    我正在尝试使用 boost 的spirit qi 解析器创建一个解析器 它正在解析包含三种类型值的字符串 常量 变量或函数 这些函数可以相互嵌套 测试字符串是f a b f g z x g x h x c where a e是常数 f r是
  • 如何编译LLVM Kaleidscope教程?

    我之前一直在 C 中使用 LLVM 其中包含一个 Nuget LLVM 库 我转向 C 并尝试遵循万花筒教程 https llvm org docs tutorial LangImpl03 html 不幸的是我不知道如何编译它 我保存了第三

随机推荐