diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index f5e4a5c3..55435871 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -2486,6 +2486,64 @@ e2_compile_from_expr(Arena *arena, E2_CompileState *state, E2_IRNode *resolve_re scratch_end(scratch); }break; + //- rjf: const type operator + case E2_ExprKind_Const: + { + E2_TypeKey const_type_key = e2_type_key_cons(E2_TypeKind_Modifier, .flags = E2_TypeFlag_Const, .direct = lhs->type_key); + finished_root = e2_irnode(arena); + finished_root->type_key = const_type_key; + }break; + + //- rjf: volatile type operator + case E2_ExprKind_Volatile: + { + E2_TypeKey volatile_type_key = e2_type_key_cons(E2_TypeKind_Modifier, .flags = E2_TypeFlag_Volatile, .direct = lhs->type_key); + finished_root = e2_irnode(arena); + finished_root->type_key = volatile_type_key; + }break; + + //- rjf: unsigned type operator + case E2_ExprKind_Unsigned: + { + E2_TypeKey unsigned_type_key = lhs->type_key; + E2_TypeKey int_type_key = e2_type_key_undecorate(lhs->type_key); + E2_TypeKind int_type_kind = e2_type_kind_from_key(int_type_key); + switch(int_type_kind) + { + default:{}break; + case E2_TypeKind_S8: {unsigned_type_key = e2_type_key_basic(E2_TypeKind_U8);}break; + case E2_TypeKind_S16: {unsigned_type_key = e2_type_key_basic(E2_TypeKind_U16);}break; + case E2_TypeKind_S32: {unsigned_type_key = e2_type_key_basic(E2_TypeKind_U32);}break; + case E2_TypeKind_S64: {unsigned_type_key = e2_type_key_basic(E2_TypeKind_U64);}break; + case E2_TypeKind_S128:{unsigned_type_key = e2_type_key_basic(E2_TypeKind_U128);}break; + case E2_TypeKind_S256:{unsigned_type_key = e2_type_key_basic(E2_TypeKind_U256);}break; + case E2_TypeKind_S512:{unsigned_type_key = e2_type_key_basic(E2_TypeKind_U512);}break; + } + finished_root = e2_irnode(arena); + finished_root->type_key = unsigned_type_key; + }break; + + //- rjf: signed type operator + case E2_ExprKind_Signed: + { + E2_TypeKey signed_type_key = lhs->type_key; + E2_TypeKey int_type_key = e2_type_key_undecorate(lhs->type_key); + E2_TypeKind int_type_kind = e2_type_kind_from_key(int_type_key); + switch(int_type_kind) + { + default:{}break; + case E2_TypeKind_U8: {signed_type_key = e2_type_key_basic(E2_TypeKind_S8);}break; + case E2_TypeKind_U16: {signed_type_key = e2_type_key_basic(E2_TypeKind_S16);}break; + case E2_TypeKind_U32: {signed_type_key = e2_type_key_basic(E2_TypeKind_S32);}break; + case E2_TypeKind_U64: {signed_type_key = e2_type_key_basic(E2_TypeKind_S64);}break; + case E2_TypeKind_U128:{signed_type_key = e2_type_key_basic(E2_TypeKind_S128);}break; + case E2_TypeKind_U256:{signed_type_key = e2_type_key_basic(E2_TypeKind_S256);}break; + case E2_TypeKind_U512:{signed_type_key = e2_type_key_basic(E2_TypeKind_S512);}break; + } + finished_root = e2_irnode(arena); + finished_root->type_key = signed_type_key; + }break; + //- rjf: leaf numerics case E2_ExprKind_Numeric: { diff --git a/src/eval2/eval2.h b/src/eval2/eval2.h index ab134099..ff912ad5 100644 --- a/src/eval2/eval2.h +++ b/src/eval2/eval2.h @@ -147,11 +147,19 @@ struct E2_TypeKeyList //////////////////////////////// //~ rjf: Constructed Type Cache Types +typedef U32 E2_TypeFlags; +enum +{ + E2_TypeFlag_Const = (1<<0), + E2_TypeFlag_Volatile = (1<<1), +}; + typedef struct E2_ConsTypeParams E2_ConsTypeParams; struct E2_ConsTypeParams { Arch arch; E2_TypeKind kind; + E2_TypeFlags flags; String8 name; E2_TypeKey direct; U64 count; diff --git a/src/eval2/eval2.mdesk b/src/eval2/eval2.mdesk index 932ad155..70d13964 100644 --- a/src/eval2/eval2.mdesk +++ b/src/eval2/eval2.mdesk @@ -4,15 +4,24 @@ @table(name allow_type_operands is_type_expression is_first_operand_type_maybe target_operand_count) E2_ExprKindTable: { + //- rjf: leaves {Identifier 0 0 0 0 } {MacroArg 0 0 0 0 } {TypeIdentifier 0 1 0 0 } - {Ptr 1 1 1 1 } - {Array 1 1 1 2 } - {Function 1 1 1 0xffffffffffffffffull} {Numeric 0 0 0 0 } {StringLiteral 0 0 0 0 } {CharLiteral 0 0 0 0 } + + //- rjf: type operators + {Ptr 1 1 1 1 } + {Array 1 1 1 2 } + {Function 1 1 1 0xffffffffffffffffull} + {Const 1 1 1 1 } + {Volatile 1 1 1 1 } + {Unsigned 1 1 1 1 } + {Signed 1 1 1 1 } + + //- rjf: operators {Dot 1 0 0 1 } {Index 0 0 0 2 } {Call 0 0 0 0xffffffffffffffffull} @@ -117,45 +126,49 @@ E2_LangKindTable: @table(name parse_kind precedence pre sep pos chain reverse_children) E2_ExprKindParseInfoTable_CLike: { - {Dot Postfix 1 "" "." "" "" 0} - {Index Postfix 1 "" "[" "]" "" 0} - {Call Postfix 1 "" "(" ")" "," 0} - {Function Postfix 1 "" "(" ")" "," 0} - {DerefAsm Prefix 1 "[" "" "]" "" 0} - {SizeOf Prefix 1 "sizeof " "" "" "" 0} - {TypeOf Prefix 1 "typeof " "" "" "" 0} - {SizeOf Prefix 1 "size_of " "" "" "" 0} - {TypeOf Prefix 1 "type_of " "" "" "" 0} - {Cast Prefix 1 "" "" "" "" 0} - {Deref Prefix 2 "*" "" "" "" 0} - {Address Prefix 2 "&" "" "" "" 0} - {Pos Prefix 2 "+" "" "" "" 0} - {Neg Prefix 2 "-" "" "" "" 0} - {LogNot Prefix 2 "!" "" "" "" 0} - {BitNot Prefix 2 "~" "" "" "" 0} - {Cast Prefix 1 "cast " "" "" "" 0} - {Cast Postfix 1 "" "as" "" "" 1} - {Ptr Postfix 1 "" "" "*" "" 0} - {Array Postfix 1 "" "[" "]" "" 0} - {Mul Postfix 3 "" "*" "" "" 0} - {Div Postfix 3 "" "/" "" "" 0} - {Mod Postfix 3 "" "%" "" "" 0} - {Add Postfix 4 "" "+" "" "" 0} - {Sub Postfix 4 "" "-" "" "" 0} - {LShift Postfix 5 "" "<<" "" "" 0} - {RShift Postfix 5 "" ">>" "" "" 0} - {Less Postfix 6 "" "<" "" "" 0} - {LtEq Postfix 6 "" "<=" "" "" 0} - {Grtr Postfix 6 "" ">" "" "" 0} - {GrEq Postfix 6 "" ">=" "" "" 0} - {EqEq Postfix 7 "" "==" "" "" 0} - {NtEq Postfix 7 "" "!=" "" "" 0} - {BitAnd Postfix 8 "" "&" "" "" 0} - {BitXor Postfix 9 "" "^" "" "" 0} - {BitOr Postfix 10 "" "|" "" "" 0} - {LogAnd Postfix 11 "" "&&" "" "" 0} - {LogOr Postfix 12 "" "||" "" "" 0} - {Cond Postfix 14 "" "?" "" ":" 0} + {Dot Postfix 1 "" "." "" "" 0} + {Index Postfix 1 "" "[" "]" "" 0} + {Call Postfix 1 "" "(" ")" "," 0} + {Function Postfix 1 "" "(" ")" "," 0} + {DerefAsm Prefix 1 "[" "" "]" "" 0} + {Unsigned Prefix 1 "unsigned " "" "" "" 0} + {Signed Prefix 1 "signed " "" "" "" 0} + {Volatile Prefix 1 "volatile " "" "" "" 0} + {Const Prefix 1 "const " "" "" "" 0} + {SizeOf Prefix 1 "sizeof " "" "" "" 0} + {TypeOf Prefix 1 "typeof " "" "" "" 0} + {SizeOf Prefix 1 "size_of " "" "" "" 0} + {TypeOf Prefix 1 "type_of " "" "" "" 0} + {Cast Prefix 1 "" "" "" "" 0} + {Deref Prefix 2 "*" "" "" "" 0} + {Address Prefix 2 "&" "" "" "" 0} + {Pos Prefix 2 "+" "" "" "" 0} + {Neg Prefix 2 "-" "" "" "" 0} + {LogNot Prefix 2 "!" "" "" "" 0} + {BitNot Prefix 2 "~" "" "" "" 0} + {Cast Prefix 1 "cast " "" "" "" 0} + {Cast Postfix 1 "" "as" "" "" 1} + {Ptr Postfix 1 "" "" "*" "" 0} + {Array Postfix 1 "" "[" "]" "" 0} + {Mul Postfix 3 "" "*" "" "" 0} + {Div Postfix 3 "" "/" "" "" 0} + {Mod Postfix 3 "" "%" "" "" 0} + {Add Postfix 4 "" "+" "" "" 0} + {Sub Postfix 4 "" "-" "" "" 0} + {LShift Postfix 5 "" "<<" "" "" 0} + {RShift Postfix 5 "" ">>" "" "" 0} + {Less Postfix 6 "" "<" "" "" 0} + {LtEq Postfix 6 "" "<=" "" "" 0} + {Grtr Postfix 6 "" ">" "" "" 0} + {GrEq Postfix 6 "" ">=" "" "" 0} + {EqEq Postfix 7 "" "==" "" "" 0} + {NtEq Postfix 7 "" "!=" "" "" 0} + {BitAnd Postfix 8 "" "&" "" "" 0} + {BitXor Postfix 9 "" "^" "" "" 0} + {BitOr Postfix 10 "" "|" "" "" 0} + {LogAnd Postfix 11 "" "&&" "" "" 0} + {LogOr Postfix 12 "" "||" "" "" 0} + {Cond Postfix 14 "" "?" "" ":" 0} } @data(E2_ExprKindParseInfo) e2_expr_kind_parse_info_table__clike: diff --git a/src/eval2/generated/eval2.meta.c b/src/eval2/generated/eval2.meta.c index 7612deae..7affddae 100644 --- a/src/eval2/generated/eval2.meta.c +++ b/src/eval2/generated/eval2.meta.c @@ -4,19 +4,23 @@ //- GENERATED CODE C_LINKAGE_BEGIN -B8 e2_expr_kind_allow_type_operands_table[44] = +B8 e2_expr_kind_allow_type_operands_table[48] = { 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 1, +1, +1, +1, +1, +1, +1, +1, 0, 0, 1, @@ -52,18 +56,22 @@ B8 e2_expr_kind_allow_type_operands_table[44] = 1, }; -B8 e2_expr_kind_is_type_expr_table[44] = +B8 e2_expr_kind_is_type_expr_table[48] = { 0, 0, 0, 1, -1, -1, -1, 0, 0, 0, +1, +1, +1, +1, +1, +1, +1, 0, 0, 0, @@ -100,18 +108,22 @@ B8 e2_expr_kind_is_type_expr_table[44] = 0, }; -B8 e2_expr_kind_is_first_operand_type_maybe_table[44] = +B8 e2_expr_kind_is_first_operand_type_maybe_table[48] = { 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, +1, +1, +1, +1, +1, +1, +1, 0, 0, 0, @@ -148,18 +160,22 @@ B8 e2_expr_kind_is_first_operand_type_maybe_table[44] = 0, }; -U64 e2_expr_kind_target_operand_count_table[44] = +U64 e2_expr_kind_target_operand_count_table[48] = { 0, 0, 0, 0, +0, +0, +0, 1, 2, 0xffffffffffffffffull, -0, -0, -0, +1, +1, +1, +1, 1, 2, 0xffffffffffffffffull, @@ -201,13 +217,17 @@ E2_LangInfo e2_lang_kind_info_table[1] = {ArrayCount(e2_expr_kind_parse_info_table__clike), (e2_expr_kind_parse_info_table__clike)}, }; -E2_ExprKindParseInfo e2_expr_kind_parse_info_table__clike[39] = +E2_ExprKindParseInfo e2_expr_kind_parse_info_table__clike[43] = { {E2_ExprKind_Dot, E2_ExprParseKind_Postfix, 1, 0, str8_lit_comp(""), str8_lit_comp("."), str8_lit_comp(""), str8_lit_comp("")}, {E2_ExprKind_Index, E2_ExprParseKind_Postfix, 1, 0, str8_lit_comp(""), str8_lit_comp("["), str8_lit_comp("]"), str8_lit_comp("")}, {E2_ExprKind_Call, E2_ExprParseKind_Postfix, 1, 0, str8_lit_comp(""), str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp(",")}, {E2_ExprKind_Function, E2_ExprParseKind_Postfix, 1, 0, str8_lit_comp(""), str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp(",")}, {E2_ExprKind_DerefAsm, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("["), str8_lit_comp(""), str8_lit_comp("]"), str8_lit_comp("")}, +{E2_ExprKind_Unsigned, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("unsigned "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, +{E2_ExprKind_Signed, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("signed "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, +{E2_ExprKind_Volatile, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("volatile "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, +{E2_ExprKind_Const, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("const "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, {E2_ExprKind_SizeOf, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("sizeof "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, {E2_ExprKind_TypeOf, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("typeof "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, {E2_ExprKind_SizeOf, E2_ExprParseKind_Prefix, 1, 0, str8_lit_comp("size_of "), str8_lit_comp(""), str8_lit_comp(""), str8_lit_comp("")}, diff --git a/src/eval2/generated/eval2.meta.h b/src/eval2/generated/eval2.meta.h index fb22a0db..2bc7ea5b 100644 --- a/src/eval2/generated/eval2.meta.h +++ b/src/eval2/generated/eval2.meta.h @@ -12,12 +12,16 @@ E2_ExprKind_Null, E2_ExprKind_Identifier, E2_ExprKind_MacroArg, E2_ExprKind_TypeIdentifier, -E2_ExprKind_Ptr, -E2_ExprKind_Array, -E2_ExprKind_Function, E2_ExprKind_Numeric, E2_ExprKind_StringLiteral, E2_ExprKind_CharLiteral, +E2_ExprKind_Ptr, +E2_ExprKind_Array, +E2_ExprKind_Function, +E2_ExprKind_Const, +E2_ExprKind_Volatile, +E2_ExprKind_Unsigned, +E2_ExprKind_Signed, E2_ExprKind_Dot, E2_ExprKind_Index, E2_ExprKind_Call, @@ -159,12 +163,12 @@ E2_ExprKindParseInfo *expr_kind_parse_infos; }; C_LINKAGE_BEGIN -extern B8 e2_expr_kind_allow_type_operands_table[44]; -extern B8 e2_expr_kind_is_type_expr_table[44]; -extern B8 e2_expr_kind_is_first_operand_type_maybe_table[44]; -extern U64 e2_expr_kind_target_operand_count_table[44]; +extern B8 e2_expr_kind_allow_type_operands_table[48]; +extern B8 e2_expr_kind_is_type_expr_table[48]; +extern B8 e2_expr_kind_is_first_operand_type_maybe_table[48]; +extern U64 e2_expr_kind_target_operand_count_table[48]; extern E2_LangInfo e2_lang_kind_info_table[1]; -extern E2_ExprKindParseInfo e2_expr_kind_parse_info_table__clike[39]; +extern E2_ExprKindParseInfo e2_expr_kind_parse_info_table__clike[43]; extern U8 e2_type_kind_basic_byte_size_table[61]; extern String8 e2_type_kind_basic_string_table[61];