1986b8f798272d3ae2898617c8fb089156a5941c0Ian Romanick/* -*- c++ -*- */
278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick/*
378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Copyright © 2010 Intel Corporation
478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick *
578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Permission is hereby granted, free of charge, to any person obtaining a
678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * copy of this software and associated documentation files (the "Software"),
778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * to deal in the Software without restriction, including without limitation
878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * and/or sell copies of the Software, and to permit persons to whom the
1078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Software is furnished to do so, subject to the following conditions:
1178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick *
1278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * The above copyright notice and this permission notice (including the next
1378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * paragraph) shall be included in all copies or substantial portions of the
1478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Software.
1578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick *
1678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * DEALINGS IN THE SOFTWARE.
2378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick */
2478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#pragma once
2678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#ifndef IR_VISITOR_H
2778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#define IR_VISITOR_H
2878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick/**
3078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Abstract base class of visitors of IR instruction trees
3178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick */
3278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickclass ir_visitor {
3378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickpublic:
3478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual ~ir_visitor()
3578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   {
3678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick      /* empty */
3778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   }
3878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
3978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   /**
4078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    * \name Visit methods
4178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    *
4278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    * As typical for the visitor pattern, there must be one \c visit method for
4378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    * each concrete subclass of \c ir_instruction.  Virtual base classes within
4478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    * the hierarchy should not have \c visit methods.
4578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    */
4678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   /*@{*/
47807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke   virtual void visit(class ir_rvalue *) { assert(!"unhandled error_type"); }
4878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(class ir_variable *) = 0;
4978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(class ir_function_signature *) = 0;
5078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(class ir_function *) = 0;
5178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(class ir_expression *) = 0;
5226d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke   virtual void visit(class ir_texture *) = 0;
53affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void visit(class ir_swizzle *) = 0;
54c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void visit(class ir_dereference_variable *) = 0;
55c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void visit(class ir_dereference_array *) = 0;
56c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void visit(class ir_dereference_record *) = 0;
5778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(class ir_assignment *) = 0;
5878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(class ir_constant *) = 0;
59ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void visit(class ir_call *) = 0;
609578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void visit(class ir_return *) = 0;
6116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual void visit(class ir_discard *) = 0;
623c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void visit(class ir_if *) = 0;
63fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   virtual void visit(class ir_loop *) = 0;
64f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   virtual void visit(class ir_loop_jump *) = 0;
6578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   /*@}*/
6678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick};
6778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
6855adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri/* NOTE: function calls may never return due to discards inside them
6955adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri * This is usually not an issue, but if it is, keep it in mind
7055adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri */
7155adbebc62a6a819a005adf48f367e7f378c7349Luca Barbiericlass ir_control_flow_visitor : public ir_visitor {
7255adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieripublic:
7355adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri   virtual void visit(class ir_variable *) {}
7455adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri   virtual void visit(class ir_expression *) {}
7555adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri   virtual void visit(class ir_texture *) {}
7655adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri   virtual void visit(class ir_swizzle *) {}
7755adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri   virtual void visit(class ir_dereference_variable *) {}
7855adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri   virtual void visit(class ir_dereference_array *) {}
7955adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri   virtual void visit(class ir_dereference_record *) {}
8055adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri   virtual void visit(class ir_assignment *) {}
8155adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri   virtual void visit(class ir_constant *) {}
8255adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri   virtual void visit(class ir_call *) {}
8355adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri};
8455adbebc62a6a819a005adf48f367e7f378c7349Luca Barbieri
8578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#endif /* IR_VISITOR_H */
86