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