Skip to content
tyfkda edited this page Dec 11, 2021 · 2 revisions

xcc

  • rand, srand

    • time
  • [v] typedef void Hoge; を可能にする

  • __attribute__((...)) を無視する

    • __asm__
    • __restrict
    • __extention__
    • _Bool
  • 関数への浮動小数点数の引数は8個までレジスタ渡しで、可変長引数の場合には%raxに個数を渡す、とのこと。

  • three_to_two の呼び出しはレジスタ割付とは別に行うほうがよい (x86の場合のみ)

  • IR_ADD const, Vx の場合、three_to_two で別レジスタに移動させる必要がないかも

  • imul という命令だと、直値との乗算ができる

  • goto のラベル管理をBB管理に変更する

  • XV6で動かしてみる

wcc

  • 最適化: if~br~endbr_if にできる?

  • 関数からの戻り値をローカル変数に入れずに済ませられるか?

    • 関数のエピローグに飛ぶためのBLOCKの型を戻り値の型にすればできる?
    • 戻り値ありの関数でちゃんとreturnが呼ばれているかチェックする必要があるかも
    • デッドコード判定も必要かも
  • 使われてない関数やグローバル変数が出力されていないかチェックする

  • 関数の型定義で同じものをまとめてコンパクトにする

  • ローカル変数の型宣言をまとめてコンパクトにする

  • 関数内でのextern関数宣言ができない

  • Wasmerで動かせるようにする?

    • memoryをインポートじゃなく内部で定義する
    • WASIの仕様とやらはどこを見ればわかるのか…。
  • 整数値リテラルが32bitまでしか扱えないのを修正する

  • ブラウザ版:

    • スマホでも操作できるようにする
    • [v] C-s でソースを保存できるようにする
      • [v] 次回ロード時、保存されていたらそのソースをセットする
    • [v] リロードや閉じる際、サンプルをロードする際に、変更されていたら確認する
    • [v] ソースを共有できるようにする
      • [v] クエリ文字列から取り出し
    • [v] Safari で動くようにする
    • [v] cc.wasm は実行時じゃなく起動時に読み込んでおいて使い回すようにする
    • UIスレッドとは別で動かす
    • [v] 標準関数のインクルード、リンクができるようにする
    • [v] aobench 等、キャンバス描画に反映できるようにする
  • [v] free をちゃんと実装する

  • [v] goto が使用されていたらエラーを出す

    • [v] switch 内でループとかも
  • [v] プリプロセッサ組み込み

  • [v] セルフホスティング、テスト

    • [v] gen3 を動くようにする
  • [v] heapPointer という名前を変更する

    • [v] ヒープはユーザ側で管理しているもので、カーネル側はブレークポイントとする
  • [v] ソースを更新したらちゃんとgen2がビルドされるようにする

  • [v] doubleをx=y=0とかするとコンパイルエラー

  • [v] 引数なしの関数宣言で、その後本体が定義されている場合、呼び出せるようにできないか?

  • [v] static の初期値参照でエラー

  • [v] 空の構造体のコピーでassert

  • [v] グローバルの関数ポインタ、関数ポインタ配列の初期化でエラー

  • Compound literal

  • 構造体の関数引数

  • 構造体を返す関数

  • [v] 関数ポインタを受け付ける関数がある場合には、使用していなくてもテーブルが存在しないといけない

    • [v] myqsort のように内部で呼び出していて、実際には myqsort が呼び出されていない場合。

wasm 感想

  • dupがないので一時的な値のためにローカル変数を確保する必要があるのが面倒

    • store命令でも取り除かれてしまうので、取っておけない
  • ジャンプの飛び先を任意に指定できないので、gotoの実装が難しい

    • goto を使用していなくても、switchで悪さをすると簡単じゃない
  • 数値型でも参照を取られたら線形メモリ上に配置する必要がある

  • [v] 関数ポインタを扱えるようにする

    • [v] table, elem を使用する必要がある。
    • [v] call_indirect で、呼び出す関数の型番号がわかる必要がある (signature index)
  • [v] 可変長引数

  • [v] printf

  • [v] FILE関連

  • [v] aobench をコンパイルしてみる

    • [v] &&, || を実装する
  • [v] malloc を実装する

  • やっぱり return で直接戻さずに最後の位置にジャンプする、または スタックポインタの調整を毎度挟む必要がある。

  • [v] 使用されているグローバル変数の領域を得られるようにする

  • [v] ローカル、グローバル変数でプリミティブ型の参照が取られた場合の処理

  • [v] 関数への引数に&を取った場合の処理

Clone this wiki locally