X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ast.h;h=f1ca3c8d7d6c33c48e9de6ce2a11ad10c83a4f5b;hb=2ec0a96a2120f803fc408b747312bd450963ecb7;hp=00802ca3168aca62fbab474dc20111b78a3465b0;hpb=a7fb45f102d281efe1827c700f1dcc5fc4ce3c68;p=xonotic%2Fgmqcc.git diff --git a/ast.h b/ast.h index 00802ca..f1ca3c8 100644 --- a/ast.h +++ b/ast.h @@ -48,6 +48,8 @@ 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, @@ -68,11 +70,14 @@ enum { TYPE_ast_member, TYPE_ast_array_index, TYPE_ast_breakcont, - TYPE_ast_switch + TYPE_ast_switch, + TYPE_ast_label, + TYPE_ast_goto }; #define ast_istype(x, t) ( ((ast_node_common*)x)->nodetype == (TYPE_##t) ) #define ast_ctx(node) (((ast_node_common*)(node))->context) +#define ast_side_effects(node) (((ast_node_common*)(node))->side_effects) /* Node interface with common components */ @@ -87,6 +92,7 @@ typedef struct * prevents its dtor from destroying this node as well. */ bool keep; + bool side_effects; } ast_node_common; #define ast_delete(x) ( ( (ast_node*)(x) ) -> node.destroy )((ast_node*)(x)) @@ -153,7 +159,8 @@ struct ast_value_s ast_value *next; */ - bool isconst; + bool constant; + bool hasvalue; union { double vfloat; int vint; @@ -227,6 +234,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, @@ -309,8 +318,9 @@ struct ast_member_s ast_expression_common expression; ast_expression *owner; unsigned int field; + const char *name; }; -ast_member* ast_member_new(lex_ctx ctx, ast_expression *owner, unsigned int field); +ast_member* ast_member_new(lex_ctx ctx, ast_expression *owner, unsigned int field, const char *name); void ast_member_delete(ast_member*); bool ast_member_codegen(ast_member*, ast_function*, bool lvalue, ir_value**); @@ -485,6 +495,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. @@ -525,6 +571,8 @@ 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*); + /* Function * * Contains a list of blocks... at least in theory.