X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ast.h;h=86bb18379f277ca1710e8856f1655ef510d40cc3;hb=31ba1ec6c1302aa466bd25b9e275b5cc16303808;hp=f355716f70d04aeb39fa33f656b1d42217d2f3b6;hpb=e934e77cc56ee24162c7e7b6a4ccfc6ea02dbdcb;p=xonotic%2Fgmqcc.git diff --git a/ast.h b/ast.h index f355716..86bb183 100644 --- a/ast.h +++ b/ast.h @@ -41,6 +41,8 @@ typedef struct ast_ifthen_s ast_ifthen; typedef struct ast_ternary_s ast_ternary; typedef struct ast_loop_s ast_loop; typedef struct ast_call_s ast_call; +typedef struct ast_unary_s ast_unary; +typedef struct ast_return_s ast_return; /* Node interface with common components */ @@ -116,6 +118,8 @@ struct ast_value_s */ MEM_VECTOR_MAKE(ast_value*, params); }; +MEM_VECTOR_PROTO(ast_value, ast_value*, params); + ast_value* ast_value_new(lex_ctx ctx, const char *name, int qctype); /* This will NOT delete an underlying ast_function */ void ast_value_delete(ast_value*); @@ -123,7 +127,7 @@ void ast_value_delete(ast_value*); bool ast_value_set_name(ast_value*, const char *name); bool ast_value_codegen(ast_value*, ast_function*, bool lvalue, ir_value**); -bool ast_local_codegen(ast_value *self, ir_function *func); +bool ast_local_codegen(ast_value *self, ir_function *func, bool isparam); bool ast_global_codegen(ast_value *self, ir_builder *ir); /* Binary @@ -146,6 +150,42 @@ void ast_binary_delete(ast_binary*); bool ast_binary_codegen(ast_binary*, ast_function*, bool lvalue, ir_value**); +/* Unary + * + * Regular unary expressions: not,neg + */ +struct ast_unary_s +{ + ast_expression_common expression; + + int op; + ast_expression *operand; +}; +ast_unary* ast_unary_new(lex_ctx ctx, + int op, + ast_expression *expr); +void ast_unary_delete(ast_unary*); + +bool ast_unary_codegen(ast_unary*, ast_function*, bool lvalue, ir_value**); + +/* Return + * + * Make sure 'return' only happens at the end of a block, otherwise the IR + * will refuse to create further instructions. + * This should be honored by the parser. + */ +struct ast_return_s +{ + ast_expression_common expression; + ast_expression *operand; +}; +ast_return* ast_return_new(lex_ctx ctx, + int op, + ast_expression *expr); +void ast_return_delete(ast_return*); + +bool ast_return_codegen(ast_return*, ast_function*, bool lvalue, ir_value**); + /* Entity-field * * This must do 2 things: @@ -343,6 +383,8 @@ struct ast_function_s ast_value *vtype; const char *name; + int builtin; + ir_function *ir_func; ir_block *curblock; ir_block *breakblock; @@ -356,6 +398,13 @@ struct ast_function_s char labelbuf[64]; MEM_VECTOR_MAKE(ast_block*, blocks); + + /* contrary to the params in ast_value, these are the parameter variables + * which are to be used in expressions. + * The ast_value for the function contains only the parameter types used + * to generate ast_calls, and ast_call contains the parameter values + * used in that call. + */ }; ast_function* ast_function_new(lex_ctx ctx, const char *name, ast_value *vtype); /* This will NOT delete the underlying ast_value */