2021SC@SDUSC
仍然是老规矩,官方源码献上:
华为开源 - Huawei Open Source - 开放、共创、繁荣、共赢
不过最近此网站正在维护,暂时上不去。
这篇博客承接上一篇,和以后的几篇博客分别研究分析编译器代码中me体系的me_ir部分,这一部分是me体系中最重要的一部分,因为这部分直接决定了me和ir两个体系的结合,这部分代码将对整个方舟编译器的运行产生至关重要的作用。同时,这部分的代码量极为庞大,分析起来难度也很大,故我可能需要6-9周(按每周一篇的速度)才能将之分析完。目前计划用3篇博客分析其头文件。
MeExprOp之中的每个类别(除了kMeOpUnknown之外),都有一个对应的类,这些类都是MeExpr类的子类。具体代码为(src/maple_me/src/me_ir.cpp):
节点类和Me表达式类的对应:之前介绍的表达式对应的节点,主要是针对Expression nodes,并没有覆盖针对Leaf nodes的内容,所以并没有和操作符对应的节点类来和Me的表达式类进相对应的内容。但是,这里面NaryMeExpr是个例外,它是为了表达array、intrinsicop和intrinsicopwithtype;array、intrinsicop和intrinsicopwithtype属于N-ary Expression Opcodes,它们有对应的节点类。其中,array对应节点类ArrayNode,intrinsicop和intrinsicopwithtype对应节点类IntrinsicopNode,它们都是NaryNode的子类。这里只是一个对应关系,具体执行过程之中的流程和细节,还要进一步分析。
MeExpr及其子类的成员函数相对都较为简单,除了相关的内容的set/get之外,主要是一些判定、dump,还有一些极个别的其他操作。
经过我们陆续几天的分析,我们可以看到在IR之中,Me是有一套自己的体系的。我们几天涉及到的MeFunction、BB、MeStmt、MeExpr都是这个体系的一部分。而我们之前分析过的MIRModule、MIRFunction、Node体系,这是一个体系,这个体系的声明周期要比Me的体系要靠前一些。
这