From 16a246c049fa3c8d7841f87c8defdd0f26f302ee Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Fri, 19 Mar 2010 16:45:19 -0700 Subject: [PATCH] Initial bits for converting AST return nodes to IR return instructions --- ast.h | 3 +++ ast_to_hir.cpp | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/ast.h b/ast.h index 1bc38d355cb..5fd69695c1a 100644 --- a/ast.h +++ b/ast.h @@ -531,6 +531,9 @@ public: ast_jump_statement(int mode, ast_expression *return_value); virtual void print(void) const; + virtual ir_instruction *hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state); + enum ast_jump_modes { ast_continue, ast_break, diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp index 63f0c82d3d6..79d32165a19 100644 --- a/ast_to_hir.cpp +++ b/ast_to_hir.cpp @@ -1120,3 +1120,40 @@ ast_function_definition::hir(exec_list *instructions, */ return NULL; } + + +ir_instruction * +ast_jump_statement::hir(exec_list *instructions, + struct _mesa_glsl_parse_state *state) +{ + + if (mode == ast_return) { + ir_return *inst; + + if (opt_return_value) { + /* FINISHME: Make sure the enclosing function has a non-void return + * FINISHME: type. + */ + + ir_expression *const ret = (ir_expression *) + opt_return_value->hir(instructions, state); + assert(ret != NULL); + + /* FINISHME: Make sure the type of the return value matches the return + * FINISHME: type of the enclosing function. + */ + + inst = new ir_return(ret); + } else { + /* FINISHME: Make sure the enclosing function has a void return type. + */ + inst = new ir_return; + } + + instructions->push_tail(inst); + } + + /* Jump instructions do not have r-values. + */ + return NULL; +} -- 2.30.2