COINS 新バックエンドの内部構造について簡単に説明する。
以下にバックエンドの主手続き(の一部)を示す。
1: sexp = ImList.readSexp(stdin); 2: Module compileUnit = new Module(sexp, stdout); 3: compileUnit.printIt(stdout);
1行目: 入力ストリームからASCII S式形式のLIRを読んで内部S形式に変換 2行目: 内部S形式から構造のあるModule型へ変換。CFGへの分割も行う 3行目: 内部構造をダンプこれによってできたModuleのインスタンスは次の図のような形をしている。
グローバルシンボル表へのアクセス:
SymTab tbl = compileUnit.globalSymtab; Symbol sym = tbl.get("foo");L関数のリスト:
for (BiLink p = compileUnit.functionList.first(); !p.atEnd(); p = p.next()) { Function func = p.elem(); }
Function型(L関数)オブジェクトの内部へのアクセスは次のようにして行う。
ローカルシンボル表へのアクセス:
SymTab tbl = func.localSymtab; Symbol sym = tbl.get("bar");
FlowGraphへのアクセス:
FlowGraph cfg = func.flowGraph;
FlowGraph内部へのアクセスは次のようにして行う。
BasicBlk(基本ブロック)を順に訪問:
for (BiLink p = cfg.basicBlkList().first(); !p.atEnd(); p = p.next()) { BasicBlk blk = p.elem(); }