2021SC@SDUSC
这篇博客承接上面几篇,这几篇博客要研究分析编译器代码中me体系的me_ir部分,这一部分是me体系中最重要的一部分,因为这部分直接决定了me和ir两个体系的结合,这部分代码将对整个方舟编译器的运行产生至关重要的作用。同时,这部分的代码量极为庞大,分析起来难度也很大,故我可能需要6-9周(按每周一篇的速度)才能将之分析完。
https://opensource.huawei.com/
今天的重点是MeStmt及其相关内容。
MeStmt定义及实现在src/maple_me/include/me_ir.h和src/maple_me/src/me_ir.cpp中。这和MeExpr是一样的。
MeStmt有一批子类(src/maple_me/include/me_ir.h):
class DassignMeStmt : public MeStmt {
class RegassignMeStmt : public MeStmt {
class MaydassignMeStmt : public MeStmt {
class IassignMeStmt : public MeStmt {
class NaryMeStmt : public MeStmt {
// eval, free, decref, incref, decrefreset, assertnonnull
class UnaryMeStmt : public MeStmt {
class GotoMeStmt : public MeStmt {
class JsTryMeStmt : public MeStmt {
class TryMeStmt : public MeStmt {
class CatchMeStmt : public MeStmt {
class CommentMeStmt : public MeStmt {
class WithMuMeStmt : public MeStmt {
// assert ge or lt for boundary check
class AssertMeStmt : public MeStmt {
其中,UnaryMeStmt和NaryMeStmt也有它自己的子类(src/maple_me/include/me_ir.h):
class CondGotoMeStmt : public UnaryMeStmt {
class SwitchMeStmt : public UnaryMeStmt {
class CallMeStmt : public NaryMeStmt, public MuChiMePart, public AssignedPart {
class IcallMeStmt : public NaryMeStmt, public MuChiMePart, public AssignedPart {
class IntrinsiccallMeStmt : public NaryMeStmt, public MuChiMePart, public AssignedPart {
MuChiMePart和AssignedPart 类也都在同个头文件中定义了,没有继承自任何类。NaryMeStmt除了call系列的子类之外,还有:
class RetMeStmt : public NaryMeStmt {
class SyncMeStmt : public NaryMeStmt, public MuChiMePart {
WithMuMeStmt也有自己的子类:
class GosubMeStmt : public WithMuMeStmt {
class ThrowMeStmt : public WithMuMeStmt {
另外还有独立的类:ChiMeNode、MustDefMeNode等。
通过以上的分析,我们可以看到MeStmt及其子类所构成的体系,和之间语句所对应的节点类的体系是完全不同的体系,二者的对应关系比较弱。MeStmt是一个相对独立的体系,其和语句的节点类之间的关系,还需要以后分析代码执行流程的过程中去揭示。这其实不光是涉及到语句的问题,还是一个MAPLE IR到ME IR的问题。
MeStmt及其相关子类,构成了Me阶段的语句的一个表达体系,它属于相对独立的一个体系。它和我们之前提到的MeFunction、BB、MeExpr一起构建了Me阶段的表达体系。后续我们要分析MAPLE IR中的表达体系向Me阶段的表达体系的转换。