方舟编译器学习笔记6 方舟开源目录简介
方舟编译器第一批代码开源之后,很多人对方舟编译器感兴趣,包括一些之前不是做编译器相关工作的同学。所以有人反馈说想读代码却无从下手,毕竟代码中的注释也不多。本文将就方舟这次开源的目录做一个简单的介绍,因为还没有充足的时间深入的读这些源码,难免有疏漏之处,欢迎大家批评指正。
此次开源所放出来的一级目录主要六个:
1、build目录:该目录下主要是环境设置脚本,和一些build所用的Makefile。
2、doc目录:本次发布的几个文档,具体内容介绍见 文档导读 。
3、license目录:许可文件。
4、samples目录:示例程序目录,本次发布共公开了六个示例程序。
5、src目录:本次发布所公开的源码目录。
6、tools目录:为编译和使用过程中所用到的其他工具所预留的目录,该目录后续将存放llvm、gn、ninja。
我们所关注的源码,是位于src目录之下。src目录之下又有12个文件夹:
1、bin目录:该目录之下是四个可执行文件,其中除了maple之外的三个可执行文件,都要在build的时候copy到out/bin目录之下。
2、third_party目录:该目录之下存放了第三方库zlib。
3、deplibs目录:该目录之下存放了四个库,应该是编译的时候需要依赖的。
其中的libmempool.a、libmplphase.a和libmaple_driverutil.a是编译maple所需要的,但是src目录之下的mempool目录、mpl_phase目录、mpl_util目录都只有头文件,所以直接在源码里附上这几个库。
4、mempool目录:推测应该是内存池相关的代码,但是只有头文件,没有源文件。
5、mpl_phase目录:推测是maple的phase的基本框架的代码,不包含具体的phase的代码。该目录只有头文件,没有源文件。关于phase,doc目录有两个关于phase的文档,可以从文档中获取一部分信息。
6、mpl_util目录:推测是maple需要的一些util,字符串、log、计时器、版本等内容。
7、huawei_secure_c目录:是一些安全代码,主要字符串操作、输入输出等,具体到函数就是str_cat_s、str_cpy_s等。
8、maple_driver目录:这是maple可执行程序的主要源码所在的位置,它会调用其他的maple_开头的目录的部分内容。从其BUILD.gn中可以看到:
另外,该目录之下的src/maple.cpp中的main函数,是maple可执行程序的入口。我们前文也提到过maple是out/bin目录下面的四个可执行程序中唯一一个根据源码编译出来的,所以我们要分析方舟的程序,绕不开这个目录以及这个入口点。
9、maple_ipa目录:该目录是interleaved_manager和module_phase_manager的相关代码。phase的文档中对这块都有介绍:“PhaseManager负责phase的创建、管理和运行。与phase对应,有ModulePhaseManager和MeFuncPhaseManager两类。InterleavedManager负责phase manager的创建、管理和运行。通过调用AddPhases接口,它将创建一个对应类型的phase manager并添加进MapleVector中, 同时该phase manager相应的phase注册、添加也会自动被触发。”可以理解为ModulePhase类的phase的运行框架部分。
10、maple_ir目录:该目录是针对maple的ir的基本操作的相关代码,与LLVM针对ir的基本操作类似。主要是对IR进行基本的分析,获取ir所要表达的信息。为之后的优化作准备。
11、maple_me目录:该目录包含了有关MeFuncPhase类别的phase的框架及其具体内容,这是phase相关的一部分。所有的具体的MeFuncPhase的子类,实现都在该目录之下。
12、mpl2mpl目录:该目录包含了一些从maple ir到maple ir的转换,这种转换都是为了后续的me做准备。该目录下的主题内容是ModulePhase类别的phase的具体实现。
本次就简单的介绍了一级目录以及src目录之下的二级目录。后续会根据时间去具体的分析文档和代码。时间仓促,不足之处还望大家海涵。