C2 JIT コンパイラは, コンパイル時に対象のアーキテクチャの情報を必要とする (例: 利用可能なマシン語・レジスタ, スタックフレームのレイアウト, CPU のパイプライン情報, 等). HotSpot のソースコード内では, これらの情報のほとんどは「AD ファイル (または ADL ファイル)」というファイルに書かれている.
AD ファイル自体はソースコードとして直接使える形式にはなっておらず, まず adlc(ADL Compiler) というプログラムが AD ファイルを C++ コードに変換し, 次にこれを基にして C2 JIT コンパイラが生成される. このため, HotSpot のコンパイルは以下のような手順で行われる (See: here for details).
(1) まず adlc 自体を生成する. (なお, adlc を構成するソースコードは hotspot/src/share/vm/adlc 以下に存在する. (See: here for details))
(2) adlc が、AD ファイルから C++ ソースコードを生成する. (See: here for details)
(3) できた C++ コードと残りの HotSpot のソースコードから、HotSpot が生成される.
なお, ADL は "Architecture Description Language" の略らしい.
AD ファイルは hotspot/src/cpu/ 下, および hotspot/src/os_cpu 下に置かれている.
Arthitecture | AD files |
---|---|
Solaris/Sparc | hotspot/src/cpu/sparc/vm/sparc.ad, hotspot/src/os_cpu/solaris_sparc/vm/solaris_sparc.ad (<= ただしこちらは空) |
adlc によって AD ファイルから生成されるソースコードファイルは以下の通り. (なお, ${architecture} の箇所にはそれぞれのビルド環境を表す文字列が入る. 例えば dfa_x86_64.cpp, 等)
source code file | description |
---|---|
dfa_${architecture}.cpp | Matcher クラス(See: here for details)の DFA(決定性有限オートマトン)用のルールを規定するソース |
ad_${architecture}.hpp | AD ファイルから生成される MachNode のサブクラスおよび MachOper のサブクラスの宣言 |
ad_${architecture}.cpp | AD ファイルから生成される MachNode のサブクラスおよび MachOper のサブクラスの定義 |
ad_${architecture}_clone.cpp | 〃サブクラスの clone() メソッドの定義 |
ad_${architecture}_expand.cpp | 〃サブクラスの Expand() メソッドの定義 |
ad_${architecture}_format.cpp | 〃サブクラスの int_format() メソッド, ext_format() メソッド, format() メソッドの定義 (これらはデバッグ出力用のメソッド) |
ad_${architecture}_gen.cpp | 〃サブクラスのインスタンスを生成するメソッド (State::MachOperGenerator() および State::MachNodeGenerator()) の定義 |
ad_${architecture}_misc.cpp | 〃サブクラスのその他のメソッドの定義 |
ad_${architecture}_peephole.cpp | MachNode サブクラスの peephole() メソッドの定義 (See: PhasePeephole) |
ad_${architecture}_pipeline.cpp | MachNode サブクラスの pipeline() メソッド, pipeline_class() メソッドの定義 (See: Scheduling) |
adGlobals_${architecture}.hpp | アーキテクチャ依存の定数の定義 |
((cite: hotspot/src/share/vm/adlc/archDesc.hpp))
// Machine dependent files, built from architecture definition
ADLFILE _DFA_file; // File for definition of Matcher::DFA
ADLFILE _HPP_file; // File for ArchNode class declarations
ADLFILE _CPP_file; // File for ArchNode class defintions
ADLFILE _CPP_CLONE_file; // File for MachNode/Oper clone defintions
ADLFILE _CPP_EXPAND_file; // File for MachNode expand methods
ADLFILE _CPP_FORMAT_file; // File for MachNode/Oper format defintions
ADLFILE _CPP_GEN_file; // File for MachNode/Oper generator methods
ADLFILE _CPP_MISC_file; // File for miscellaneous MachNode/Oper tables & methods
ADLFILE _CPP_PEEPHOLE_file; // File for MachNode peephole methods
ADLFILE _CPP_PIPELINE_file; // File for MachNode pipeline defintions
ADLFILE _VM_file; // File for constants needed in VM code
ADLFILE _bug_file; // DFA debugging file
((cite: hotspot/src/share/vm/adlc/main.cpp))
const char *base = strip_ext(strdup(argv[i]));
char *temp = base_plus_suffix("dfa_",base);
AD._DFA_file._name = base_plus_suffix(temp,".cpp");
delete temp;
temp = base_plus_suffix("ad_",base);
AD._CPP_file._name = base_plus_suffix(temp,".cpp");
AD._CPP_CLONE_file._name = base_plus_suffix(temp,"_clone.cpp");
AD._CPP_EXPAND_file._name = base_plus_suffix(temp,"_expand.cpp");
AD._CPP_FORMAT_file._name = base_plus_suffix(temp,"_format.cpp");
AD._CPP_GEN_file._name = base_plus_suffix(temp,"_gen.cpp");
AD._CPP_MISC_file._name = base_plus_suffix(temp,"_misc.cpp");
AD._CPP_PEEPHOLE_file._name = base_plus_suffix(temp,"_peephole.cpp");
AD._CPP_PIPELINE_file._name = base_plus_suffix(temp,"_pipeline.cpp");
AD._HPP_file._name = base_plus_suffix(temp,".hpp");
delete temp;
temp = base_plus_suffix("adGlobals_",base);
AD._VM_file._name = base_plus_suffix(temp,".hpp");
delete temp;
temp = base_plus_suffix("bugs_",base);
AD._bug_file._name = base_plus_suffix(temp,".out");
delete temp;
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.