方舟編譯器理解二:ModulePhase && MeFunctionPhase

上一篇文章大致講解了一個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的基本使用方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章