问题标签 [libclang]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
372 浏览

c - libclang 获取宏扩展的 AST 树

我目前正忙于使用 libclang 库。

我的目标是解析包含带有参数的宏的代码并获取宏参数的类型以进行语法着色。

如果我们考虑下面这段代码

我的目标是能够对行a结构的字段进行着色。即,每当我将光标悬停在变量字段上时,我都想获取行、列和类型。aTypeint var = MACRO(data.a)adata

问题是,每当我将光标放在 character 的位置时a,它的类型都是CXCursor_MacroExpansion. 我已经尝试获取引用的游标(通过clang_getCursorReferenced),但后来我得到了一个游标类型CXCursor_MacroDefinition

我也已经尝试通过访问孩子,clang_visitChildren但这也返回了光标本身,所以它没有用。

如果我可以从带有 type 的光标中得到一个带有 typeCXCursor_MemberRefExpr的光标,CXCusor_MacroExtension我就会得到我需要的东西。

CXCursor_MacroExpansion每当光标位于宏扩展上时,有谁知道如何实际获取扩展代码 iso 获取的信息?

非常感谢您的时间和帮助。

亲切的问候,

洛朗

0 投票
0 回答
590 浏览

libclang - 如何使用 clang libtooling 更改特定的 ctor 定义

我只想重写特定的ctor定义。为了找到改变我使用“正常”DeclarationMatcher 的女巫

找到特定的类/ctor 非常有用,但是我如何在 cpp 类中从标题切换到定义。运行工具的命令是:

为了处理回调,我使用 MatchCallback:

正如您从描述 m_rewriter.InsertText 中所知道的那样,它根本不适合我(没有更改标题)。

输入文件derived_t1.h:

输入文件derived_t1.cpp:

整个示例工具:

因此,如果有人知道如何在 cpp 文件中更改该 ctor 这将对我有很大帮助。谢谢

0 投票
1 回答
803 浏览

python - 使用 libclang 在 python 中解析 C 但生成了错误的 AST

我想使用 libclang 绑定 python 来生成 C 代码的 AST。好的,源代码如下图所示。

我写的一个实现:

但是这个测试的最终输出如下:

显然,最后的结果是错误的。有很多代码没有被解析。我试图遍历翻译单元,但结果就像树显示的那样——许多节点都消失了。为什么会这样?有什么方法可以解决这个问题吗?谢谢!

我猜原因是 Libclang 无法解析 malloc()。因为此代码中既没有包含 stdlib,也没有为 malloc 提供用户定义的定义。

0 投票
2 回答
2481 浏览

c++ - 使用 libclang 从内存中的 C 代码生成程序集

我需要实现一个库,该库使用 LLVM/Clang 作为后端将 C 代码编译为 eBPF 字节码。这些代码将从内存中读取,我也需要在内存中获取生成的汇编代码。

到目前为止,我已经能够使用以下代码编译为 LLVM IR:

要编译,我使用以下 CMakeLists.txt:

如果我理解正确,如果我将编译器操作更改为 EmitAssemblyAction(),我应该能够生成汇编代码,但我可能没有初始化某些东西,因为我在 llvm::TargetPassConfig::addPassesToHandleExceptions 中遇到分段错误(这个=this@entry=0x6d8d30) 在 /tmp/llvm-3.7.1.src/lib/CodeGen/Passes.cpp:419

这一行的代码是:

有没有人有一个例子或知道我错过了什么?

0 投票
1 回答
1494 浏览

python - 使用 libclang 查找匿名枚举

有没有办法使用 libclang 检测匿名枚举而不依赖拼写名称中的文本?

与libclang的 python 绑定包括使用clang.cindex.Cursor.is_anonymous检测 C/C++ 结构或联合是否匿名的功能,最终调用clang_Cursor_isAnonymous

以下示例演示了该问题。

在 sample.cpp 上运行时

给出:

0 投票
1 回答
338 浏览

c++ - 用于 libclang 的 c++ 绑定

我知道 python 绑定以及原始的 c lang 编写的 libclang,但我正在尝试在教室中使用它,并且我们教 c++。因此,如果有人知道 c++ 绑定,那么动手将非常有帮助。

参考 - http://clang.llvm.org/doxygen/group__CINDEX.html

0 投票
0 回答
113 浏览

java - Java -> JNA -> libclang: 调用 clang_visitChildren 的致命错误

我为 LibClang API 编写了 java 包装器。clang_visitChildren 的包装器适用于相对较小的 c 源文件(少于 200 个一级子文件)。但它在 550-560 一级子区域中因更大的源文件而崩溃。我的回调返回 1(即一级循环,不是递归的)。消息如下:

有人可以就问题解决的可能方式给我很好的建议吗?

0 投票
1 回答
255 浏览

clang - libclang 不发出某些 AST 节点

我正在使用go-clang库来解析以下 C 文件:aac.c。出于某种原因,当我通过 clang 运行文件并转储 AST 时,我没有获得某些功能的 AST 输出。例如,C 文件包含文件的前向声明aac_ioctl_send_raw_srb和后面的实际定义。

鉴于此,我希望在输出中看到两个 AST 节点,但只有一个FuncDecl(前向声明)被转储:

(忽略错误)

我使用 go-clang 库从我自己的应用程序中解析 C 文件得到了相同的结果。有没有解释为什么定义没有被丢弃?

0 投票
1 回答
727 浏览

python - 使用 libclang 解析命名空间函数

我无法使用 libclang 解析 C++ 中命名空间函数的主体。

我在命名空间中有一个类,如下所示:

使用 libclang 的 python 包装器,我可以通过递归找到每个节点:

我能够检测到 NTOHS 的使用情况myMethodmyFunction打印有关这些节点的信息,但无法在MyClass::anotherMethod.

其他人遇到了类似的问题,但似乎没有得到解答。

这里的 NTOHS 只是用于将网络转换为主机顺序的 linux/unix 命令。

如何使用 libclang 检测命名空间函数中的 NTOHS?

0 投票
1 回答
146 浏览

python - 模板化构造函数游标和模板化成员游标在 libclang 中具有类型 FUNCTION_TEMPLATE

一些上下文

我对 libclang 不是很熟悉。我只是在修改一个使用python 绑定到 libclang的 vim 插件。

有一个接收游标参数的python函数。对于当前 C++ 缓冲区的 AST 中的几乎每个节点都会调用此方法。

问题

cursor.kind用于获取光标的种类。一切都好,除了

  • 模板化的自由函数声明,
  • 模板化的构造函数声明和
  • 模板化方法声明

都有相同的种类:FUNCTION_TEMPLATE。我需要区分它们。

更多见解

例如,上述的非模板版本有以下几种:

  • FUNCTION_DECL
  • CXX_METHOD
  • CONSTRUCTOR.

我搜索了cindex.py的来源,没有CXX_METHOD_TEMPLATECONSTRUCTOR_TEMPLATE类似的。

我曾尝试以某种方式获取我需要的信息,例如使用cursor.get_definition()and ,但没有成功cursor.underlying_typedef_type.get_declaration()

我获得的唯一部分成功是,对于方法和构造函数,语义和词法父级是STRUCT_DECL.

我真的不在乎它是否是模板化的。我只关心它是构造函数、成员还是自由函数。

把它们加起来

给定一个游标,我如何判断它是方法(甚至是模板化的)、构造函数(甚至是模板化的)还是自由函数声明?