首页
学习
活动
专区
工具
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加载编译数据库

7.2K81

为什么人人都该懂点LLVM

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

1.7K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    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.4K31

    初识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.5K20

    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.5K10

    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.4K30

    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.6K51

    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 命令将对应的语法树进行了介绍。

    91210

    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.4K20

    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.6K20

    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,每个源文件编译后输出耗时报告

    10.1K128

    微信团队分享:极致优化,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.7K43

    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函数进行调换的目的。

    2.1K20

    面试系列之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.7K20

    Clang Static Analyzer

    可以看到默认是输出html报告到/tmp/scan-build-XXX目录,我们可以使用-o进行指定目录 常用选项 -o :指定输出报告的目录。...将 scan-build 的输出重定向到文本文件(确保重定向标准错误)对于提交针对 scan-build 或分析器的错误报告非常有用,因为我们可以看到传递给分析器的确切选项(和文件)。.../configure’ 如果分析的项目使用 autoconf 生成的configure脚本,您可能需要通过scan-build运行configure脚本才能分析该项目。例子 scan-build ....ccc-analyzer程序就像一个假编译器,将其命令行参数转发给编译器以执行常规编译,并使用clang来执行静态分析。...=clang++ .. scan-build make CodeChecker 根据llvm官方描述,CodeChecker 得到了更积极的维护,提供了与流行编译器的多个版本一起使用的启发式方法,并且它还附带了一个基于

    6900

    深入剖析 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 可以灵活的控制代码块的编译选项。

    8K20

    成为Oceanbase贡献者(2):源码解读build.sh debug --make 的执行过程

    version 16.0.0Clang 16.0.0 是一个相当新的编译器版本,它对C++多个标准提供了支持,包括C++11、C++14、C++17和C++20等要指定使用哪一个C++标准进行编译,你可以通过在编译命令中添加相应的选项来实现...是一种简化构建流程的方法,让你不必关心底层使用的具体构建工具是什么,//同时提供了足够的灵活性来满足不同的构建需求。...(如 GCC 和 Clang)时,-std=gnu++11 和 -std=c++11 是两个不同的标准选项,它们有一些关键的区别。...以下是这两个选项的详细解释:-std=c++11纯 C++ 标准:这个选项严格遵循 C++11 标准。不包含 GNU 扩展:编译器不会启用任何 GNU 特定的扩展。...包含 GNU 扩展:编译器会启用一些非标准的功能和特性,这些功能可能在其他编译器上不可用。

    4700
    领券