? ? ? ? 在前面文章提到,當GCC 前端完成對C源代碼解析完成后,就會使用 處理過程(Passes)機制,通過一系列的處理過程,將 GENERIC? IR 表示的C程序 轉步轉換成 目標機器的匯編語言。過程描述如下圖所示:
? ? ? ? ?此處所示的處理過程管理者(pass_manager)的構造函數。其調用的時機如下:
#0 gcc::pass_manager::pass_manager (this=0x7161cd0, ctxt=0x7161cb0) at <gcc-project>/gcc/passes.cc:1579
#1 0x0000000001bd7ecd in general_init (argv0=0x7fffffffd9c7 "cc1", init_signals=true, original_argv=...) at <gcc-project>/gcc/toplev.cc:1154
#2 0x0000000001bd9ed9 in toplev::main (this=0x7fffffffd3d2, argc=19, argv=0x7fffffffd518) at <gcc-project>/gcc/toplev.cc:2284
#3 0x0000000004482c61 in main (argc=19, argv=0x7fffffffd518) at <gcc-project>/gcc/main.cc:39
? ? ? ? 即在編譯器cc1初始化的過程中,將處理過程及其管理者給初始化了。
? ? ? ? 處理過程的定義文件 是 <gcc-project>/gcc/passes.def,經過處理后,生成 pass-instances.def 文件,然后在 pass_manager 構造函數中 include 進去。如下:
? ? ? ? 這樣就把所有在pass-instances.def定義的處理過程包含在 pass_manager 里面。
? ? ? ? 1. pass_manager 包含了 所有處理過程的指針。
? ? ? ? 2. pass_manager 通過 pass_lists 包含了 5個 pass_list,每個 pass_list 包含對應類型的處理過程。
? ? ? ? 3. pass_manger 的每一個 pass_list 包含其對應類型的 處理過程(pass)。如下:
被處理后,在 pass-instances.def 文件中對應如下,增加的同處理過程的序號。
? ? ? ? all_lowering_passes pass_list 包含上圖 NEXT_PASS 中的處理過程(Pass)。
? ? ? ? 另外 處理過程中有個 sub 欄位,作為 其子處理過程列表。
? ? ? ? 總結來說,經過初始化后,所有處理過程的實體會以單向列表的形式,分類地有層級地存放在 pass_manager 里面。