Module: wine Branch: master Commit: a84784e0577c26e0fd7741cde4cdc5809cd927a3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a84784e0577c26e0fd7741cde4...
Author: Matteo Bruni mbruni@codeweavers.com Date: Thu Jul 12 16:01:35 2012 +0200
d3dcompiler: Store (and begin to use) location information for variables.
---
dlls/d3dcompiler_43/d3dcompiler_private.h | 2 ++ dlls/d3dcompiler_43/hlsl.y | 26 +++++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index 5bb74f0..194ed25 100644 --- a/dlls/d3dcompiler_43/d3dcompiler_private.h +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h @@ -820,6 +820,8 @@ struct parse_parameter struct parse_variable_def { struct list entry; + struct source_location loc; + char *name; unsigned int array_size; char *semantic; diff --git a/dlls/d3dcompiler_43/hlsl.y b/dlls/d3dcompiler_43/hlsl.y index f4afd48..cadcfc9 100644 --- a/dlls/d3dcompiler_43/hlsl.y +++ b/dlls/d3dcompiler_43/hlsl.y @@ -32,6 +32,9 @@ int hlsl_lex(void);
struct hlsl_parse_ctx hlsl_ctx;
+struct YYLTYPE; +static void set_location(struct source_location *loc, const struct YYLTYPE *l); + void hlsl_message(const char *fmt, ...) { va_list args; @@ -125,9 +128,8 @@ static BOOL declare_variable(struct hlsl_ir_var *decl, BOOL local) | HLSL_STORAGE_GROUPSHARED | HLSL_STORAGE_UNIFORM); if (invalid) { - hlsl_message("Line %u: modifier '%s' invalid for local variables.\n", - hlsl_ctx.line_no, debug_modifiers(invalid)); - set_parse_status(&hlsl_ctx.status, PARSE_ERR); + hlsl_report_message(decl->node.loc.file, decl->node.loc.line, decl->node.loc.col, HLSL_LEVEL_ERROR, + "modifier '%s' invalid for local variables", debug_modifiers(invalid)); } } ret = add_declaration(hlsl_ctx.cur_scope, decl, local); @@ -135,9 +137,10 @@ static BOOL declare_variable(struct hlsl_ir_var *decl, BOOL local) { struct hlsl_ir_var *old = get_variable(hlsl_ctx.cur_scope, decl->name);
- hlsl_message("Line %u: "%s" already declared.\n", hlsl_ctx.line_no, decl->name); - hlsl_message("Line %u: "%s" was previously declared here.\n", old->node.loc.line, decl->name); - set_parse_status(&hlsl_ctx.status, PARSE_ERR); + hlsl_report_message(decl->node.loc.file, decl->node.loc.line, decl->node.loc.col, HLSL_LEVEL_ERROR, + ""%s" already declared", decl->name); + hlsl_report_message(old->node.loc.file, old->node.loc.line, old->node.loc.col, HLSL_LEVEL_NOTE, + ""%s" was previously declared here", old->name); return FALSE; } return TRUE; @@ -613,10 +616,10 @@ declaration: var_modifiers type variables_def ';' var->node.data_type = new_array_type($2, v->array_size); else var->node.data_type = $2; + var->node.loc = v->loc; var->name = v->name; var->modifiers = $1; var->semantic = v->semantic; - var->node.loc.line = hlsl_ctx.line_no; if (v->initializer) { FIXME("Variable with an initializer.\n"); @@ -655,6 +658,7 @@ variables_def: variable_def variable_def: any_identifier array semantic { $$ = d3dcompiler_alloc(sizeof(*$$)); + set_location(&$$->loc, &@1); $$->name = $1; $$->array_size = $2; $$->semantic = $3; @@ -663,6 +667,7 @@ variable_def: any_identifier array semantic { TRACE("Declaration with initializer.\n"); $$ = d3dcompiler_alloc(sizeof(*$$)); + set_location(&$$->loc, &@1); $$->name = $1; $$->array_size = $2; $$->semantic = $3; @@ -983,6 +988,13 @@ expr: assignment_expr
%%
+static void set_location(struct source_location *loc, const struct YYLTYPE *l) +{ + loc->file = hlsl_ctx.source_file; + loc->line = l->first_line; + loc->col = l->first_column; +} + struct bwriter_shader *parse_hlsl(enum shader_type type, DWORD major, DWORD minor, const char *entrypoint, char **messages) {