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_PRINT_VISITOR_H
2778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#define IR_PRINT_VISITOR_H
2878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
2978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir.h"
3078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_visitor.h"
3178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
3256ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunkeextern "C" {
3356ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke#include "program/symbol_table.h"
3456ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke}
3556ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke
3636d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanickextern void _mesa_print_ir(exec_list *instructions,
3736d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick			   struct _mesa_glsl_parse_state *state);
3836d8a64a95354d09685e65c5e721038ff81b6d1fIan Romanick
3978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick/**
4078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Abstract base class of visitors of IR instruction trees
4178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick */
4278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickclass ir_print_visitor : public ir_visitor {
4378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickpublic:
4456ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke   ir_print_visitor();
4556ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke   virtual ~ir_print_visitor();
4678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
47bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt   void indent(void);
48bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt
4978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   /**
5078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    * \name Visit methods
5178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    *
5278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    * As typical for the visitor pattern, there must be one \c visit method for
5378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    * each concrete subclass of \c ir_instruction.  Virtual base classes within
5478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    * the hierarchy should not have \c visit methods.
5578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick    */
5678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   /*@{*/
57807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke   virtual void visit(ir_rvalue *);
5878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(ir_variable *);
5978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(ir_function_signature *);
6078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(ir_function *);
6178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(ir_expression *);
62be298063b501a3e0bd769209f531fd23e4e4646eKenneth Graunke   virtual void visit(ir_texture *);
63affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   virtual void visit(ir_swizzle *);
64c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void visit(ir_dereference_variable *);
65c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void visit(ir_dereference_array *);
66c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick   virtual void visit(ir_dereference_record *);
6778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(ir_assignment *);
6878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   virtual void visit(ir_constant *);
69ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   virtual void visit(ir_call *);
709578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   virtual void visit(ir_return *);
7116efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke   virtual void visit(ir_discard *);
723c6fea3048a0d9add2fec621d30c32f3519d8868Ian Romanick   virtual void visit(ir_if *);
73fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick   virtual void visit(ir_loop *);
74f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick   virtual void visit(ir_loop_jump *);
7578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   /*@}*/
768c70a621939e55a81a363f04dee3333772339cbeIan Romanick
778c70a621939e55a81a363f04dee3333772339cbeIan Romanickprivate:
7856ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke   /**
7956ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke    * Fetch/generate a unique name for ir_variable.
8056ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke    *
8156ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke    * GLSL IR permits multiple ir_variables to share the same name.  This works
8256ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke    * fine until we try to print it, when we really need a unique one.
8356ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke    */
8456ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke   const char *unique_name(ir_variable *var);
8556ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke
8656ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke   /** A mapping from ir_variable * -> unique printable names. */
8756ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke   hash_table *printable_names;
8856ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke   _mesa_symbol_table *symbols;
8956ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke
9056ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke   void *mem_ctx;
9156ef62d9885f805bbfb2243dc860ff425d5b4d3bKenneth Graunke
92bf496862be1ba863285aa2c1a2262b2d764c3e53Eric Anholt   int indentation;
9378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick};
9478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
9578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#endif /* IR_PRINT_VISITOR_H */
96