Continuation based Cの GCC 4.6 上の実装について
大城 信康
目的と背景(1)
当研究室ではコードセグメント単位で記述するプログラミング言語Continuation based C (以下CbC)という言語を開発している。
コードセグメントは並列実行の単位として使うことができ、プログラムの正しさを示す単位としても使用することができる。
目的と背景(2)
CbC のコンパイラは2008年に GCC をベースとしたコンパイラが開発された。
GCC をベースとした CbC コンパイラは、GCC のアップデートに合わせ変更する必要がある。
本研究ではGCC-4.5 をベースとしていた CbC コンパイラを GCC-4.6 へのアップデートを行い、Intel64 への対応するとともに CbC の拡張を行う。
今週の作業内容
環境付き継続について
- 変数 retval を static スレッドローカル(TLS)での実装
static TLS のGeneric Tree
変数 retval の宣言(VAR_DECL)
static TLS の場合追加される情報は以下の2つ:(Linux)
- TLS のモデル: TLS_MODEL_LOCAL_EXEC
- static フラグ 1
上記の設定で retval を作成しても正しい返り値は得られなかった。
環境付き継続の構文木をみる
環境継続において以下の retval 変数は static で作られている.
({
__label__ _cbc_exit0;
static __thread int retval;
void _cbc_internal_return(int retval_, void *_envp){
printf("in _cbc_internal_return\n",retval_);
retval = retval_;
goto _cbc_exit0;
}
if (0) {
_cbc_exit0:
return retval;
}
_cbc_internal_return;
})
環境付き継続の構文木をみる
BIND_EXPR は{ } の中身を束ねる。
STATEMENT_LIST が1つ1つのプログラムを表す木を持っている。
環境付き継続の構文木をみる
BIND_EXPR は _cbc_internal_return 関数を
ADDR_EXPR は最後の行の _cbc_internal_return を表す。
環境付き継続の構文木をみる
_CbC_return の実装より作られる構文木を見てみる。
環境付き継続の構文木をみる
出来上がる構文木が違う。
- DECL_EXPR が 1つ足りない
- BIND_EXPR の部分が COND_EXPR になっている。
DECL_EXPR の問題
なくなっている DECL_EXPR は VAR_DECL の部分。
static __thread int retval になる。
下記の様にソースを変更
// pushdecl (decl_cond);
add_stmt (build_stmt(location, DECL_EXPR, pushdecl (decl_cond)));
これで DECL_EXPR が追加された。
COND_EXPR の問題
BIND_EXPR でなくて COND_EXPR になっていた問題。
BIND_EXPR をみると以下の様な構成になっていた。
BIND_EXPR をなぜか COND_EXPR でもう一度包んでいた。
COND_EXPR には if(0){ } の中身が入る。
ソースの手直し
if(0){ } の構文木が作られる手順を元に
cbc_finish_labeled_goto 関数を手直しした。
同じ構文木が作られるようになった。
結果
正常な値が返ってくるようになった。
しかし、-O2 オプションをつけると返り値の取得が失敗した。
もっと細かく構文木をみて違いを見つける必要がある。
今後の予定
プロシン用プレゼンの用意
typedefrec, selftype の実装
CbC でタクスマネージャ作成