これらは, C2 JIT Compiler 用の高レベル中間語を表すクラス. より具体的に言うと, Ideal によるグラフ構造全体の管理を行うクラス.
LoopNode クラスのサブクラスの1つ. グラフ処理のアルゴリズムを簡単にするための便宜的なノード.
Ideal によるグラフ構造の頂点を表す (どのグラフも RootNode を頂点ノードとする). また, コンパイル対象のメソッドから exit しようとする Node を示す役割もある (そういった Node は全て RootNode を出力先とする).
((cite: hotspot/src/share/vm/opto/rootnode.hpp))
// The one-and-only before-all-else and after-all-else RootNode. The RootNode
// represents what happens if the user runs the whole program repeatedly. The
// RootNode produces the initial values of I/O and memory for the program or
// procedure start.
class RootNode : public LoopNode {
各 Compile オブジェクトの _root フィールドに(のみ)格納されている.
Compile::Init() 内で(のみ)生成されている.
((cite: hotspot/src/share/vm/opto/compile.cpp))
void Compile::Init(int aliaslevel) {
...
set_root(new (this, 3) RootNode());
LoopNode のサブクラスなので生成直後は (control input も含めて) 3つの入力ノードを持つ. ただし, コンストラクタ内で del_req() で第3および第2入力ノードを削ってしまうため, 初期状態では入力ノードは1つだけ(自分自身のみ)になる.
((cite: hotspot/src/share/vm/opto/rootnode.hpp))
RootNode( ) : LoopNode(0,0) {
init_class_id(Class_Root);
del_req(2);
del_req(1);
}
その後の処理パスで, Node::add_req() によって, ReturnNode, RethrowNode, TailCallNode, TailJumpNode, HaltNode (他にもある? #TODO) が追加される模様 (#TODO).
(<= Ideal のグラフは双方向につながっているので, これらの Node の出力先として使われるということは, これらの Node を入力に持つということ) (See: Compile::return_values(), Compile::rethrow_exceptions(), GraphKit::gen_stub(), AllocateArrayNode::Ideal(), GraphKit::uncommon_trap())
See: here for details
Node クラスの具象サブクラスの1つ.
このクラスは決して到達しえないパスを示す.
((cite: hotspot/src/share/vm/opto/rootnode.hpp))
// Throw an exception & die
class HaltNode : public Node {
以下の箇所で(のみ)生成されている.
GraphKit::uncommon_trap()
PhaseIdealLoop::build_loop_tree_impl()
AllocateArrayNode::Ideal()
(control input も含めて) 5つの入力ノードを持つ. それぞれの入力の意味は以下の通り.
((cite: hotspot/src/share/vm/opto/rootnode.cpp))
HaltNode::HaltNode( Node *ctrl, Node *frameptr ) : Node(TypeFunc::Parms) {
Node* top = Compile::current()->top();
init_req(TypeFunc::Control, ctrl );
init_req(TypeFunc::I_O, top);
init_req(TypeFunc::Memory, top);
init_req(TypeFunc::FramePtr, frameptr );
init_req(TypeFunc::ReturnAdr,top);
}
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.