From: Ian Romanick Date: Thu, 11 Mar 2010 22:34:27 +0000 (-0800) Subject: Add ir_call call to represent function calls. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ed45ec6a515f3529f12fc23d51621e435d3b6cdf;p=mesa.git Add ir_call call to represent function calls. --- diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp index 3c4b69fdc24..1fea7299dbd 100644 --- a/ast_to_hir.cpp +++ b/ast_to_hir.cpp @@ -725,7 +725,7 @@ ast_function_expression::hir(exec_list *instructions, */ (void) instructions; (void) state; - return NULL; + return ir_call::get_error_instruction(); } ir_instruction * diff --git a/ir.cpp b/ir.cpp index 3166cdc9eff..5aec70bfce8 100644 --- a/ir.cpp +++ b/ir.cpp @@ -108,3 +108,13 @@ ir_function::ir_function(void) { /* empty */ } + + +ir_call * +ir_call::get_error_instruction() +{ + ir_call *call = new ir_call; + + call->type = glsl_error_type; + return call; +} diff --git a/ir.h b/ir.h index 7de7c385323..136b45b72be 100644 --- a/ir.h +++ b/ir.h @@ -39,7 +39,8 @@ enum ir_opcodes { ir_op_label, ir_op_constant, ir_op_func_sig, - ir_op_func + ir_op_func, + ir_op_call, }; /** @@ -277,6 +278,33 @@ public: }; +/** + * IR instruction representing a function call + */ +class ir_call : public ir_instruction { +public: + ir_call() + : ir_instruction(ir_op_call), callee(NULL) + { + /* empty */ + } + + virtual void accept(ir_visitor *v) + { + v->visit(this); + } + + /** + * Get a generic ir_call object when an error occurs + */ + static ir_call *get_error_instruction(); + +private: + ir_function_signature *callee; + exec_list actual_parameters; +}; + + struct ir_swizzle_mask { unsigned x:2; unsigned y:2; diff --git a/ir_print_visitor.cpp b/ir_print_visitor.cpp index c09de83ffd6..b1c718d99ea 100644 --- a/ir_print_visitor.cpp +++ b/ir_print_visitor.cpp @@ -132,3 +132,13 @@ void ir_print_visitor::visit(ir_constant *ir) printf(" (FINISHME: value goes here)\n"); printf(")\n"); } + + +void +ir_print_visitor::visit(ir_call *ir) +{ + (void) ir; + + printf("(call FINISHME: function name here\n"); + printf(" (FINISHME: function paramaters here))\n"); +} diff --git a/ir_print_visitor.h b/ir_print_visitor.h index 778d4ee00df..b76de504617 100644 --- a/ir_print_visitor.h +++ b/ir_print_visitor.h @@ -60,6 +60,7 @@ public: virtual void visit(ir_dereference *); virtual void visit(ir_assignment *); virtual void visit(ir_constant *); + virtual void visit(ir_call *); /*@}*/ }; diff --git a/ir_visitor.h b/ir_visitor.h index 43246d1058d..a2b2dd678b4 100644 --- a/ir_visitor.h +++ b/ir_visitor.h @@ -52,6 +52,7 @@ public: virtual void visit(class ir_dereference *) = 0; virtual void visit(class ir_assignment *) = 0; virtual void visit(class ir_constant *) = 0; + virtual void visit(class ir_call *) = 0; /*@}*/ };