1b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt/* 2b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * Copyright © 2010 Intel Corporation 3b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * 4b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a 5b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * copy of this software and associated documentation files (the "Software"), 6b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * to deal in the Software without restriction, including without limitation 7b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * and/or sell copies of the Software, and to permit persons to whom the 9b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * Software is furnished to do so, subject to the following conditions: 10b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * 11b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * The above copyright notice and this permission notice (including the next 12b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * paragraph) shall be included in all copies or substantial portions of the 13b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * Software. 14b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * 15b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * DEALINGS IN THE SOFTWARE. 22b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt */ 23b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 24b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt/** 25b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * \file ir_rvalue_visitor.h 26b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * 27b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * Generic class to implement the common pattern we have of wanting to 28b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * visit each ir_rvalue * and possibly change that node to a different 29b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * class. Just implement handle_rvalue() and you will be called with 30b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt * a pointer to each rvalue in the tree. 31b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt */ 32b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 338c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholtclass ir_rvalue_base_visitor : public ir_hierarchical_visitor { 348c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholtpublic: 358c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt ir_visitor_status rvalue_visit(ir_assignment *); 368c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt ir_visitor_status rvalue_visit(ir_call *); 378c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt ir_visitor_status rvalue_visit(ir_dereference_array *); 388c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt ir_visitor_status rvalue_visit(ir_dereference_record *); 398c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt ir_visitor_status rvalue_visit(ir_expression *); 408c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt ir_visitor_status rvalue_visit(ir_if *); 418c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt ir_visitor_status rvalue_visit(ir_return *); 428c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt ir_visitor_status rvalue_visit(ir_swizzle *); 438c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt ir_visitor_status rvalue_visit(ir_texture *); 448c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt 458c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt virtual void handle_rvalue(ir_rvalue **rvalue) = 0; 468c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt}; 478c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt 488c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholtclass ir_rvalue_visitor : public ir_rvalue_base_visitor { 49b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholtpublic: 50b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 51b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt virtual ir_visitor_status visit_leave(ir_assignment *); 52b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt virtual ir_visitor_status visit_leave(ir_call *); 53b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt virtual ir_visitor_status visit_leave(ir_dereference_array *); 54b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt virtual ir_visitor_status visit_leave(ir_dereference_record *); 55b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt virtual ir_visitor_status visit_leave(ir_expression *); 56b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt virtual ir_visitor_status visit_leave(ir_if *); 57b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt virtual ir_visitor_status visit_leave(ir_return *); 58b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt virtual ir_visitor_status visit_leave(ir_swizzle *); 59b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt virtual ir_visitor_status visit_leave(ir_texture *); 608c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt}; 61b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt 628c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholtclass ir_rvalue_enter_visitor : public ir_rvalue_base_visitor { 638c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholtpublic: 648c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt 658c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt virtual ir_visitor_status visit_enter(ir_assignment *); 668c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt virtual ir_visitor_status visit_enter(ir_call *); 678c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt virtual ir_visitor_status visit_enter(ir_dereference_array *); 688c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt virtual ir_visitor_status visit_enter(ir_dereference_record *); 698c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt virtual ir_visitor_status visit_enter(ir_expression *); 708c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt virtual ir_visitor_status visit_enter(ir_if *); 718c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt virtual ir_visitor_status visit_enter(ir_return *); 728c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt virtual ir_visitor_status visit_enter(ir_swizzle *); 738c2a9838355cfd02356bf7b22eead408d909fe25Eric Anholt virtual ir_visitor_status visit_enter(ir_texture *); 74b3b0cf6a4c6b23e0ebe7e5f5ab1b7cacf27268b1Eric Anholt}; 75