X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ast.h;h=187ec882cb8093dc6f09d24374be9fa0944012e5;hb=3072ce7ebaa1b0ecac17fcae3da77457666f27c2;hp=a08c4c0d4072d5df8bd61cacaff8fd971c59b704;hpb=ed24ea0cef206020757e9d549929313447988033;p=xonotic%2Fgmqcc.git diff --git a/ast.h b/ast.h index a08c4c0..187ec88 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 */ @@ -79,7 +81,9 @@ typedef struct ast_expression_codegen *codegen; int vtype; ast_expression *next; + MEM_VECTOR_MAKE(ast_value*, params); } ast_expression_common; +MEM_VECTOR_PROTO(ast_expression_common, ast_value*, params); /* Value * @@ -110,12 +114,8 @@ struct ast_value_s } constval; ir_value *ir_v; - - /* if vtype is qc_function, params contain parameters, and - * 'next' the return type. - */ - MEM_VECTOR_MAKE(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,9 +123,11 @@ 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); +bool GMQCC_WARN ast_value_params_add(ast_value*, ast_value*); + /* Binary * * A value-returning binary expression. @@ -146,6 +148,41 @@ 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, + 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: @@ -320,6 +357,7 @@ struct ast_block_s }; ast_block* ast_block_new(lex_ctx ctx); void ast_block_delete(ast_block*); +bool ast_block_set_type(ast_block*, ast_expression *from); MEM_VECTOR_PROTO(ast_block, ast_value*, locals); MEM_VECTOR_PROTO(ast_block, ast_expression*, exprs); @@ -358,7 +396,6 @@ struct ast_function_s char labelbuf[64]; MEM_VECTOR_MAKE(ast_block*, blocks); - MEM_VECTOR_MAKE(ast_value*, params); }; ast_function* ast_function_new(lex_ctx ctx, const char *name, ast_value *vtype); /* This will NOT delete the underlying ast_value */ @@ -369,7 +406,6 @@ void ast_function_delete(ast_function*); const char* ast_function_label(ast_function*, const char *prefix); MEM_VECTOR_PROTO(ast_function, ast_block*, blocks); -MEM_VECTOR_PROTO(ast_function, ast_value*, params); bool ast_function_codegen(ast_function *self, ir_builder *builder);