Upgrade to Pro — share decks privately, control downloads, hide ads and more …

いい感じのCコンパイラを作る (seccamp19)

coord.e
August 17, 2019

いい感じのCコンパイラを作る (seccamp19)

セキュリティ・キャンプ全国大会2019のCコンパイラを作ってみようゼミで作成したCコンパイラの、seccamp終了時点での進捗です
成果報告LTで使用したスライドとほぼ同等です

coord.e

August 17, 2019
Tweet

More Decks by coord.e

Other Decks in Technology

Transcript

  1. いい感じポイント • (実装した機能については)規格準拠度が高い (C11) ◦ initializerやdeclarator、暗黙の型変換などが 規格に忠実に実装されている • 丁寧なコンパイル ◦

    丁寧なメモリ管理がある ◦ 意味解析パスによる変形の前後で意味論を変更しない、 あくまで曖昧さを解消するだけ ◦ なので2度解析させてもテストを壊さない • Linear Scan Register Allcationを実装し、 出力コードの効率とコンパイル時間のバランスが良い
  2. いい感じポイント • (実装した機能については)規格準拠度が高い ◦ initializerやdeclarator、暗黙の型変換などが Cの規格に忠実に実装されている • 丁寧なコンパイル ◦ 丁寧なメモリ管理がある

    ◦ 意味解析パスによる変形の前後で意味論を変更しない、 あくまで曖昧さを解消するだけ ◦ なので2度解析させてもテストを壊さない • Linear Scan Register Allcationを実装し、 出力コードの効率とコンパイル時間のバランスが良い
  3. 仕様準拠頑張りがあった typedef long MyInt; MyInt x = 1, *p =

    &x, ary[3][10] = {{2,3}, {1}}; • typedef、ある • 複数の{declarator, initializer}、ある • 配列初期化子のサポート、ある • 足りない部分はゼロ初期化、ある • 暗黙の型変換、ある
  4. いい感じポイント • (実装した機能については)規格準拠度が高い ◦ initializerやdeclarator、暗黙の型変換などが Cの規格に忠実に実装されている • 丁寧なコンパイル ◦ 丁寧なメモリ管理がある

    ◦ 意味解析パスによる変形の前後で意味論を変更しない、 あくまで曖昧さを解消するだけ ◦ なので2度解析させてもテストを壊さない • Linear Scan Register Allcationを実装し、 出力コードの効率とコンパイル時間のバランスが良い
  5. Linear Scan Register Allocation ? 1. ASTから無限個のレジスタを持っているかのようにIR(CFG)を生成する 2. BBの開始/終了時点で生きているレジスタを求める 3.

    レジスタの生存区間を求める 4. 生存区間が早い順にレジスタ走査 a. 物理レジスタ(有限個)が空いていれば i. 空いている物理レジスタを割り当て ii. アクティブリストに追加 b. 空いてないなら i. アクティブリスト内でもっとも生存区間の終了が遅いやつを選ぶ ii. それに割り当てられていた物理レジスタを割り当てる iii. スタックに逃がし、アクティブリストから削除 参考文献: • Christian Wimmer. Linear scan register allocation for the java hotspottm client compiler. Master’s thesis, Johannes Kepler University Linz, 2004. • Massimiliano Poletto and Vivek Sarkar. Linear scan register allocation. ACM Transactions on Programming Languages and Systems (TOPLAS), Vol. 21, No. 5, pp. 895–913, 1999.
  6. 今後 • セルフホスト • せっかくIRがあるので最適化をやる ◦ gcc -O1に勝ちます ◦ 完成したらブログ書くよ

    よろしくね • 別アーキテクチャ向けのアセンブリを 出力できるようにする