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 の拡張を行う。
  • 今週の作業内容

  • 環境付き継続について
  • static TLS のGeneric Tree

  • 変数 retval の宣言(VAR_DECL)
  • static TLS の場合追加される情報は以下の2つ:(Linux)
  • 上記の設定で 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 の問題

  • なくなっている 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 でタクスマネージャ作成