首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用clang Libtooling API打印完全限定类型的参数(ParmVarDecl)或字段(FieldDecl

使用clang Libtooling API打印完全限定类型的参数(ParmVarDecl)或字段(FieldDecl)的步骤如下:

  1. 导入必要的头文件:
代码语言:txt
复制
#include "clang/AST/AST.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
#include "llvm/Support/CommandLine.h"
  1. 创建一个ASTConsumer类,用于处理AST节点:
代码语言:txt
复制
class MyASTConsumer : public clang::ASTConsumer {
public:
  virtual bool HandleTopLevelDecl(clang::DeclGroupRef DG) {
    for (clang::DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) {
      clang::Decl *D = *I;
      if (clang::ParmVarDecl *PVD = llvm::dyn_cast<clang::ParmVarDecl>(D)) {
        // 处理参数(ParmVarDecl)
        llvm::outs() << "参数类型: " << PVD->getType().getAsString() << "\n";
      } else if (clang::FieldDecl *FD = llvm::dyn_cast<clang::FieldDecl>(D)) {
        // 处理字段(FieldDecl)
        llvm::outs() << "字段类型: " << FD->getType().getAsString() << "\n";
      }
    }
    return true;
  }
};
  1. 创建一个ASTMatcher类,用于匹配参数或字段:
代码语言:txt
复制
class MyASTMatcher : public clang::ast_matchers::MatchFinder::MatchCallback {
public:
  virtual void run(const clang::ast_matchers::MatchFinder::MatchResult &Result) {
    if (const clang::ParmVarDecl *PVD = Result.Nodes.getNodeAs<clang::ParmVarDecl>("parmVarDecl")) {
      // 匹配到参数(ParmVarDecl)
      llvm::outs() << "参数类型: " << PVD->getType().getAsString() << "\n";
    } else if (const clang::FieldDecl *FD = Result.Nodes.getNodeAs<clang::FieldDecl>("fieldDecl")) {
      // 匹配到字段(FieldDecl)
      llvm::outs() << "字段类型: " << FD->getType().getAsString() << "\n";
    }
  }
};
  1. 在主函数中创建一个ClangTool对象,并注册ASTConsumer和ASTMatcher:
代码语言:txt
复制
int main(int argc, const char **argv) {
  clang::tooling::CommonOptionsParser OptionsParser(argc, argv);
  clang::tooling::ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList());

  MyASTConsumer Consumer;
  Tool.setASTConsumer(&Consumer);

  MyASTMatcher Matcher;
  clang::ast_matchers::MatchFinder Finder;
  Finder.addMatcher(clang::ast_matchers::parmVarDecl().bind("parmVarDecl"), &Matcher);
  Finder.addMatcher(clang::ast_matchers::fieldDecl().bind("fieldDecl"), &Matcher);

  return Tool.run(clang::tooling::newFrontendActionFactory(&Finder).get());
}
  1. 编译并运行代码,将会打印出参数(ParmVarDecl)和字段(FieldDecl)的完全限定类型。

这是一个使用clang Libtooling API打印完全限定类型的参数(ParmVarDecl)或字段(FieldDecl)的示例代码。你可以根据实际需求进行修改和扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

www6663388com请拨18687679362环球国际iOS 微信编译速度优化分享

Xcode 编译源文件时,会根据 Header Search Paths 自动添加 -I 参数,如果递归引用路径下子目录越多,-I 参数也越多,编译器预处理头文件效率就越低,所以不能简单设置路径递归引用...数字常量 numeric_constant 等等 语法分析(Semantic Analysis):将 token 流组成抽象语法树 AST 静态分析(Static Analysis):检查代码错误,例如参数类型是否错误...接下来修改工程 CC={YOUR PATH}/clang,让 Xcode 编译时使用自己编译器;同时编译选项 OTHER_CFLAGS 后面增加 -ftime-trace,每个源文件编译后输出耗时报告...bool VisitFunctionDecl(clang::FunctionDecl* decl) { // FunctionDecl 下所有参数声明允许前置声明取代 include...不过早在 2011 年 Google 内部做了个基于 Clang libTooling 工具 include-what-you-use,用来整理 C/C++ 头文件,效果如下: ➜ include-what-you-use

2.3K20

iOS 微信编译速度优化分享

Xcode 编译源文件时,会根据 Header Search Paths 自动添加 -I 参数,如果递归引用路径下子目录越多,-I 参数也越多,编译器预处理头文件效率就越低,所以不能简单设置路径递归引用...数字常量 numeric_constant 等等 语法分析(Semantic Analysis):将 token 流组成抽象语法树 AST 静态分析(Static Analysis):检查代码错误,例如参数类型是否错误...接下来修改工程 CC={YOUR PATH}/clang,让 Xcode 编译时使用自己编译器;同时编译选项 OTHER_CFLAGS 后面增加 -ftime-trace,每个源文件编译后输出耗时报告...bool VisitFunctionDecl(clang::FunctionDecl* decl) { // FunctionDecl 下所有参数声明允许前置声明取代 include...不过早在 2011 年 Google 内部做了个基于 Clang libTooling 工具 include-what-you-use,用来整理 C/C++ 头文件,效果如下: ➜ include-what-you-use

10K128

微信团队分享:极致优化,iOS版微信编译速度3倍提升实践总结

Xcode 编译源文件时,会根据 Header Search Paths 自动添加 -I 参数,如果递归引用路径下子目录越多,-I 参数也越多,编译器预处理头文件效率就越低,所以不能简单设置路径递归引用...静态分析(Static Analysis):检查代码错误,例如参数类型是否错误,调用对象方法是否有实现; d....接下来修改工程 CC={YOUR PATH}/clang,让 Xcode 编译时使用自己编译器;同时编译选项 OTHER_CFLAGS 后面增加 -ftime-trace,每个源文件编译后输出耗时报告...因此我们可以做这样工具,通过 AST 找到代码里出现标识符(包括类型、函数、宏),以及标识符定义所在文件,然后分析是否需要 include 它定义所在文件。...不过早在 2011 年 Google 内部做了个基于 Clang libTooling 工具 include-what-you-use,用来整理 C/C++ 头文件。

2.4K43

ASTMatcher分析函数调用链(上)

plugin,二是libtooling 1、clang plugin clang plugin:clang插件作为编译一部分,在编译器运行时加载,很容易集成到构建环境中。...这样通过替换xcode中clang编译器和加载clang插件分析AST,可以完全控制clang AST。编写插件有三步:自定义类继承、重载、注册插件。...2、libtooling libtooling:代码本身是一个正常C++程序,以正常main()函数作为入口。...在官网AST Matcher Reference中可以查看clang提供所有不同类型匹配器以及说明,主要分为三类(取自【clang】ASTMatcher & clang-query描述): Note...5、使用ASTMatcher 文件中若import其他文件,ASTMatcher是分析不到,这时你必须告诉ASTMatcher你import文件来自哪里,所以被分析文件import文件目录必须通过参数

6.9K81

iOS底层原理之LLVM & Clang

1.3: LLVM设计 当编译器决定支持多种源语言多种硬件架构时,LLVM最重要地方就来了。 LLVM设计最重要方面是,使用通用代码表示形式(IR),它是用来在编译器中表示代码形式。...2.1: 编译流程 通过下面命令可以打印源码编译阶段: clang -ccc-print-phases main.m 打印结果如下: 输入文件:找到源文件。...char **)' // 第一个参数 |-ParmVarDecl 0x1298ad4e0 col:14 argc 'int' // 第二个参数 |-ParmVarDecl.../main (滑动显示更多) 大家可能会疑惑,生成汇编文件就已经是编译器后端工作了,为什么还是使用clang命令呢?这是因为我们使用clang提供接口调起后端相应功能。...本文主要介绍了下LLVM和Clang相关概念、设计思想和编译流程,下篇文章将使用LLVM和Clang实现一个简单插件,敬请期待。

1.4K10

微信安全下一代特征计算引擎探索与实践

每个方案都有各自优劣,实际工程可以根据需求进行选择组合。在业界,许多选择使用Python引擎、Lua引擎两者组合来执行用户编辑Python脚本Lua脚本。...Sema语义检查 语义检查包括变量过程未经声明就使用、变量过程名重复声明、运算分量类型不匹配、操作符与操作数之间类型不匹配。...) BuiltInType(内置类型) PointerType(指针类型) ArrayType(数组类型) 使用Clang-ast-dump查看输出AST详细结构 clang -c -Xclang...**函数,EmitGlobalFunctionDefiniton为函数factorial输出LLVM IR,递归访问FunctionDeclAST子节点 调用栈10-8: 函数定义由参数列表ParmVarDecl...考虑到微信后台主要使用C/C++语言,因此采用C/C++语言WebAssembly方案和类C/C++语言DSL是不错选择,结合Python和Lua完全能满足业务需求。

20710

深入剖析 iOS 编译 Clang LLVM

.m 文件 clang 参数信息,这些参数都是通过Build Setting。...attribute((const)) 重复调用相同数值参数优化返回 用于数值类型参数函数,多次调用相同数值型参数,返回是相同,只在第一次是需要进行运算,后面只返回第一次结果,这时编译器一种优化处理方式...使用这个库可以直接使用 C API,官方也提供了 python binding。...LibTooling 对语法树完全控制 因为 LibTooling 能够完全控制语法树,那么可以做事情就非常多了。 可以改变 clang 生成代码方式。 增加更强类型检查。...按照自己定义进行代码检查分析。 对源码做任意类型分析,甚至重写程序。 给 clang 添加一些自定义分析,创建自己重构器。 基于现有代码做出大量修改。 基于工程生成相关图形文档。

7.7K20

Objective-C源文件编译过程

如下命令可以对.c、.m源文件进行预处理,其中参数-E就是对源文件进行预处理操作: clang -E xxx.m 如果我们.m文件中import(文件包含)了其他文件或者其他库,执行以上命令对OC...比如类型不匹配,未实现对应方法。 AST是开发者编写clang插件主要交互数据结构,clang也提供很多API去读取AST。详情参考:Introduction to the Clang AST。...语义分析过程同时也收集类型信息,并把类型信息存储在语法树符号表中,以便随后中间代码生成过程中使用。 语义分析一个重要部分就是“类型检查”和“自动类型转换”。...如果a和b都是整型浮点型,这说明“+”运算符具有匹配运算分量。如果ab其中一个是字符串类型,则说明“+”运算符不具备匹配运算分量。...那么语法分析和语义分析都完成后,clang会遍历AST生成一种明确、低级类机器语言中间表示。

9.5K51

NumPy 1.26 中文文档(五十六)

(gh-15006) f2py 支持从派生类型语句中读取访问类型属性 因此,不需要使用publicprivate语句来指定派生类型访问属性。...使用quotechar='"'将读取 Excel CSV 方言中使用带引号字段。 此外,现在可以传递单个可调用对象而不是字典作为converters参数。...(gh-15006) f2py 支持从派生类型语句中读取访问类型属性 因此,不需要使用publicprivate语句来指定派生类型访问属性。...使用quotechar='"'将读取 Excel CSV 方言中使用带引号字段。 此外,现在可以传递单个可调用对象而不是字典给converters参数。...(gh-15006) f2py 支持从派生类型语句中读取访问类型属性 因此,不需要使用 public private 语句来指定派生类型访问属性。

8410

BCC和libbpf转换

此外,注意BPF CO-RE用到很多Clang特性都比较新,需要用到Clang 10更新版本 可以参照官方文档升级Clang: git clone https://github.com/llvm...配置用户空间 生成必要内容 构建基于libbpfBPF应用需要使用BPF CO-RE包含几个步骤: 生成带所有内核类型头文件vmlinux.h 使用Clang(版本10更新版本)将BPF程序源代码编译为...BPF应用包含一组BPF程序(合作完全独立),以及在所有的BPF程序间共享BPF maps和全局变量(允许操作共同数据)。...在大多数情况下,用于访问tracepoint 上下文数据代码完全相同,但特殊可变长度字符串字段除外。...这种情况下,使用日志输出是最好选择。使用bpf_printk(fmt, args...)打印输出额外信息来理解发生事情。该函数接受printf类格式,最大支持3个参数

1.8K00

“C不再是一种编程语言”

这是说要以 C 语言头文件方式描述接口类型和函数,并以某种方式做一些事情: 匹配这些类型布局; 用链接器做一些事情,将函数符号解析为指针; 用适当 ABI 来调用这些函数(比如把参数放在正确寄存器中...这是一个相当重要、表现良好平台。这里测试是一些非常令人厌烦情况,即一些整型参数在两个由 clang 和 gcc 编译静态库之间按值传递……而且失败了!...让你“codegen”直接生成 C(++),这样用户就需要一个 C 编译器。 基于一个成熟主流 C 编译器(gcc clang)构建自己编译器。...如果有多个东西基于你库构建,它们在类型不透明情况下相互调用,就会出现糟糕情况: lib1:开发一个 API使用类型 MyRadType* 调用 use_val; lib2:调用 make_val...当然,libc 可以适当地使用符号版本化技巧,使其 API 可以适应新定义,但是,改变一个基本数据类型(像 intmax_t)大小,会在更大平台生态系统中引发混乱。

56920

“C不再是一种编程语言”

这是说要以 C 语言头文件方式描述接口类型和函数,并以某种方式做一些事情: 匹配这些类型布局; 用链接器做一些事情,将函数符号解析为指针; 用适当 ABI 来调用这些函数(比如把参数放在正确寄存器中...这是一个相当重要、表现良好平台。这里测试是一些非常令人厌烦情况,即一些整型参数在两个由 clang 和 gcc 编译静态库之间按值传递……而且失败了!...让你“codegen”直接生成 C(++),这样用户就需要一个 C 编译器。 基于一个成熟主流 C 编译器(gcc clang)构建自己编译器。...如果有多个东西基于你库构建,它们在类型不透明情况下相互调用,就会出现糟糕情况: lib1:开发一个 API使用类型 MyRadType* 调用 use_val; lib2:调用 make_val...当然,libc 可以适当地使用符号版本化技巧,使其 API 可以适应新定义,但是,改变一个基本数据类型(像 intmax_t)大小,会在更大平台生态系统中引发混乱。

64121

C 不再是一种编程语言

结果发现,一些整数参数在两个由Clang和GCC编译静态库之间按值传递失败了! Aria发现,Clang和GCC甚至不能就Linux x64上_int128ABI达成一致。...C编译器 将你编译器建立在一个成熟主要C编译器(ClangGCC)之上 但上面这些也只能让你走这么远,因为除非你语言真的暴露了unsigned long long,否则你将继承C巨大可移植性混乱...你有两个选择来处理这个问题: 1.说这是被禁止,责备那些无论如何都要这么做的人,然后伤心 2.以一种向前兼容方式设计MyRadType,这样混合就可以了 常见前向兼容技巧包括: 保留未使用字段供未来版本使用...如果他们需要在最后增加更多字段,那也没关系,因为旧版本可以使用这个值来检测头“版本”,也可以跳过任何他们不知道字段。 SizeOfDescriptor是数组中每个元素大小。...当然,libc可以适当地使用符号版本技巧来使其API与新定义兼容,但改变像 intmax_t这样基本数据类型大小,是在一个平台大生态系统中寻求混乱。

75310

C 不再是一种编程语言

结果发现,一些整数参数在两个由Clang和GCC编译静态库之间按值传递失败了! Aria发现,Clang和GCC甚至不能就Linux x64上_int128ABI达成一致。...C编译器 将你编译器建立在一个成熟主要C编译器(ClangGCC)之上 但上面这些也只能让你走这么远,因为除非你语言真的暴露了unsigned long long,否则你将继承C巨大可移植性混乱...你有两个选择来处理这个问题: 1.说这是被禁止,责备那些无论如何都要这么做的人,然后伤心 2.以一种向前兼容方式设计MyRadType,这样混合就可以了 常见前向兼容技巧包括: 保留未使用字段供未来版本使用...如果他们需要在最后增加更多字段,那也没关系,因为旧版本可以使用这个值来检测头“版本”,也可以跳过任何他们不知道字段。 SizeOfDescriptor是数组中每个元素大小。...当然,libc可以适当地使用符号版本技巧来使其API与新定义兼容,但改变像 intmax_t这样基本数据类型大小,是在一个平台大生态系统中寻求混乱。

68230

gRPC in ASP.NET Core 3.0 -- Protocol Buffer(1)

是指字段(Field)类型 4. 字段名称 5. 字段数值(也叫Tag),这个数字是唯一。它们是用来在信息格式里识别你字段,一旦该类型使用了,那么这个数字就不要再改变了。...重复字段(Repeated) 与singular相对就是repeated。如果你想做一个list数组的话,你可以使用重复字段这个概念。这个list可以有任何数量(包括0)元素。...保留字段 如果你对你定义消息类型进行了更新,例如删除某个字段或者注释掉某个字段,那么其它开发者在以后更新这个消息类型时候可能会重新使用被你删除/注释掉字段数值(tag)。...那么一种避免此类事情发生解决办法就是将你删除/注释掉这些字段数值(/并且包括字段名,因为字段名可引起JSON序列化问题)标记为reserved,如果其他人再使用这个数值作为字段标识符,那么编译器就会有错误提示...数值和常量名也必须分开使用两个reserved语句。 其中max表示可能最大值。 使用其它信息类型 可以使用其它信息类型作为字段类型

1.1K30

BTF:实践指南

现在在更高版本内核中,在该变量之前添加了其他字段,导致访问字段偏移量变成了 24,这会导致 BPF 程序在偏移量 8 读取数据可能为垃圾数据。...在目标机器上执行期间,BCC 使用其嵌入式 Clang/LLVM 组合并使用本地安装内核头文件动态编译程序。 然而,这种方法引入了更多问题。...使用 BTF,我们可以消除在目标机器上安装内核头文件Clang/LLVM 嵌入应用程序并在目标机器上编译需要。 2. BTF 是什么?...使用 Clang 编译代码: $ clang -O2 -Wall -g -target bpf -c xdp_count.c -o xdp_count.o 接下来,使用 bpftool 加载程序: $...使用 Clang 编译代码: clang -O2 -Wall -g -target bpf -c xdp_count_btf.c -o xdp_count_btf.o 使用 -g 标志将创建调试信息并生成

29610

代码质量规则配置选项

null 检查验证方法名称,这些方法用于确定传递给方法参数不是 null 允许方法名称格式(以 | 分隔): - 仅方法名称(包括具有相应名称所有方法,不考虑包含类型命名空间) - 完全限定名称...允许方法名称格式(以 | 分隔): - 仅方法名称(包括具有相应名称所有方法,不考虑包含类型命名空间) - 完全限定名称,使用符号文档 ID 格式,前缀为 M:(可选) 无 CA2241...): - 仅类型名称(包括具有相应名称所有类型,不考虑包含类型命名空间) - 完全限定名称,使用符号文档 ID 格式,前缀为 T:(可选) 无 CA1303 excluded_symbol_names...描述 允许值 默认值 可配置规则 从分析范围排除符号名称 允许符号名称格式(以 | 分隔): - 仅符号名称(包括具有相应名称所有符号,不考虑包含类型命名空间) - 完全限定名称,使用符号文档...默认值 可配置规则 不允许出现在分析上下文中符号名称 允许符号名称格式(以 | 分隔): - 仅符号名称(包括具有相应名称所有符号,不考虑包含类型命名空间) - 完全限定名称,使用符号文档

61430
领券