X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ast.h;h=e88e01603b53c462adbe08488a39fa9461a4beb5;hp=37ee1714871f8eed816e098d447fdb83c2fb1368;hb=b22a76a15226df4679409f00a37af715d0d157ae;hpb=e9ac1c9e2117b6adb6f78f6d9ed1a71679e82606 diff --git a/ast.h b/ast.h index 37ee171..e88e016 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 */ @@ -118,6 +120,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*); @@ -125,7 +129,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 @@ -148,6 +152,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: @@ -360,7 +399,13 @@ struct ast_function_s char labelbuf[64]; MEM_VECTOR_MAKE(ast_block*, blocks); - MEM_VECTOR_MAKE(ast_value*, params); + + /* 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 */ @@ -371,7 +416,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);