mri: 三菱総合研究所とその外注先 tan: 渡邊 chiba: 千葉 fukuda: 福田 buna: ブナソフト fnami: 藤波 X: 担当未定 *一応動くが問題は多い **通常はほとんど問題が出ない ***いろいろテストしたが問題は出なくなった
X: Cのプリプロセッサ X: アセンブラ X: リンカ X: ライブラリ X: ヘッダ
mri: ドライバ mri: ユーティリティ(ユーザエラー、内部エラー、デバッグ出力) *tan: コンテキスト パス *chiba: C to AST *tan: C to AST patch (一時的なもの) *fukuda: AST to HIR-C *fukuda: HIR-C to HIR-base mri: HIR最適化(基本) *buna: HIR to LIR *buna: 仮想レジスター割り当て mri: LIR最適化(基本) *buna: フレーム割り当て *buna: パターンマッチング *buna: ハードレジスター割り当て *buna: アセンブラコード生成 データアクセス部 *tan: symbol table *tan: HIR,LIR共通 *tan: HIR access *buna: LIR access *tan: flow access fnami: LIR flow access *mri: HIR c-flow *mri: HIR d-flow mri: LIR c-flow mri: LIR d-flow *tan: マシンパラメタ X: ターゲット記述 X: ターゲット記述からマシンパラメタ生成
SIZEOF_BOOL SIZEOF_CHAR SIZEOF_SHORT SIZEOF_INT SIZEOF_LONG SIZEOF_LONG_LONG SIZEOF_ADDRESS //廃止予定 SIZEOF_OFFSET SIZEOF_FLOAT SIZEOF_DOUBLE SIZEOF_LONG_DOUBLE 制約: 0<SIZEOF_CHAR<=SIZEOF_SHORT<=SIZEOF_INT<=SIZEOF_LONG<=SIZEOF_LONG_LONG 制約: 0<SIZEOF_FLOAT<=SIZEOF_DOUBLE<=SIZEOF_LONG_DOUBLE ALIGN_BOOL ALIGN_CHAR ALIGN_SHORT ALIGN_INT ALIGN_LONG ALIGN_LONG_LONG ALIGN_ADDRESS //廃止予定 ALIGN_OFFSET ALIGN_FLOAT ALIGN_DOUBLE ALIGN_LONG_DOUBLE 制約: 0<ALIGN_CHAR<=ALIGN_SHORT<=ALIGN_INT<=ALIGN_LONG<=ALIGN_LONG_LONG 制約: 0<ALIGN_FLOAT<=ALIGN_DOUBLE<=ALIGN_LONG_DOUBLE
BIG_ENDIANならビッグエンディアン、LITTLE_ENDIANならリトルエンディアン。
KIND_OTHER Symbol other than followings. KIND_CONST_FIRST KIND_BOOL_CONST Bool constant KIND_CHAR_CONST Character (char, signed char, unsigned char) KIND_INT_CONST Integer constant (int, short, long, u_int, u_short, u_long) KIND_FLOAT_CONST Float constant (float, double, long double) KIND_STRING_CONST KIND_NAMED_CONST Named constant including enumulation. KIND_CONST_LAST KIND_VAR KIND_PARAM Parameter. KIND_ELEM struct/union element. KIND_TAG struct/union tag. KIND_SUBP Subprogram. KIND_TYPE Type symbol. KIND_LABEL Label. KIND_AREG Abstract register. KIND_MREG Machine register. KIND_EXP_ID Expression identifier.
short 短い整数 int 整数 long 長い整数 long_long 長々整数 float 浮動小数点数 double 倍精度浮動小数点数 long_double 長い倍精度浮動小数点数 char 文字 string 文字列 bool FALSE,TRUEを値とする u_short 符号なしの短い整数 u_int 符号なしの整数 u_long 符号なしの長い整数 u_long_long 符号なしの長々整数 u_char 符号なしの文字 address 記憶番地 //廃止予定 offset sizeofの結果、ポインタの差などの型 void 値を持たない型 (PTR t) ポインタ(オブジェクトを指し示す型) (VECT n t) 一次元配列(nがnullだとサイズ不明) (STRUCT (t1 n1) ...) 構造体(中身がnulだと不完全型) (UNION (t1 n1) ...) 共用体(Cの意味で)(中身がnulだと不完全型) (ENUM (n1 i1) ...) 列挙体(列挙定数の値は省略しない) (SUBP ...) 副プログラム(変数渡しはポインタに変換する)(詳細未定) (TYPEDEF t) 型名定義 KIND_UNDEF = 0, // Not yet defined but defined later. KIND_BOOL = 1, KIND_SHORT = 3, KIND_INT = 4, KIND_LONG = 5, KIND_LONG_LONG = 6, KIND_CHAR = 7, KIND_UNSIGNED_LOWER_LIM = 8, KIND_U_CHAR = 8, KIND_U_SHORT = 9, KIND_U_INT = 10, KIND_U_LONG = 11, KIND_U_LONG_LONG = 12, KIND_INT_UPPER_LIM = 12, KIND_ADDRESS = 13, KIND_OFFSET = 14, KIND_VOID = 15, KIND_FLOAT_LOWER_LIM = 16, KIND_FLOAT = 16, KIND_DOUBLE = 17, KIND_LONG_DOUBLE = 18, KIND_FLOAT_UPPER_LIM = 19, KIND_STRING = 20, KIND_BASE_LIM = 20, KIND_ENUM = 21, KIND_POINTER = 22, KIND_VECTOR = 23, KIND_STRUCT = 24, KIND_UNION = 25, KIND_DEFINED = 26, KIND_SUBP = 27;
OP_PROG Program OP_SUBP_DEF SubpDefinition OP_LABEL_DEF LabelDef node OP_INF Information node OP_CONST ConstNode OP_SYM SymNode OP_VAR VarNode OP_PARAM VarNode OP_SUBP SubpNode サブプログラム呼び出しに使う名前 OP_TYPE TypeNode OP_LABEL LabelNode OP_ELEM ElemNode // OP_FIELD OP_LIST List of CompilerObjects such as IR nodes and symbols OP_SEQ Sequence of CompilerObjects OP_ENCLOSE OP_SUBS OP_INDEX OP_QUAL OP_ARROW OP_STMT OP_LABELED_STMT LabeledStmt OP_ASSIGN OP_IF OP_WHILE OP_FOR OP_UNTIL OP_INDEXED_LOOP Fortran型のループ OP_JUMP OP_SWITCH OP_CALL OP_RETURN OP_BLOCK OP_EXP_STMT 返り値を使わないOP_CALL、ループの条件、volatile読み出し OP_STMT_UPPER OP_ADD OP_SUB OP_MULT OP_DIV OP_MOD 浮動小数点数も扱える OP_AND OP_OR OP_XOR OP_CMP_EQ OP_CMP_NE OP_CMP_GT OP_CMP_GE OP_CMP_LT OP_CMP_LE OP_SHIFT_LL OP_SHIFT_R OP_SHIFT_RL OP_NOT OP_NEG 符号つき数のみ OP_ADDR OP_CONV OP_DECAY 配列を先頭要素へのポインタに変換 OP_UNDECAY OP_CONTENTS //OP_CAST OP_SIZEOF 結果はoffset型 OP_PHI OP_NULL
OP_ADD,OP_SUB,OP_MUL,OP_DIV,OP_MOD,OP_AND,OP_OR,OP_XOR,OP_NOT,OP_NEG(符号つき整数)
OP_SHIFT_LL,OP_SHIFT_R,OP_SHIFT_RL
OP_ADD,OP_SUB,OP_MUL,OP_DIV,OP_MOD,OP_NEG
OP_AND,OP_OR,OP_XOR,OP_NOT
OP_CMP_EQ,OP_CMP_NE,OP_CMP_GT,OP_CMP_GE,OP_CMP_LT,OP_CMP_LE
OP_CMP_EQ,OP_CMP_NE
演算子 入力1 入力2 出力 OP_ADD offset offset offset OP_ADD offset 整数型 offset (追加) OP_SUB offset offset offset OP_SUB offset 整数型 offset (追加) OP_MUL offset 整数型 offset OP_DIV offset offset 検討中 OP_ADD ポインタ offset ポインタ OP_SUB ポインタ offset ポインタ OP_SUB ポインタ ポインタ offset OP_NEG offset offset
OP_ASSIGNの値を使用できる
OP_ADD,OP_SUB演算子にFLAG_C_PTRフラグがついていた場合、サイズの乗除算を含む演算子とみなす
OP_OFFSET ポインタ同士の減算 OP_LG_AND OP_LG_OR OP_SELECT OP_COMMA OP_PRE_INCR OP_PRE_DECR OP_POST_INCR OP_POST_DECR OP_ADD_ASSIGN OP_SUB_ASSIGN OP_MULT_ASSIGN OP_DIV_ASSIGN OP_MOD_ASSIGN OP_SHIFT_L_ASSIGN OP_SHIFT_R_ASSIGN OP_AND_ASSIGN OP_OR_ASSIGN OP_XOR_ASSIGN
OP_PROG OP_SUBP_DEF OP_LABEL_DEF OP_INF OP_SUBP OP_TYPE OP_LABEL OP_LIST OP_SEQ OP_LABELED_STMT OP_IF OP_WHILE OP_FOR OP_UNTIL OP_SWITCH OP_BLOCK OP_NULL
変数の番地を抽象化するためにSTATIC式とFRAME式を導入している。FRAMEはフレーム割り当てのパスで取り除かれるが、STATICはリンカが解決するため、(アセンブリ言語での出力を仮定する限り)最後まで残る。
レジスタを抽象化するために、仮想レジスタを許している。レジスタ割り当てのパスで実レジスタに置き換えられる。
VOID I8 I16 I32 I64 I128 F32 F64 F128
OPERATOR 下でさらに細分化される JUMP REGISTER REG CONST INTCONST,FLOATCONST? LABEL VARIABLE STATIC,FRAME MEMORY MEM CALL SUBREG 未サポート PARALLEL USE CLOBBER ASMCONST PROLOGUE レジスタ渡し引数を持つ仮想レジスタの指定も行う EPILOGUE 返り値を持つ仮想レジスタの指定も行う PHI 未サポート LINEINFO 未サポート
SET 代入結果を返す(今のところ使われない) NEG ADD SUB MUL DIVS DIVU MODS MODU BAND BXOR BOR BNOT LSHS LSHU RSHS RSHU CONVSX CONVZX CONVIT CONVFX CONVFT CONVFI CONVSF CONVUF
{SIZEOF,ALIGN}_S_CHARを削除(HIRの基本型ではcharは符号つき)
{SIZEOF,ALIGN}_{U,S}_XXXを削除(signedとunsignedで同じとしたため)
BITS_IN_HOST_XXXを削除(Javaでの実装を前提とする限り不要)
ADDRRESを削除
{SIZEOF,ALIGN}_ADDRESSを削除
CONDITION,DESTINATION,ARGUMENTはLISTに変更(二分木で実装したためにつけた意味のない名前に過ぎないため)
DIVS,MODS,LSHS,RSHS,TSTLTS,TSTLES,TSTGTS,TSTGES)
OP_ADD_A,OP_SUB_Aを削除(offset関係も通常の演算子を使う)
OP_SHIFT_L(符号ビットを保存する左シフト)とOP_LG_NOT(bool専用のnot)を削除
KIND_DEFINEDを追加
SMALL_ENDIANをLITTLE_ENDIANに変更
OP_TYPE(TypeNode)はsizeof用に作ったが、cfrontの問題のため使われていない
符号つき signed 符号なし unsigned 記号表 symbol table 定数伝播 constant propagation 定数畳み込み constant folding 抽象レジスタ 仮想レジスタ 実レジスタ 物理レジスタ ハードレジスタ パターンマッチング 命令語設定 ソース言語 入力言語 ターゲットマシン