mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/hlsl: Free all instruction lists in reverse order (Valgrind).
Signed-off-by: Zebediah Figura <zfigura@codeweavers.com> Signed-off-by: Matteo Bruni <mbruni@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
committed by
Alexandre Julliard
parent
0376a8b4ee
commit
2db8cbc9a7
@@ -1278,7 +1278,6 @@ void hlsl_free_instr_list(struct list *list)
|
|||||||
* the "uses" list. */
|
* the "uses" list. */
|
||||||
LIST_FOR_EACH_ENTRY_SAFE_REV(node, next_node, list, struct hlsl_ir_node, entry)
|
LIST_FOR_EACH_ENTRY_SAFE_REV(node, next_node, list, struct hlsl_ir_node, entry)
|
||||||
hlsl_free_instr(node);
|
hlsl_free_instr(node);
|
||||||
vkd3d_free(list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_ir_constant(struct hlsl_ir_constant *constant)
|
static void free_ir_constant(struct hlsl_ir_constant *constant)
|
||||||
@@ -1297,12 +1296,8 @@ static void free_ir_expr(struct hlsl_ir_expr *expr)
|
|||||||
|
|
||||||
static void free_ir_if(struct hlsl_ir_if *if_node)
|
static void free_ir_if(struct hlsl_ir_if *if_node)
|
||||||
{
|
{
|
||||||
struct hlsl_ir_node *node, *next_node;
|
hlsl_free_instr_list(&if_node->then_instrs);
|
||||||
|
hlsl_free_instr_list(&if_node->else_instrs);
|
||||||
LIST_FOR_EACH_ENTRY_SAFE(node, next_node, &if_node->then_instrs, struct hlsl_ir_node, entry)
|
|
||||||
hlsl_free_instr(node);
|
|
||||||
LIST_FOR_EACH_ENTRY_SAFE(node, next_node, &if_node->else_instrs, struct hlsl_ir_node, entry)
|
|
||||||
hlsl_free_instr(node);
|
|
||||||
hlsl_src_remove(&if_node->condition);
|
hlsl_src_remove(&if_node->condition);
|
||||||
vkd3d_free(if_node);
|
vkd3d_free(if_node);
|
||||||
}
|
}
|
||||||
@@ -1320,10 +1315,7 @@ static void free_ir_load(struct hlsl_ir_load *load)
|
|||||||
|
|
||||||
static void free_ir_loop(struct hlsl_ir_loop *loop)
|
static void free_ir_loop(struct hlsl_ir_loop *loop)
|
||||||
{
|
{
|
||||||
struct hlsl_ir_node *node, *next_node;
|
hlsl_free_instr_list(&loop->body);
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY_SAFE(node, next_node, &loop->body, struct hlsl_ir_node, entry)
|
|
||||||
hlsl_free_instr(node);
|
|
||||||
vkd3d_free(loop);
|
vkd3d_free(loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1342,6 +1334,8 @@ static void free_ir_swizzle(struct hlsl_ir_swizzle *swizzle)
|
|||||||
|
|
||||||
void hlsl_free_instr(struct hlsl_ir_node *node)
|
void hlsl_free_instr(struct hlsl_ir_node *node)
|
||||||
{
|
{
|
||||||
|
assert(list_empty(&node->uses));
|
||||||
|
|
||||||
switch (node->type)
|
switch (node->type)
|
||||||
{
|
{
|
||||||
case HLSL_IR_CONSTANT:
|
case HLSL_IR_CONSTANT:
|
||||||
@@ -1382,6 +1376,7 @@ static void free_function_decl(struct hlsl_ir_function_decl *decl)
|
|||||||
{
|
{
|
||||||
vkd3d_free(decl->parameters);
|
vkd3d_free(decl->parameters);
|
||||||
hlsl_free_instr_list(decl->body);
|
hlsl_free_instr_list(decl->body);
|
||||||
|
vkd3d_free(decl->body);
|
||||||
vkd3d_free(decl);
|
vkd3d_free(decl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -136,6 +136,12 @@ static struct list *make_empty_list(struct hlsl_ctx *ctx)
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void destroy_instr_list(struct list *list)
|
||||||
|
{
|
||||||
|
hlsl_free_instr_list(list);
|
||||||
|
vkd3d_free(list);
|
||||||
|
}
|
||||||
|
|
||||||
static void check_invalid_matrix_modifiers(struct hlsl_ctx *ctx, DWORD modifiers, struct vkd3d_shader_location loc)
|
static void check_invalid_matrix_modifiers(struct hlsl_ctx *ctx, DWORD modifiers, struct vkd3d_shader_location loc)
|
||||||
{
|
{
|
||||||
if (modifiers & HLSL_MODIFIERS_MAJORITY_MASK)
|
if (modifiers & HLSL_MODIFIERS_MAJORITY_MASK)
|
||||||
@@ -385,10 +391,10 @@ oom:
|
|||||||
vkd3d_free(loop);
|
vkd3d_free(loop);
|
||||||
vkd3d_free(cond_jump);
|
vkd3d_free(cond_jump);
|
||||||
vkd3d_free(list);
|
vkd3d_free(list);
|
||||||
hlsl_free_instr_list(init);
|
destroy_instr_list(init);
|
||||||
hlsl_free_instr_list(cond);
|
destroy_instr_list(cond);
|
||||||
hlsl_free_instr_list(iter);
|
destroy_instr_list(iter);
|
||||||
hlsl_free_instr_list(body);
|
destroy_instr_list(body);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,7 +411,7 @@ static unsigned int initializer_size(const struct parse_initializer *initializer
|
|||||||
|
|
||||||
static void free_parse_initializer(struct parse_initializer *initializer)
|
static void free_parse_initializer(struct parse_initializer *initializer)
|
||||||
{
|
{
|
||||||
hlsl_free_instr_list(initializer->instrs);
|
destroy_instr_list(initializer->instrs);
|
||||||
vkd3d_free(initializer->args);
|
vkd3d_free(initializer->args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1789,7 +1795,7 @@ hlsl_prog:
|
|||||||
{
|
{
|
||||||
if (!list_empty($2))
|
if (!list_empty($2))
|
||||||
hlsl_fixme(ctx, @2, "Uniform initializer.");
|
hlsl_fixme(ctx, @2, "Uniform initializer.");
|
||||||
hlsl_free_instr_list($2);
|
destroy_instr_list($2);
|
||||||
}
|
}
|
||||||
| hlsl_prog preproc_directive
|
| hlsl_prog preproc_directive
|
||||||
| hlsl_prog ';'
|
| hlsl_prog ';'
|
||||||
@@ -2364,7 +2370,7 @@ arrays:
|
|||||||
unsigned int size = evaluate_array_dimension(node_from_list($2));
|
unsigned int size = evaluate_array_dimension(node_from_list($2));
|
||||||
uint32_t *new_array;
|
uint32_t *new_array;
|
||||||
|
|
||||||
hlsl_free_instr_list($2);
|
destroy_instr_list($2);
|
||||||
|
|
||||||
$$ = $4;
|
$$ = $4;
|
||||||
|
|
||||||
@@ -2656,7 +2662,7 @@ postfix_expr:
|
|||||||
{
|
{
|
||||||
if (!add_increment(ctx, $1, false, true, @2))
|
if (!add_increment(ctx, $1, false, true, @2))
|
||||||
{
|
{
|
||||||
hlsl_free_instr_list($1);
|
destroy_instr_list($1);
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
@@ -2665,7 +2671,7 @@ postfix_expr:
|
|||||||
{
|
{
|
||||||
if (!add_increment(ctx, $1, true, true, @2))
|
if (!add_increment(ctx, $1, true, true, @2))
|
||||||
{
|
{
|
||||||
hlsl_free_instr_list($1);
|
destroy_instr_list($1);
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
@@ -2717,20 +2723,20 @@ postfix_expr:
|
|||||||
if (index->data_type->type != HLSL_CLASS_SCALAR)
|
if (index->data_type->type != HLSL_CLASS_SCALAR)
|
||||||
{
|
{
|
||||||
hlsl_error(ctx, @3, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE, "Array index is not scalar.");
|
hlsl_error(ctx, @3, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE, "Array index is not scalar.");
|
||||||
hlsl_free_instr_list($1);
|
destroy_instr_list($1);
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(cast = hlsl_new_cast(ctx, index, ctx->builtin_types.scalar[HLSL_TYPE_UINT], &index->loc)))
|
if (!(cast = hlsl_new_cast(ctx, index, ctx->builtin_types.scalar[HLSL_TYPE_UINT], &index->loc)))
|
||||||
{
|
{
|
||||||
hlsl_free_instr_list($1);
|
destroy_instr_list($1);
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
list_add_tail($1, &cast->node.entry);
|
list_add_tail($1, &cast->node.entry);
|
||||||
|
|
||||||
if (!add_array_load(ctx, $1, array, &cast->node, @2))
|
if (!add_array_load(ctx, $1, array, &cast->node, @2))
|
||||||
{
|
{
|
||||||
hlsl_free_instr_list($1);
|
destroy_instr_list($1);
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
@@ -2821,7 +2827,7 @@ unary_expr:
|
|||||||
{
|
{
|
||||||
if (!add_increment(ctx, $2, false, false, @1))
|
if (!add_increment(ctx, $2, false, false, @1))
|
||||||
{
|
{
|
||||||
hlsl_free_instr_list($2);
|
destroy_instr_list($2);
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
@@ -2830,7 +2836,7 @@ unary_expr:
|
|||||||
{
|
{
|
||||||
if (!add_increment(ctx, $2, true, false, @1))
|
if (!add_increment(ctx, $2, true, false, @1))
|
||||||
{
|
{
|
||||||
hlsl_free_instr_list($2);
|
destroy_instr_list($2);
|
||||||
YYABORT;
|
YYABORT;
|
||||||
}
|
}
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
|
Reference in New Issue
Block a user