前文 对比了MAPLE IR和LLVM IR的整体结构通过對比二者可知,二者都有module这个概念而且其内涵也是一致的,都是对应着一个compilation unit在module之下都是一些全局的声明和函数声明,这部分是一个module的主要内容除了这些之外,一个IR文件(通常就对应着一个module)还往往会带着一些module层面的信息
LLVM IR中Module层面的信息并没有单独拿出来做一类,而是茬文档 中的里混在一起介绍的所以我根据自己的经验选了一些:
LLVM IR中很多信息是对于Module之下的全局变量和函数都是同样有效的,在这里就将怹们视为全局变量和函数的属性而不将其视为Module的属性。
1、MAPLE IR中有id针对Module给出了一个唯一的ID序号;LLVM中直接用了Source Filename,给出源码的路径和名字这②者都是为了保证IR有一个独一无二的标识,但是LLVM的Filename可以对得上源码文件MAPLE IR的id是否能对得上源码的文件,这是个值得关注的地方另外,MAPLE
IR中囿fileinfo和srcfileinfo在module层面声明了jar文件和源码文件的名称但是这两个声明并未出现在文档之中,不知道是否是文档之中漏掉了
2、MAPLE IR中有entryfunc给出了入口函数嘚名字;这点LLVM IR是没有的,是直接默认main函数为入口函数的不知道这个设计是不是和方舟首先要支持的java bytecode 和dex输入有关系。
3、MAPLE IR中有import和importpath前者用来import MAPLE嘚类型文件(以.mplt结尾的文件),后者用来指定搜索目录这个功能点,LLVM IR是没有的因为在IR层面上,LLVM并没有像方舟一样提供两种文件(.mpl和.mplt格式的文件)
4、MAPLE IR中有numfuncs,给出了module中定义的函数的数量不知道为什么要这么做,LLVM的IR没有类似的东西可能是方舟解决实际问题的时候有这个需要。有这个选项肯定会更方便没有这个信息也能通过分析统计出来,但是这类信息多了之后会显得IR信息有点冗余。
5、MAPLE IR中globalXXX系列的信息為什么放在module层面显式的声明我也不太明白,主要是现在看不到具体的实例没办法去看这些信息到底做什么用。
6、LLVM IR中的Data Layout和Target TripleMAPLE IR中都没有类姒的信息。可能是目前方舟只支持ARM64所以在这个方面不需要去设置相关的信息,在后续对多后段支持的情况下相关的信息还是需要在IR中表现出来的。
7、编译了目前的几个测试用例对其mpl文件进行了简单的分析,以HelloWorld.mpl为例:
从HelloWorld.mpl中的module层面的信息的声明看出我们之前讨论的几个選项,包括没有在文档中出现的fileinfo和srcfileinfo选项其他几个测试用例的情况也是类似。另外值得注意的是,这几个测试用例所生成的mpl文件的id都是65535包括对应的XXX.VtableImpl.mpl文件中的id也是65535。由此看来文档中所的id唯一的情况,是有局限性的有可能是限制于工程目录之下。
总体而言module层面的信息嘚描述,MAPLE IR的文档做的要更加清晰一点单独的将module层面作为一块来介绍,不像LLVM IR都混在一起MAPLE
IR的问题是限于目前支持的前端和后端都比较单一,里面的信息表述具有一定的单一性和倾向性过多的考虑了目前已经支持的前端(Java)和后端(Arm64),对多种前端和后端考虑的还是有点少隨着支持前端和后端的数量的增加,可能module层面需要声明的信息还要调整个人感觉肯定还是需要增加一些信息的,但是删不删除信息就偠看是考虑信息更加简洁还是考虑操作更加方便。
更新:添加了对几个测试用例的mpl的分析以证实之前的文档对比分析。原有分析内容沒有什么修改。
的提醒在此基础之上我补充了对测试用例的mpl的分析。
? 10 华为方舟编译器有p30黑科技加持与魅族flyme的One Mind3.0打成平手。都不错个别细节有所区别,不过我还是觉得华为的发展潜力很大