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

ASTMatcher分析函数调用链(上)

一、方案对比 clang是llvm编译器前端,是一个C语言、C++、Objective-C、Objective-C++语言轻量级编译器,基本工作是进行词法分析、语法分析,生成抽象语法树(Abstract...这样通过替换xcode中clang编译器和加载clang插件分析AST,可以完全控制clang AST。编写插件有三步:自定义类继承、重载、注册插件。...clang plugin在编译器运行时能够拿到完整AST,但替换clang编译器会出现很多编译问题,导致业务接入成本和解决编译问题的人力成本大大加大。...存在问题是ASTMatcher没有在编译阶段获取AST,获取节点数据可能没有clang plugin数据全。...ASTMatcher执行命令中必须加上参数 -- ,不然会报compilation-database:No such file or directory错,或者可以通过-p参数为ASTMatcher加载编译数据库

6.7K81
您找到你想要的搜索结果了吗?
是的
没有找到

为什么人人都该懂点LLVM

通过本文介绍,即使你对编译器原本一知半解,也能开始用LLVM,来完成有意思工作。 LLVM是什么?...这种翻译简化了编译器其他部分工作,这样它们就不需要面对比如C++源码所有复杂性了。作为一个豪迈人,你很可能不想再做这部分工作;可以不加改动地使用Clang来完成。...-Xclang -load -Xclang path/to/lib.so这是你在Clang中载入并激活你流程所用所有代码。...所以当你处理较大项目的时候,你可以直接把这些参数加到MakefileCFLAGS里或者你构建系统对应地方。 (通过单独调用clang,你也可以每次只跑一个流程。...回忆一下,每个指令都是一个值:在这里,乘法指令被当做另一条指令里操作数,意味着乘积会成为被进来参数。 我们其实应该移除旧指令,不过简明起见我把它略去了。

1.5K00

LLVM(一)——编译流程

比如OC编译器就是Clang。...那么LLVM是什么Clang跟LLVM又有什么关系呢? 首先来聊一聊传统编译器设计。 1,传统编译器设计 ?...经过分析,我们可以知道,这里面做事情是: 将test函数参数a0和a1传递给临时变量a3和a4,再将a3和a4传递给临时变量a5和a6,然后计算a5和a6和并传给a7,然后计算a7和3和传给a8...再来看一下优化级别的选项: ? 可以看到,最小是O0,即不进行任何优化。...我们可以通过自己写pass来改变LLVM优化,比如可以通过自定义pass节点来使代码逻辑变得更加复杂(增加一些中间变量、增加一些中间函数调用),这样做目的是什么呢?目的就是为了代码混淆。

2.2K30

初识LLVM&Clang-开发Xcode插件

初识LLVM&Clang-开发Xcode插件 LLVM Xcode现在使用编译器就是LLVM。LLVM比以前使用GCC编译器速度快好几倍。...LLVM如果要支持一种新语言,那么只需要实现一个新编译器前端即可,后端可以不变,因为前端产物都是LLVM IR编译器后端都能识别。...如果要改变硬件平台的话,就只要实现一个新编译器后端即可,通过把前端输出LLVM IR再次编译成对应硬件平台代码。从这就可以看出前后端分离,以及LLVM IR作用了。...Bitcode 这么说LLVM IR可能还不熟悉,但是我们说道bitcode时就熟悉多了。其实bitcode就是LLVM IR第三种格式(硬盘上存储二进制中间语言)。...去除不必要架构可以加快打包速度。 ? ? Clang 前面说到了LLVM编译器分为前后端,Clang就是编译器前端。

2.4K20

iOS底层原理之LLVM & Clang

1.3.1: iOS编译器架构 Objective-C/C/C++使用编译器前端是Clang,Swift是Swift,后端都是LLVM。 二: Clang Clang是LLVM项目中一个子项目。...使用下面命令可以可以看到词法分析后结果: clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m (滑动显示更多) 2.2: 语法分析...通过下面命令,可以查看语法分析后结果: clang -fmodules -fsyntax-only -Xclang -ast-dump main.m // 如果导入头文件找不到,可以指定SDK clang...语法分析 clang -fmodules -fsyntax-only -Xclang -ast-dump main.m // 3..../main (滑动显示更多) 大家可能会疑惑,生成汇编文件就已经是编译器后端工作了,为什么还是使用clang命令呢?这是因为我们使用clang提供接口调起后端相应功能。

1.4K10

Objective-C代码规范检测

因些,很多编译器经常要独立地构造语法分析树,为前端,后端建立一个清晰接口。基于AST不依赖具体文法和不依赖语言细节特点,使得其在很多领域有广泛应用,比如浏览器,智能编辑器,编译器。...AST如下图所示: 通过上面的语法树可以看到其描述代码具体结构,而在Clang对代码编译时会进入一个语法树解析阶段,则这个阶段中语法树每个节点都会被遍历到,因此借助此阶段可以检测程序中所有代码书写格式是否符合规范...clang -fmodules -fsyntax-only -Xclang -ast-dump HelloAST.m 我们可以看到自己类定义、方法定义、方法调用在 AST 中所对应节点。...由此可见,我们可以在编译过程中插入一些我们逻辑。...-load -Xclang (你插件dylib绝对路径)-Xclang -add-plugin -Xclang (你Plugin名字) -Xclang -load -Xclang $(SRCROOT

1.3K30

Objective-C源文件编译过程

如下命令可以对.c、.m源文件进行预处理,其中参数-E就是对源文件进行预处理操作: clang -E xxx.m 如果我们.m文件中import(文件包含)了其他文件或者其他库,执行以上命令对OC...对某一个源文件进行词法分析,可以使用下面这个命令 clang -fmodules -E -Xclang -dump-tokens main.m 当然,和预处理一样,如果源文件中有import其他文件,那么还需要使用...-isysroot 参数来指定iPhoneSimulator.sdk路径,如下: clang -fmodules -E -Xclang -dump-tokens -isysroot /Applications...生成中间代码 在把源程序翻译成目标代码过程中,一个编译器可能构造出一个或多个中间表示(Intermediate Representation或IR)。这些中间表示可以有多种形式。...使用这些集合,我们可以把不同前端和某个目标机后端结合起来,为不同源语言建立该目标机上编译器。类似的,我们可以把一个前端和不同目标机后端结合,简历针对不同目标机编译器

9.4K40

Objective-C 与 泛型

本文希望对 轻量泛型 做一个简单介绍。更多信息,请参考 llvm 或者 与 Objective-C API 交互[1] 轻量泛型 是什么?...轻量泛型 可以让开发者执行集合类类型信息,并且支持与 Swift 泛型系统进行相互转化。 为什么使用 轻量泛型?...通常情况下,我们使用下面的语法声明数组: NSArray *dates; 通过在类型后面添加 ,我们可以告诉编译器:这个数组只接受 NSDate 类型实例。...-fmodules -fsyntax-only -Xclang -ast-dump main.m 1、语法检测会提示 dic[@"today"] = @"2021-01-01"; 存在类型兼容问题。...最后是两个 ObjCTypeParamDecl : KeyType 和 ObjectTYpe 总结 本文分享了轻量泛型用法,并通过 clang 命令将对应语法树进行了介绍。

82210

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

Xcode 编译源文件时,会根据 Header Search Paths 自动添加 -I 参数,如果递归引用路径下子目录越多,-I 参数也越多,编译器预处理头文件效率就越低,所以不能简单设置路径递归引用...经过分析 LinkMap 文件和使用 Xcode Preprocess 某些源文件,发现有以下问题: proto 文件生成代码较多 某个基类/宏使用了大量模版 对于问题一,可以设置 proto 文件选项为...在 Xcode,C/C++/ObjC 编译器Clang(前端)+LLVM(后端),简称 Clang。...二、分析耗时 Clang/LLVM 编译器是开源,我们可以从官网下载其源码,根据上述编译过程,在每个编译阶段埋点输出耗时,生成定制化编译器。...接下来修改工程 CC={YOUR PATH}/clang,让 Xcode 编译时使用自己编译器;同时编译选项 OTHER_CFLAGS 后面增加 -ftime-trace,每个源文件编译后输出耗时报告

2.2K20

iOS 微信编译速度优化分享

Xcode 编译源文件时,会根据 Header Search Paths 自动添加 -I 参数,如果递归引用路径下子目录越多,-I 参数也越多,编译器预处理头文件效率就越低,所以不能简单设置路径递归引用...经过分析 LinkMap 文件和使用 Xcode Preprocess 某些源文件,发现有以下问题: proto 文件生成代码较多 某个基类/宏使用了大量模版 对于问题一,可以设置 proto 文件选项为...在 Xcode,C/C++/ObjC 编译器Clang(前端)+LLVM(后端),简称 Clang。...二、分析耗时 Clang/LLVM 编译器是开源,我们可以从官网下载其源码,根据上述编译过程,在每个编译阶段埋点输出耗时,生成定制化编译器。...接下来修改工程 CC={YOUR PATH}/clang,让 Xcode 编译时使用自己编译器;同时编译选项 OTHER_CFLAGS 后面增加 -ftime-trace,每个源文件编译后输出耗时报告

9.9K128

iOS编译原理

(即使只是参数类型不同),但C++可以; 二、编译型语言与解释型语言 Objective-C属于编译型语言,这是为了保证iPhone执行效率; 1.编译型语言 程序运行前,必须先通过编译器生成机器码,...; 2.LLVM与Clang LLVM是苹果当前使用编译器: LLVM是一套编译器基础设施项目,为自由软件,以C++写成,包含一系列模块化编译器组件和工具链,用来开发编译器前端和后端; 基于 LLVM...CLang基于LLVM,是一个高度模块化开发轻量级编译器CLang主要来自苹果电脑支持,同时支持C、Objective-C以及C++; CLang用于替代Xcode5版本前使用GCC,编译速度提高了...3倍: 3.理解iOS中编译器 在iOS开发中,通常LLVM被认为是编译器后端,而Clang是作为编译器前端; 二者以 IR(中间代码)作为媒介,这样前后端分离,使得前后端可以独立变化,互不影响...,才能保证整个程序里变量、接口正常调用; 5.理解静态链接与动态链接 静态链接:作用于编译期,链接后文件依然可能会存在一些"undefined"符号。

1.5K20

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

Xcode 编译源文件时,会根据 Header Search Paths 自动添加 -I 参数,如果递归引用路径下子目录越多,-I 参数也越多,编译器预处理头文件效率就越低,所以不能简单设置路径递归引用...对于问题一:可以设置 proto 文件选项为 optimize_for=CODE_SIZE 来让 protobuf 编译器生成精简版代码。...在 Xcode,C/C++/ObjC 编译器Clang(前端)+LLVM(后端),简称 Clang。...5.2 分析耗时 Clang/LLVM 编译器是开源,我们可以从官网下载其源码,根据上述编译过程,在每个编译阶段埋点输出耗时,生成定制化编译器。...接下来修改工程 CC={YOUR PATH}/clang,让 Xcode 编译时使用自己编译器;同时编译选项 OTHER_CFLAGS 后面增加 -ftime-trace,每个源文件编译后输出耗时报告

2.3K43

LLVM-插桩

0、Clang插桩原理 Clang在优化过程中,可以自己定义Pass来优化代码 1、编译插件工具准备 1.1 新建文件夹llvm,下载LLVM(预计大小 648.2 M) $ git clone https...-Xclang -load -Xclang Pass路径 3.4 在User-Defined内添加CC和CXX,值分别是刚刚构建clang路径,让xode使用clang替代版本 3.5 将Enable...函数,也就是说,每个方法函数执行时候,都会调用一次这个插入函数,所以我们可以通过这个插入函数,来获取方法函数名,从而获取启动过程中符号顺序。...将objc_msgSend执行下一个函数地址传递给beginHook第二个参数x0 self, x1 _cmd, x2: lr address __asm volatile ("mov x2...这个过程与OC方法Method-Swilling类似。最终可以达到hook_objc_msgSend函数与原来objc_msgsend函数进行调换目的。

1.8K20

面试系列之C++对象布局【建议收藏】

我们都知道C++多态是通过虚函数表来实现,那具体是什么大家清楚吗?开篇依旧提出来几个问题: 普通类对象是什么布局? 带虚函数类对象是什么布局? 单继承下不含有覆盖函数类对象是什么布局?...单继承下含有覆盖函数类对象是什么布局? 多继承下不含有覆盖函数类对象是什么布局? 多继承下含有覆盖函数类对象是什么布局? 多继承中不同继承顺序产生类对象布局相同吗?...在gcc中可以使用如下命令查看对象布局: g++ -fdump-class-hierarchy model.cc后查看生成文件 在clang可以使用如下命令: clang -Xclang -fdump-record-layouts...-stdlib=libc++ -c model.cc // 查看对象布局 clang -Xclang -fdump-vtable-layouts -stdlib=libc++ -c model.cc...clang -Xclang -fdump-record-layouts -stdlib=libc++ -c model.cc clang -Xclang -fdump-vtable-layouts -

1.6K20

深入剖析 iOS 编译 Clang LLVM

clang -fmodules -E -Xclang -dump-tokens main.m 可以获得每个 token 类型,值还有类似 StartOfLine 位置类型和 Loc= 这个样具体位置...可以通过 clang —analyze -Xclang -analyzer-checker-help 来列出当前 clang 版本下所有 checker。...PrintPreprocessedAction - 做预处理,子选项还包括-P、-C、-dM、-dD 具体可以查看PreprocessorOutputOptions 这个类,编译器 option 是...attribute((const)) 重复调用相同数值参数优化返回 用于数值类型参数函数,多次调用相同数值型参数,返回是相同,只在第一次是需要进行运算,后面只返回第一次结果,这时编译器一种优化处理方式...通过 clang diagnostic push/pop 可以灵活控制代码块编译选项

7.5K20

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

c和函数factorial;函数由参数列表和函数体组成,参数声明ParmValDecl对应参数int n,CompoundStmt组合语句就是对应函数factorial函数体;函数体由一些列声明Decl...-ast-dump查看输出AST详细结构 clang -c -Xclang -ast-dump factorial.cpp 输出如下: 源代码对应AST结构如图: 怎么访问/遍历/修改AST,...’ 操作数字面量1 使用Clang-emit-llvm选项可以查看输出LLVM IR clang -S -emit-llvm factorial.cpp 后文将详细介绍CodeGen输出LLVM...基于Clang开发 执行下面的命令,使用-emit-llvm选项编译一个cpp文件到LLVM IR,Clang内部使用了哪些类和数据结构呢,执行流程是怎样,如果我们想在这个编译流程上加上自定义内容呢...如果执行是如下命令,Clang编译器具体执行是EmitLLVMOnlyAction,上图可以看到它和FrontendAction继承关系。

17410

解决:无法解析外部符号__iob_func

解决方法通常来说,解决无法解析外部符号__iob_func错误可以通过以下步骤来实现:1. 检查编译选项首先,我们需要确保编译器配置正确。...在编译命令中添加以下选项,以确保链接器能够正确找到标准库函数实现:bashCopy code-lc4. 检查编译器版本某些较旧编译器可能会出现与__iob_func相关问题。...要检查编译器版本,你可以执行一些命令或访问一些特定选项来获取相应信息。...下面是一些常见检查编译器版本方法:命令行参数:在终端或命令提示符中输入编译器可执行文件名称,后跟-v、--version或-version参数。...以上方法提供了一些常见检查编译器版本方式,你可以根据使用具体编译器来尝试这些方法。请注意,不同编译器可能使用不同版本号命名方式,因此,最好参考相应编译器文档获取准确版本信息。

39410
领券