From b0ac77b44d4f49c7ebfafa0b346eeb0deb6e0156 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Mon, 14 Nov 2022 19:51:02 -0600 Subject: [PATCH] vkd3d-shader/hlsl: Return a hlsl_block from the "expr_statement" and "expr" rules. --- libs/vkd3d-shader/hlsl.y | 83 +++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 44 deletions(-) diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 00179664..a888ec76 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -442,19 +442,19 @@ static DWORD add_modifiers(struct hlsl_ctx *ctx, DWORD modifiers, DWORD mod, return modifiers | mod; } -static bool append_conditional_break(struct hlsl_ctx *ctx, struct list *cond_list) +static bool append_conditional_break(struct hlsl_ctx *ctx, struct hlsl_block *cond_block) { struct hlsl_ir_node *condition, *not, *iff, *jump; struct hlsl_block then_block; /* E.g. "for (i = 0; ; ++i)". */ - if (list_empty(cond_list)) + if (list_empty(&cond_block->instrs)) return true; - condition = node_from_list(cond_list); + condition = node_from_block(cond_block); if (!(not = hlsl_new_unary_expr(ctx, HLSL_OP1_LOGIC_NOT, condition, &condition->loc))) return false; - list_add_tail(cond_list, ¬->entry); + hlsl_block_add_instr(cond_block, not); hlsl_block_init(&then_block); @@ -464,7 +464,7 @@ static bool append_conditional_break(struct hlsl_ctx *ctx, struct list *cond_lis if (!(iff = hlsl_new_if(ctx, not, &then_block, NULL, &condition->loc))) return false; - list_add_tail(cond_list, &iff->entry); + hlsl_block_add_instr(cond_block, iff); return true; } @@ -492,8 +492,8 @@ static bool attribute_list_has_duplicates(const struct parse_attribute_list *att } static struct hlsl_block *create_loop(struct hlsl_ctx *ctx, enum loop_type type, - const struct parse_attribute_list *attributes, struct list *init, struct list *cond, - struct list *iter, struct hlsl_block *body, const struct vkd3d_shader_location *loc) + const struct parse_attribute_list *attributes, struct hlsl_block *init, struct hlsl_block *cond, + struct hlsl_block *iter, struct hlsl_block *body, const struct vkd3d_shader_location *loc) { struct hlsl_ir_node *loop; unsigned int i; @@ -528,32 +528,32 @@ static struct hlsl_block *create_loop(struct hlsl_ctx *ctx, enum loop_type type, } } - if (!init && !(init = make_empty_list(ctx))) + if (!init && !(init = make_empty_block(ctx))) goto oom; if (!append_conditional_break(ctx, cond)) goto oom; if (iter) - list_move_tail(&body->instrs, iter); + hlsl_block_add_block(body, iter); if (type == LOOP_DO_WHILE) - list_move_tail(&body->instrs, cond); + list_move_tail(&body->instrs, &cond->instrs); else - list_move_head(&body->instrs, cond); + list_move_head(&body->instrs, &cond->instrs); if (!(loop = hlsl_new_loop(ctx, body, loc))) goto oom; - list_add_tail(init, &loop->entry); + hlsl_block_add_instr(init, loop); - vkd3d_free(cond); + destroy_block(cond); destroy_block(body); - return list_to_block(init); + return init; oom: - destroy_instr_list(init); - destroy_instr_list(cond); - destroy_instr_list(iter); + destroy_block(init); + destroy_block(cond); + destroy_block(iter); destroy_block(body); return NULL; } @@ -4570,9 +4570,6 @@ static void validate_texture_format_type(struct hlsl_ctx *ctx, struct hlsl_type %type declaration %type declaration_statement %type equality_expr -%type expr -%type expr_optional -%type expr_statement %type initializer_expr %type logicand_expr %type logicor_expr @@ -4602,6 +4599,9 @@ static void validate_texture_format_type(struct hlsl_ctx *ctx, struct hlsl_type %type attribute_list_optional %type compound_statement +%type expr +%type expr_optional +%type expr_statement %type jump_statement %type loop_statement %type selection_statement @@ -5639,7 +5639,7 @@ state: any_identifier '=' expr ';' { vkd3d_free($1); - hlsl_free_instr_list($3); + destroy_block($3); } state_block_start: @@ -5705,17 +5705,12 @@ arrays: } | '[' expr ']' arrays { - struct hlsl_block block; uint32_t *new_array; unsigned int size; - hlsl_block_init(&block); - list_move_tail(&block.instrs, $2); + size = evaluate_static_expression_as_uint(ctx, $2, &@2); - size = evaluate_static_expression_as_uint(ctx, &block, &@2); - - hlsl_block_cleanup(&block); - vkd3d_free($2); + destroy_block($2); $$ = $4; @@ -5925,9 +5920,6 @@ statement: $$ = list_to_block($1); } | expr_statement - { - $$ = list_to_block($1); - } | compound_statement | jump_statement | selection_statement @@ -5936,7 +5928,7 @@ statement: jump_statement: KW_RETURN expr ';' { - $$ = list_to_block($2); + $$ = $2; if (!add_return(ctx, $$, node_from_block($$), &@1)) YYABORT; } @@ -5966,7 +5958,7 @@ jump_statement: selection_statement: KW_IF '(' expr ')' if_body { - struct hlsl_ir_node *condition = node_from_list($3); + struct hlsl_ir_node *condition = node_from_block($3); struct hlsl_ir_node *instr; if (!(instr = hlsl_new_if(ctx, condition, $5.then_block, $5.else_block, &@1))) @@ -5986,7 +5978,7 @@ selection_statement: "if condition type %s is not scalar.", string->buffer); hlsl_release_string_buffer(ctx, string); } - $$ = list_to_block($3); + $$ = $3; hlsl_block_add_instr($$, instr); } @@ -6018,14 +6010,14 @@ loop_statement: } | attribute_list_optional KW_FOR '(' scope_start declaration expr_statement expr_optional ')' statement { - $$ = create_loop(ctx, LOOP_FOR, &$1, $5, $6, $7, $9, &@2); + $$ = create_loop(ctx, LOOP_FOR, &$1, list_to_block($5), $6, $7, $9, &@2); hlsl_pop_scope(ctx); } expr_optional: %empty { - if (!($$ = make_empty_list(ctx))) + if (!($$ = make_empty_block(ctx))) YYABORT; } | expr @@ -6095,7 +6087,7 @@ primary_expr: } | '(' expr ')' { - $$ = $2; + $$ = block_to_list($2); } | var_identifier '(' func_arguments ')' { @@ -6189,10 +6181,10 @@ postfix_expr: } | postfix_expr '[' expr ']' { - struct hlsl_ir_node *array = node_from_list($1), *index = node_from_list($3); + struct hlsl_ir_node *array = node_from_list($1), *index = node_from_block($3); - list_move_head($1, $3); - vkd3d_free($3); + list_move_head($1, &$3->instrs); + destroy_block($3); if (!add_array_access(ctx, $1, array, index, &@2)) { @@ -6451,12 +6443,12 @@ conditional_expr: logicor_expr | logicor_expr '?' expr ':' assignment_expr { - struct hlsl_ir_node *cond = node_from_list($1), *first = node_from_list($3), *second = node_from_list($5); + struct hlsl_ir_node *cond = node_from_list($1), *first = node_from_block($3), *second = node_from_list($5); struct hlsl_type *common_type; - list_move_tail($1, $3); + list_move_tail($1, &$3->instrs); list_move_tail($1, $5); - vkd3d_free($3); + destroy_block($3); vkd3d_free($5); if (!(common_type = get_common_numeric_type(ctx, first, second, &@3))) @@ -6540,9 +6532,12 @@ assign_op: expr: assignment_expr + { + $$ = list_to_block($1); + } | expr ',' assignment_expr { $$ = $1; - list_move_tail($$, $3); + list_move_tail(&$$->instrs, $3); vkd3d_free($3); }