Initial bits for converting AST return nodes to IR return instructions
This commit is contained in:
3
ast.h
3
ast.h
@@ -531,6 +531,9 @@ public:
|
|||||||
ast_jump_statement(int mode, ast_expression *return_value);
|
ast_jump_statement(int mode, ast_expression *return_value);
|
||||||
virtual void print(void) const;
|
virtual void print(void) const;
|
||||||
|
|
||||||
|
virtual ir_instruction *hir(exec_list *instructions,
|
||||||
|
struct _mesa_glsl_parse_state *state);
|
||||||
|
|
||||||
enum ast_jump_modes {
|
enum ast_jump_modes {
|
||||||
ast_continue,
|
ast_continue,
|
||||||
ast_break,
|
ast_break,
|
||||||
|
@@ -1120,3 +1120,40 @@ ast_function_definition::hir(exec_list *instructions,
|
|||||||
*/
|
*/
|
||||||
return NULL;
|
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;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user