方舟编译器理解二:ModulePhase && MeFunctionPhase

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/feibabeibei_beibei/article/details/100901936

上一篇文章大致讲解了一个HelloWorld的中间文件跟基于LLVM生成的中间文件的形式上的对比,接下来的文章主要是讲解这个生成过程,方舟编译器是怎么处理这些class文件的。

从源码中可知,Phase分为ModulePhaseMeFunctionPhase;类似于LLVM中的ModulePass和FunctionPass,Phase也就类似于llvm中的Pass的概念。

一、ModulePhase

ModulePhase的子类主要对应于maple_ipa和mpl2mpl两个目录,为什么对应这两个目录呢?接下来看:

InterleavedManager主要是对于phase manage的创建;

module_phase_manager负责对于ModulePhase的注册,增加和运行,从下面就可以看出。跟LLVM中的ModulePassManager是类似的。

从以下module_phases.def中可以看到这些主要modPass:这些phase主要是使用宏的机制来进行实现注册,便于管理这些注册的phase;

MODAPHASE(MoPhase_CHA, DoKlassHierarchy) MODAPHASE(MoPhase_CLINIT, DoClassInit) #if MIR_JAVA MODTPHASE(MoPhase_GENNATIVESTUBFUNC, DoGenericNativeStubFunc) MODAPHASE(MoPhase_VTABLEANALYSIS, DoVtableAnalysis) MODAPHASE(MoPhase_REFLECTIONANALYSIS, DoReflectionAnalysis) MODTPHASE(MoPhase_VTABLEIMPL, DoVtableImpl) MODTPHASE(MoPhase_JAVAINTRNLOWERING, DoJavaIntrnLowering) MODTPHASE(MoPhase_JAVAEHLOWER, JavaEHLowererPhase) MODTPHASE(MoPhase_MUIDREPLACEMENT, DoMUIDReplacement) MODTPHASE(MoPhase_CHECKCASTGENERATION, DoCheckCastGeneration) #endif

而这些Phase的实现主要在mpl2mpl中,根据源码可知道这些phase所作的事情主要是:

class_hierarchy.cpp:从名字可以看出对于类中的继承关系的处理;

class_init.cpp:对于静态属性的检查,从上一文中HelloWorld中对于getstatic的检测会插入:MPL_CLINIT_CHECK

native_stub_func.cpp:主要是对于java本地层方法的处理;

vtable_analysis.cpp:产生虚拟表和接口表,存储不同方法地址;

reflection_analysis.cpp:根据方法可以知道主要是对于classinfo, fields, methods的解析;

java_intrn_lowering.cpp:对于一些边界的检查和NewFilledArray这类指令的处理;

java_eh_lower.cpp:主要是做异常处理;

muid_replacement.cpp使用def或者undef表替换方法和静态变量的相关引用,比如上文中的$__muid_func_undef_tab$$HelloWorld_jar字段;

gen_check_cast.cpp:实现class中check-cast vAA, type@BBBB、instance-of类型的指令和优化;

二、MeFunctionPhase

MeFuncPhase的子类主要对应于maple_me目录,下面来简单的看一下。

在opcode.def中有对于所有的opcode指令的定义。

me_phases.def中可以看到所对应的定义的一些Phase:

FUNCAPHASE(MeFuncPhase_DOMINANCE, MeDoDominance) FUNCAPHASE(MeFuncPhase_SSATAB, MeDoSSATab) FUNCAPHASE(MeFuncPhase_ALIASCLASS, MeDoAliasClass) FUNCAPHASE(MeFuncPhase_SSA, MeDoSSA) FUNCAPHASE(MeFuncPhase_IRMAP, MeDoIRMap) FUNCAPHASE(MeFuncPhase_BBLAYOUT, MeDoBBLayout) FUNCTPHASE(MeFuncPhase_EMIT, MeDoEmission) FUNCTPHASE(MeFuncPhase_RCLOWERING, MeDoRCLowering)

这些phase大致上的一个过程主要是:对于BasicBlock的建立、划分出基本的边界,并且计算出之间的支配关系。

然后就是对于layout、cfg的生成、修复。接着通过上面的支配关系进行PHI的插入进行SSA赋值以及进一步优化;

这些me_function的Phase可能涉及到编译原理上的东西比较多。

三、总结

通过ModulePhase 和MeFunctionPhase对Phase有了一个基本的了解,属于Phase类的子类,同时也给我们一个添加phase的基本使用方法。

猜你喜欢

转载自blog.csdn.net/feibabeibei_beibei/article/details/100901936