From ed45ec6a515f3529f12fc23d51621e435d3b6cdf Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Thu, 11 Mar 2010 14:34:27 -0800 Subject: [PATCH] Add ir_call call to represent function calls. --- ast_to_hir.cpp | 2 +- ir.cpp | 10 ++++++++++ ir.h | 30 +++++++++++++++++++++++++++++- ir_print_visitor.cpp | 10 ++++++++++ ir_print_visitor.h | 1 + ir_visitor.h | 1 + 6 files changed, 52 insertions(+), 2 deletions(-) diff --git a/ast_to_hir.cpp b/ast_to_hir.cpp index 3c4b69f..1fea729 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 3166cdc..5aec70b 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 7de7c38..136b45b 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 c09de83..b1c718d 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 778d4ee..b76de50 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 43246d1..a2b2dd6 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; /*@}*/ }; -- 2.7.4