1 /* -*- c++ -*- */ 2 /* 3 * Copyright © 2010 Intel Corporation 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 * DEALINGS IN THE SOFTWARE. 23 */ 24 25 #ifndef IR_VISITOR_H 26 #define IR_VISITOR_H 27 28 #ifdef __cplusplus 29 /** 30 * Abstract base class of visitors of IR instruction trees 31 */ 32 class ir_visitor { 33 public: ~ir_visitor()34 virtual ~ir_visitor() 35 { 36 /* empty */ 37 } 38 39 /** 40 * \name Visit methods 41 * 42 * As typical for the visitor pattern, there must be one \c visit method for 43 * each concrete subclass of \c ir_instruction. Virtual base classes within 44 * the hierarchy should not have \c visit methods. 45 */ 46 /*@{*/ visit(class ir_rvalue *)47 virtual void visit(class ir_rvalue *) { assert(!"unhandled error_type"); } 48 virtual void visit(class ir_variable *) = 0; 49 virtual void visit(class ir_function_signature *) = 0; 50 virtual void visit(class ir_function *) = 0; 51 virtual void visit(class ir_expression *) = 0; 52 virtual void visit(class ir_texture *) = 0; 53 virtual void visit(class ir_swizzle *) = 0; 54 virtual void visit(class ir_dereference_variable *) = 0; 55 virtual void visit(class ir_dereference_array *) = 0; 56 virtual void visit(class ir_dereference_record *) = 0; 57 virtual void visit(class ir_assignment *) = 0; 58 virtual void visit(class ir_constant *) = 0; 59 virtual void visit(class ir_call *) = 0; 60 virtual void visit(class ir_return *) = 0; 61 virtual void visit(class ir_discard *) = 0; 62 virtual void visit(class ir_demote *) = 0; 63 virtual void visit(class ir_if *) = 0; 64 virtual void visit(class ir_loop *) = 0; 65 virtual void visit(class ir_loop_jump *) = 0; 66 virtual void visit(class ir_emit_vertex *) = 0; 67 virtual void visit(class ir_end_primitive *) = 0; 68 virtual void visit(class ir_barrier *) = 0; 69 /*@}*/ 70 }; 71 72 /* NOTE: function calls may never return due to discards inside them 73 * This is usually not an issue, but if it is, keep it in mind 74 */ 75 class ir_control_flow_visitor : public ir_visitor { 76 public: visit(class ir_variable *)77 virtual void visit(class ir_variable *) {} visit(class ir_expression *)78 virtual void visit(class ir_expression *) {} visit(class ir_texture *)79 virtual void visit(class ir_texture *) {} visit(class ir_swizzle *)80 virtual void visit(class ir_swizzle *) {} visit(class ir_dereference_variable *)81 virtual void visit(class ir_dereference_variable *) {} visit(class ir_dereference_array *)82 virtual void visit(class ir_dereference_array *) {} visit(class ir_dereference_record *)83 virtual void visit(class ir_dereference_record *) {} visit(class ir_assignment *)84 virtual void visit(class ir_assignment *) {} visit(class ir_constant *)85 virtual void visit(class ir_constant *) {} visit(class ir_call *)86 virtual void visit(class ir_call *) {} visit(class ir_demote *)87 virtual void visit(class ir_demote *) {} visit(class ir_emit_vertex *)88 virtual void visit(class ir_emit_vertex *) {} visit(class ir_end_primitive *)89 virtual void visit(class ir_end_primitive *) {} visit(class ir_barrier *)90 virtual void visit(class ir_barrier *) {} 91 }; 92 #endif /* __cplusplus */ 93 94 #endif /* IR_VISITOR_H */ 95