summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-03-19 17:08:05 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-03-19 17:08:05 -0700
commit41ec6a47ab81620bab9182f987e4bc4780e3a6ab (patch)
treecfff670b50211e1bf9f5fa4a8d273c63d553934f
parent16a246c049fa3c8d7841f87c8defdd0f26f302ee (diff)
Track the function that is currently being defined
Later this will allow type checking for return statements.
-rw-r--r--ast_to_hir.cpp7
-rw-r--r--glsl_parser_extras.h8
2 files changed, 15 insertions, 0 deletions
diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp
index 79d32165a1..be1a8deb93 100644
--- a/ast_to_hir.cpp
+++ b/ast_to_hir.cpp
@@ -63,6 +63,8 @@ _mesa_ast_to_hir(exec_list *instructions, struct _mesa_glsl_parse_state *state)
_mesa_glsl_initialize_variables(instructions, state);
+ state->current_function = NULL;
+
foreach (ptr, & state->translation_unit) {
((ast_node *)ptr)->hir(instructions, state);
}
@@ -1070,6 +1072,9 @@ ast_function_definition::hir(exec_list *instructions,
}
+ assert(state->current_function == NULL);
+ state->current_function = signature;
+
ast_function_parameters_to_hir(& this->prototype->parameters,
& signature->parameters,
state);
@@ -1115,6 +1120,8 @@ ast_function_definition::hir(exec_list *instructions,
state->symbols->pop_scope();
+ assert(state->current_function == signature);
+ state->current_function = NULL;
/* Function definitions do not have r-values.
*/
diff --git a/glsl_parser_extras.h b/glsl_parser_extras.h
index b3b3f868b1..dbe7c17302 100644
--- a/glsl_parser_extras.h
+++ b/glsl_parser_extras.h
@@ -43,6 +43,14 @@ struct _mesa_glsl_parse_state {
unsigned language_version;
enum _mesa_glsl_parser_targets target;
+ /**
+ * During AST to IR conversion, pointer to current IR function
+ *
+ * Will be \c NULL whenever the AST to IR conversion is not inside a
+ * function definition.
+ */
+ class ir_function_signature *current_function;
+
/** Was there an error during compilation? */
bool error;
};