X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ast.h;h=95b8962ddab15724979ba111db0e94368117b329;hb=d72cb42b0883b7f382d9bd1240e78cab34ab14ca;hp=0a23a324ae30c77308818e2d583ff0bf0e97878c;hpb=ca033e5acd2c69ee2b4a96046605e0e41f5f597b;p=xonotic%2Fgmqcc.git diff --git a/ast.h b/ast.h index 0a23a32..95b8962 100644 --- a/ast.h +++ b/ast.h @@ -48,27 +48,31 @@ typedef struct ast_member_s ast_member; typedef struct ast_array_index_s ast_array_index; typedef struct ast_breakcont_s ast_breakcont; typedef struct ast_switch_s ast_switch; +typedef struct ast_label_s ast_label; +typedef struct ast_goto_s ast_goto; enum { - TYPE_ast_node, - TYPE_ast_expression, - TYPE_ast_value, - TYPE_ast_function, - TYPE_ast_block, - TYPE_ast_binary, - TYPE_ast_store, - TYPE_ast_binstore, - TYPE_ast_entfield, - TYPE_ast_ifthen, - TYPE_ast_ternary, - TYPE_ast_loop, - TYPE_ast_call, - TYPE_ast_unary, - TYPE_ast_return, - TYPE_ast_member, - TYPE_ast_array_index, - TYPE_ast_breakcont, - TYPE_ast_switch + TYPE_ast_node, /* 0 */ + TYPE_ast_expression, /* 1 */ + TYPE_ast_value, /* 2 */ + TYPE_ast_function, /* 3 */ + TYPE_ast_block, /* 4 */ + TYPE_ast_binary, /* 5 */ + TYPE_ast_store, /* 6 */ + TYPE_ast_binstore, /* 7 */ + TYPE_ast_entfield, /* 8 */ + TYPE_ast_ifthen, /* 9 */ + TYPE_ast_ternary, /* 10 */ + TYPE_ast_loop, /* 11 */ + TYPE_ast_call, /* 12 */ + TYPE_ast_unary, /* 13 */ + TYPE_ast_return, /* 14 */ + TYPE_ast_member, /* 15 */ + TYPE_ast_array_index, /* 16 */ + TYPE_ast_breakcont, /* 17 */ + TYPE_ast_switch, /* 18 */ + TYPE_ast_label, /* 19 */ + TYPE_ast_goto /* 20 */ }; #define ast_istype(x, t) ( ((ast_node_common*)x)->nodetype == (TYPE_##t) ) @@ -127,7 +131,7 @@ typedef struct /* arrays get a member-count */ size_t count; ast_value* *params; - bool variadic; + uint32_t flags; /* The codegen functions should store their output values * so we can call it multiple times without re-evaluating. * Store lvalue and rvalue seperately though. So that @@ -136,6 +140,8 @@ typedef struct ir_value *outl; ir_value *outr; } ast_expression_common; +#define AST_FLAG_VARIADIC (1<<0) +#define AST_FLAG_NORETURN (1<<1) /* Value * @@ -155,7 +161,9 @@ struct ast_value_s ast_value *next; */ - bool isconst; + bool cvq; /* const/var qualifier */ + bool isfield; /* this declares a field */ + bool hasvalue; union { double vfloat; int vint; @@ -163,6 +171,7 @@ struct ast_value_s const char *vstring; int ventity; ast_function *vfunc; + ast_value *vfield; } constval; /* usecount for the parser */ @@ -229,6 +238,8 @@ struct ast_binstore_s int opbin; ast_expression *dest; ast_expression *source; + /* for &~= which uses the destination in a binary in source we can use this */ + bool keep_dest; }; ast_binstore* ast_binstore_new(lex_ctx ctx, int storeop, @@ -488,6 +499,42 @@ void ast_switch_delete(ast_switch*); bool ast_switch_codegen(ast_switch*, ast_function*, bool lvalue, ir_value**); +/* Label nodes + * + * Introduce a label which can be used together with 'goto' + */ +struct ast_label_s +{ + ast_expression_common expression; + const char *name; + ir_block *irblock; + ast_goto **gotos; +}; + +ast_label* ast_label_new(lex_ctx ctx, const char *name); +void ast_label_delete(ast_label*); +void ast_label_register_goto(ast_label*, ast_goto*); + +bool ast_label_codegen(ast_label*, ast_function*, bool lvalue, ir_value**); + +/* GOTO nodes + * + * Go to a label, the label node is filled in at a later point! + */ +struct ast_goto_s +{ + ast_expression_common expression; + const char *name; + ast_label *target; + ir_block *irblock_from; +}; + +ast_goto* ast_goto_new(lex_ctx ctx, const char *name); +void ast_goto_delete(ast_goto*); +void ast_goto_set_label(ast_goto*, ast_label*); + +bool ast_goto_codegen(ast_goto*, ast_function*, bool lvalue, ir_value**); + /* CALL node * * Contains an ast_expression as target, rather than an ast_function/value. @@ -528,7 +575,7 @@ bool ast_block_set_type(ast_block*, ast_expression *from); bool ast_block_codegen(ast_block*, ast_function*, bool lvalue, ir_value**); void ast_block_collect(ast_block*, ast_expression*); -void ast_block_add_expr(ast_block*, ast_expression*); +bool GMQCC_WARN ast_block_add_expr(ast_block*, ast_expression*); /* Function * @@ -581,6 +628,7 @@ void ast_function_delete(ast_function*); const char* ast_function_label(ast_function*, const char *prefix); bool ast_function_codegen(ast_function *self, ir_builder *builder); +bool ast_generate_accessors(ast_value *asvalue, ir_builder *ir); /* Expression union */