From: Zebediah Figura zfigura@codeweavers.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/d3dcompiler_43/d3dcompiler_private.h | 10 +- dlls/d3dcompiler_43/hlsl.y | 110 +++++++++++++--------- dlls/d3dcompiler_43/utils.c | 57 ++--------- 3 files changed, 80 insertions(+), 97 deletions(-)
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index 8f81271383b..1aa232791ba 100644 --- a/dlls/d3dcompiler_43/d3dcompiler_private.h +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h @@ -1096,6 +1096,14 @@ static inline struct hlsl_ir_node *node_from_list(struct list *list) return LIST_ENTRY(list_tail(list), struct hlsl_ir_node, entry); }
+static inline void init_node(struct hlsl_ir_node *node, enum hlsl_ir_node_type type, + struct hlsl_type *data_type, struct source_location loc) +{ + node->type = type; + node->data_type = data_type; + node->loc = loc; +} + BOOL add_declaration(struct hlsl_scope *scope, struct hlsl_ir_var *decl, BOOL local_var) DECLSPEC_HIDDEN; struct hlsl_ir_var *get_variable(struct hlsl_scope *scope, const char *name) DECLSPEC_HIDDEN; void free_declaration(struct hlsl_ir_var *decl) DECLSPEC_HIDDEN; @@ -1115,8 +1123,6 @@ struct hlsl_ir_expr *new_cast(struct hlsl_ir_node *node, struct hlsl_type *type, struct source_location *loc) DECLSPEC_HIDDEN; struct hlsl_ir_node *implicit_conversion(struct hlsl_ir_node *node, struct hlsl_type *type, struct source_location *loc) DECLSPEC_HIDDEN; -struct hlsl_ir_deref *new_var_deref(struct hlsl_ir_var *var) DECLSPEC_HIDDEN; -struct hlsl_ir_deref *new_record_deref(struct hlsl_ir_node *record, struct hlsl_struct_field *field) DECLSPEC_HIDDEN; struct hlsl_ir_node *make_assignment(struct hlsl_ir_node *left, enum parse_assign_op assign_op, struct hlsl_ir_node *right) DECLSPEC_HIDDEN; void push_scope(struct hlsl_parse_ctx *ctx) DECLSPEC_HIDDEN; diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y index 2d6ed925640..c0ad6cda9e0 100644 --- a/dlls/d3dcompiler_43/hlsl.y +++ b/dlls/d3dcompiler_43/hlsl.y @@ -277,7 +277,7 @@ static BOOL append_conditional_break(struct list *cond_list) ERR("Out of memory.\n"); return FALSE; } - iff->node.type = HLSL_IR_IF; + init_node(&iff->node, HLSL_IR_IF, NULL, condition->loc); iff->condition = not; list_add_tail(cond_list, &iff->node.entry);
@@ -293,7 +293,7 @@ static BOOL append_conditional_break(struct list *cond_list) ERR("Out of memory.\n"); return FALSE; } - jump->node.type = HLSL_IR_JUMP; + init_node(&jump->node, HLSL_IR_JUMP, NULL, condition->loc); jump->type = HLSL_IR_JUMP_BREAK; list_add_head(iff->then_instrs, &jump->node.entry); return TRUE; @@ -324,8 +324,7 @@ static struct list *create_loop(enum loop_type type, struct list *init, struct l loop = d3dcompiler_alloc(sizeof(*loop)); if (!loop) goto oom; - loop->node.type = HLSL_IR_LOOP; - loop->node.loc = loc; + init_node(&loop->node, HLSL_IR_LOOP, NULL, loc); list_add_tail(list, &loop->node.entry); loop->body = d3dcompiler_alloc(sizeof(*loop->body)); if (!loop->body) @@ -390,9 +389,8 @@ static struct hlsl_ir_swizzle *new_swizzle(DWORD s, unsigned int components,
if (!swizzle) return NULL; - swizzle->node.type = HLSL_IR_SWIZZLE; - swizzle->node.loc = *loc; - swizzle->node.data_type = new_hlsl_type(NULL, HLSL_CLASS_VECTOR, val->data_type->base_type, components, 1); + init_node(&swizzle->node, HLSL_IR_SWIZZLE, + new_hlsl_type(NULL, HLSL_CLASS_VECTOR, val->data_type->base_type, components, 1), *loc); swizzle->val = val; swizzle->swizzle = s; return swizzle; @@ -489,8 +487,7 @@ static struct hlsl_ir_jump *new_return(struct hlsl_ir_node *value, struct source ERR("Out of memory\n"); return NULL; } - jump->node.type = HLSL_IR_JUMP; - jump->node.loc = loc; + init_node(&jump->node, HLSL_IR_JUMP, NULL, loc); jump->type = HLSL_IR_JUMP_RETURN; if (value) { @@ -510,6 +507,38 @@ static struct hlsl_ir_jump *new_return(struct hlsl_ir_node *value, struct source return jump; }
+static struct hlsl_ir_deref *new_var_deref(struct hlsl_ir_var *var, const struct source_location loc) +{ + struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref)); + + if (!deref) + { + ERR("Out of memory.\n"); + return NULL; + } + init_node(&deref->node, HLSL_IR_DEREF, var->data_type, loc); + deref->src.type = HLSL_IR_DEREF_VAR; + deref->src.v.var = var; + return deref; +} + +static struct hlsl_ir_deref *new_record_deref(struct hlsl_ir_node *record, + struct hlsl_struct_field *field, const struct source_location loc) +{ + struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref)); + + if (!deref) + { + ERR("Out of memory.\n"); + return NULL; + } + init_node(&deref->node, HLSL_IR_DEREF, field->type, loc); + deref->src.type = HLSL_IR_DEREF_RECORD; + deref->src.v.record.record = record; + deref->src.v.record.field = field; + return deref; +} + static void struct_var_initializer(struct list *list, struct hlsl_ir_var *var, struct parse_initializer *initializer) { @@ -540,13 +569,12 @@ static void struct_var_initializer(struct list *list, struct hlsl_ir_var *var, } if (components_count_type(field->type) == components_count_type(node->data_type)) { - deref = new_record_deref(&new_var_deref(var)->node, field); + deref = new_record_deref(&new_var_deref(var, var->loc)->node, field, node->loc); if (!deref) { ERR("Out of memory.\n"); break; } - deref->node.loc = node->loc; list_add_tail(list, &deref->node.entry); assignment = make_assignment(&deref->node, ASSIGN_OP_ASSIGN, node); list_add_tail(list, &assignment->entry); @@ -695,7 +723,7 @@ static struct list *declare_vars(struct hlsl_type *basic_type, DWORD modifiers, list_move_tail(statements_list, v->initializer.instrs); d3dcompiler_free(v->initializer.instrs);
- deref = new_var_deref(var); + deref = new_var_deref(var, var->loc); list_add_tail(statements_list, &deref->node.entry); assignment = make_assignment(&deref->node, ASSIGN_OP_ASSIGN, v->initializer.args[0]); d3dcompiler_free(v->initializer.args); @@ -1969,8 +1997,7 @@ selection_statement: KW_IF '(' expr ')' if_body ERR("Out of memory\n"); YYABORT; } - instr->node.type = HLSL_IR_IF; - instr->node.loc = get_location(&@1); + init_node(&instr->node, HLSL_IR_IF, NULL, get_location(&@1)); instr->condition = node_from_list($3); instr->then_instrs = $5.then_instrs; instr->else_instrs = $5.else_instrs; @@ -2034,9 +2061,8 @@ primary_expr: C_FLOAT ERR("Out of memory.\n"); YYABORT; } - c->node.type = HLSL_IR_CONSTANT; - c->node.loc = get_location(&@1); - c->node.data_type = new_hlsl_type(d3dcompiler_strdup("float"), HLSL_CLASS_SCALAR, HLSL_TYPE_FLOAT, 1, 1); + init_node(&c->node, HLSL_IR_CONSTANT, new_hlsl_type(d3dcompiler_strdup("float"), + HLSL_CLASS_SCALAR, HLSL_TYPE_FLOAT, 1, 1), get_location(&@1)); c->v.value.f[0] = $1; if (!($$ = make_list(&c->node))) YYABORT; @@ -2049,9 +2075,8 @@ primary_expr: C_FLOAT ERR("Out of memory.\n"); YYABORT; } - c->node.type = HLSL_IR_CONSTANT; - c->node.loc = get_location(&@1); - c->node.data_type = new_hlsl_type(d3dcompiler_strdup("int"), HLSL_CLASS_SCALAR, HLSL_TYPE_INT, 1, 1); + init_node(&c->node, HLSL_IR_CONSTANT, new_hlsl_type(d3dcompiler_strdup("int"), + HLSL_CLASS_SCALAR, HLSL_TYPE_INT, 1, 1), get_location(&@1)); c->v.value.i[0] = $1; if (!($$ = make_list(&c->node))) YYABORT; @@ -2064,9 +2089,8 @@ primary_expr: C_FLOAT ERR("Out of memory.\n"); YYABORT; } - c->node.type = HLSL_IR_CONSTANT; - c->node.loc = get_location(&@1); - c->node.data_type = new_hlsl_type(d3dcompiler_strdup("bool"), HLSL_CLASS_SCALAR, HLSL_TYPE_BOOL, 1, 1); + init_node(&c->node, HLSL_IR_CONSTANT, new_hlsl_type(d3dcompiler_strdup("bool"), + HLSL_CLASS_SCALAR, HLSL_TYPE_BOOL, 1, 1), get_location(&@1)); c->v.value.b[0] = $1; if (!($$ = make_list(&c->node))) YYABORT; @@ -2083,9 +2107,8 @@ primary_expr: C_FLOAT set_parse_status(&hlsl_ctx.status, PARSE_ERR); YYABORT; } - if ((deref = new_var_deref(var))) + if ((deref = new_var_deref(var, get_location(&@1)))) { - deref->node.loc = get_location(&@1); if (!($$ = make_list(&deref->node))) YYABORT; } @@ -2151,14 +2174,13 @@ postfix_expr: primary_expr { if (!strcmp($3, field->name)) { - struct hlsl_ir_deref *deref = new_record_deref(node, field); + struct hlsl_ir_deref *deref = new_record_deref(node, field, loc);
if (!deref) { ERR("Out of memory\n"); YYABORT; } - deref->node.loc = loc; $$ = append_unop($1, &deref->node); break; } @@ -2195,28 +2217,23 @@ postfix_expr: primary_expr /* This may be an array dereference or a vector/matrix * subcomponent access. * We store it as an array dereference in any case. */ - struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref)); - struct hlsl_type *expr_type = node_from_list($1)->data_type; + const struct hlsl_type *expr_type = node_from_list($1)->data_type; + struct hlsl_ir_deref *deref; + struct hlsl_type *data_type;
TRACE("Array dereference from type %s\n", debug_hlsl_type(expr_type)); - if (!deref) - { - ERR("Out of memory\n"); - YYABORT; - } - deref->node.type = HLSL_IR_DEREF; - deref->node.loc = get_location(&@2); + if (expr_type->type == HLSL_CLASS_ARRAY) { - deref->node.data_type = expr_type->e.array.type; + data_type = expr_type->e.array.type; } else if (expr_type->type == HLSL_CLASS_MATRIX) { - deref->node.data_type = new_hlsl_type(NULL, HLSL_CLASS_VECTOR, expr_type->base_type, expr_type->dimx, 1); + data_type = new_hlsl_type(NULL, HLSL_CLASS_VECTOR, expr_type->base_type, expr_type->dimx, 1); } else if (expr_type->type == HLSL_CLASS_VECTOR) { - deref->node.data_type = new_hlsl_type(NULL, HLSL_CLASS_SCALAR, expr_type->base_type, 1, 1); + data_type = new_hlsl_type(NULL, HLSL_CLASS_SCALAR, expr_type->base_type, 1, 1); } else { @@ -2224,19 +2241,26 @@ postfix_expr: primary_expr hlsl_report_message(get_location(&@2), HLSL_LEVEL_ERROR, "array-indexed expression is scalar"); else hlsl_report_message(get_location(&@2), HLSL_LEVEL_ERROR, "expression is not array-indexable"); - d3dcompiler_free(deref); free_instr_list($1); free_instr_list($3); YYABORT; } + if (node_from_list($3)->data_type->type != HLSL_CLASS_SCALAR) { hlsl_report_message(get_location(&@3), HLSL_LEVEL_ERROR, "array index is not scalar"); - d3dcompiler_free(deref); free_instr_list($1); free_instr_list($3); YYABORT; } + + if (!(deref = d3dcompiler_alloc(sizeof(*deref)))) + { + free_instr_list($1); + free_instr_list($3); + YYABORT; + } + init_node(&deref->node, HLSL_IR_DEREF, data_type, get_location(&@2)); deref->src.type = HLSL_IR_DEREF_ARRAY; deref->src.v.array.array = node_from_list($1); deref->src.v.array.index = node_from_list($3); @@ -2274,9 +2298,7 @@ postfix_expr: primary_expr assert($4.args_count <= ARRAY_SIZE(constructor->args));
constructor = d3dcompiler_alloc(sizeof(*constructor)); - constructor->node.type = HLSL_IR_CONSTRUCTOR; - constructor->node.loc = get_location(&@3); - constructor->node.data_type = $2; + init_node(&constructor->node, HLSL_IR_CONSTRUCTOR, $2, get_location(&@3)); constructor->args_count = $4.args_count; memcpy(constructor->args, $4.args, $4.args_count * sizeof(*$4.args)); d3dcompiler_free($4.args); diff --git a/dlls/d3dcompiler_43/utils.c b/dlls/d3dcompiler_43/utils.c index 519f50612e8..991306d5947 100644 --- a/dlls/d3dcompiler_43/utils.c +++ b/dlls/d3dcompiler_43/utils.c @@ -1325,17 +1325,10 @@ struct hlsl_ir_node *implicit_conversion(struct hlsl_ir_node *node, struct hlsl_ struct hlsl_ir_expr *new_expr(enum hlsl_ir_expr_op op, struct hlsl_ir_node **operands, struct source_location *loc) { - struct hlsl_ir_expr *expr = d3dcompiler_alloc(sizeof(*expr)); + struct hlsl_ir_expr *expr; struct hlsl_type *type; unsigned int i;
- if (!expr) - { - ERR("Out of memory\n"); - return NULL; - } - expr->node.type = HLSL_IR_EXPR; - expr->node.loc = *loc; type = operands[0]->data_type; for (i = 1; i <= 2; ++i) { @@ -1343,10 +1336,7 @@ struct hlsl_ir_expr *new_expr(enum hlsl_ir_expr_op op, struct hlsl_ir_node **ope break; type = expr_common_type(type, operands[i]->data_type, loc); if (!type) - { - d3dcompiler_free(expr); return NULL; - } } for (i = 0; i <= 2; ++i) { @@ -1364,14 +1354,14 @@ struct hlsl_ir_expr *new_expr(enum hlsl_ir_expr_op op, struct hlsl_ir_node **ope }
if (!(cast = new_cast(operands[i], type, &operands[i]->loc))) - { - d3dcompiler_free(expr); return NULL; - } list_add_after(&operands[i]->entry, &cast->node.entry); operands[i] = &cast->node; } - expr->node.data_type = type; + + if (!(expr = d3dcompiler_alloc(sizeof(*expr)))) + return NULL; + init_node(&expr->node, HLSL_IR_EXPR, type, *loc); expr->op = op; expr->operands[0] = operands[0]; expr->operands[1] = operands[1]; @@ -1391,39 +1381,6 @@ struct hlsl_ir_expr *new_cast(struct hlsl_ir_node *node, struct hlsl_type *type, return expr_from_node(cast); }
-struct hlsl_ir_deref *new_var_deref(struct hlsl_ir_var *var) -{ - struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref)); - - if (!deref) - { - ERR("Out of memory.\n"); - return NULL; - } - deref->node.type = HLSL_IR_DEREF; - deref->node.data_type = var->data_type; - deref->src.type = HLSL_IR_DEREF_VAR; - deref->src.v.var = var; - return deref; -} - -struct hlsl_ir_deref *new_record_deref(struct hlsl_ir_node *record, struct hlsl_struct_field *field) -{ - struct hlsl_ir_deref *deref = d3dcompiler_alloc(sizeof(*deref)); - - if (!deref) - { - ERR("Out of memory.\n"); - return NULL; - } - deref->node.type = HLSL_IR_DEREF; - deref->node.data_type = field->type; - deref->src.type = HLSL_IR_DEREF_RECORD; - deref->src.v.record.record = record; - deref->src.v.record.field = field; - return deref; -} - static enum hlsl_ir_expr_op op_from_assignment(enum parse_assign_op op) { static const enum hlsl_ir_expr_op ops[] = @@ -1605,9 +1562,7 @@ struct hlsl_ir_node *make_assignment(struct hlsl_ir_node *lhs, enum parse_assign return NULL; }
- assign->node.type = HLSL_IR_ASSIGNMENT; - assign->node.loc = lhs->loc; - assign->node.data_type = type; + init_node(&assign->node, HLSL_IR_ASSIGNMENT, type, lhs->loc); assign->writemask = writemask; rhs = implicit_conversion(rhs, type, &rhs->loc);