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