COINS バックエンド早めぐり

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のインスタンスは次の図のような形をしている。

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型は次のような構造をしている。

FlowGraph内部へのアクセスは次のようにして行う。

BasicBlk(基本ブロック)を順に訪問:

    for (BiLink p = cfg.basicBlkList().first(); !p.atEnd(); p = p.next()) {
      BasicBlk blk = p.elem();
    }

BasicBlkの内部へのアクセスは次のようにして行う。