ir_print_visitor.cpp revision affc1413ac9f1f077a4ba1a1b7135f73d7a71167
178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick/*
278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Copyright © 2010 Intel Corporation
378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick *
478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Permission is hereby granted, free of charge, to any person obtaining a
578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * copy of this software and associated documentation files (the "Software"),
678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * to deal in the Software without restriction, including without limitation
778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * and/or sell copies of the Software, and to permit persons to whom the
978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Software is furnished to do so, subject to the following conditions:
1078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick *
1178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * The above copyright notice and this permission notice (including the next
1278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * paragraph) shall be included in all copies or substantial portions of the
1378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * Software.
1478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick *
1578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick * DEALINGS IN THE SOFTWARE.
2278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick */
2378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include <cstdio>
2478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick#include "ir_print_visitor.h"
25fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick#include "glsl_types.h"
26fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick
27fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanickstatic void
28fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanickprint_type(const glsl_type *t)
29fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick{
30fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick   if (t->base_type == GLSL_TYPE_ARRAY) {
31d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf("array (");
32fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick      print_type(t->fields.array);
33d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf(") (%u))", t->length);
34fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick   } else if (t->base_type == GLSL_TYPE_STRUCT) {
35d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf("struct (%s %u ", t->name ? t->name : "@", t->length);
36d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf("(FINISHME: structure fields go here) ");
37fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick      printf(")");
38fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick   } else {
39fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick      printf("%s", t->name);
40fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick   }
41fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick}
42fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick
4378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
4478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_variable *ir)
4578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
468c70a621939e55a81a363f04dee3333772339cbeIan Romanick   if (deref_depth) {
478c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(%s)", ir->name);
488c70a621939e55a81a363f04dee3333772339cbeIan Romanick   } else {
498c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(declare ");
5078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
518c70a621939e55a81a363f04dee3333772339cbeIan Romanick      const char *const cent = (ir->centroid) ? "centroid " : "";
528c70a621939e55a81a363f04dee3333772339cbeIan Romanick      const char *const inv = (ir->invariant) ? "invariant " : "";
538c70a621939e55a81a363f04dee3333772339cbeIan Romanick      const char *const mode[] = { "", "uniform ", "in ", "out ", "inout " };
548c70a621939e55a81a363f04dee3333772339cbeIan Romanick      const char *const interp[] = { "", "flat", "noperspective" };
5578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
568c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(%s%s%s%s) ",
578c70a621939e55a81a363f04dee3333772339cbeIan Romanick	     cent, inv, mode[ir->mode], interp[ir->interpolation]);
58fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick
598c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(");
608c70a621939e55a81a363f04dee3333772339cbeIan Romanick      print_type(ir->type);
618c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf(") ");
62d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf("(%s)) ", ir->name);
638c70a621939e55a81a363f04dee3333772339cbeIan Romanick   }
6478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
6578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
6678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
6778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_label *ir)
6878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
69d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf("\n(label %s)", ir->label);
7078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
7178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
7278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
7378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_function_signature *ir)
7478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
7578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   printf("%s:%d:\n", __func__, __LINE__);
7678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   (void) ir;
7778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
7878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
7978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
8078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_function *ir)
8178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
8278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   printf("(function %s\n", ir->name);
8378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick   printf(")\n");
8478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
8578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
8678b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
8778b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_expression *ir)
8878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
89d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   printf("(expression ");
90d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick
91d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   printf("(FINISHME: operator) ");
92d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick
93d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   printf("(");
94d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   if (ir->operands[0])
95d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick      ir->operands[0]->accept(this);
96d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   printf(") ");
97d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick
98d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   printf("(");
99d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   if (ir->operands[1])
100d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick      ir->operands[1]->accept(this);
101d7388f389dfd17e3842e5dfda1b5782c00f454e5Ian Romanick   printf(")) ");
10278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
10378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
10478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
105affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunkevoid ir_print_visitor::visit(ir_swizzle *ir)
106affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke{
107affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   const unsigned swiz[4] = {
108affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      ir->mask.x,
109affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      ir->mask.y,
110affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      ir->mask.z,
111affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      ir->mask.w,
112affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   };
113affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
114affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   printf("(swiz ");
115affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   for (unsigned i = 0; i < ir->mask.num_components; i++) {
116affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      printf("%c", "xyzw"[swiz[i]]);
117affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   }
118affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   printf(" ");
119affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   ir->val->accept(this);
120affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke   printf(")");
121affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke}
122affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
123affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke
12478b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_dereference *ir)
12578b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
1268c70a621939e55a81a363f04dee3333772339cbeIan Romanick   deref_depth++;
1278c70a621939e55a81a363f04dee3333772339cbeIan Romanick
1288c70a621939e55a81a363f04dee3333772339cbeIan Romanick   switch (ir->mode) {
1298c70a621939e55a81a363f04dee3333772339cbeIan Romanick   case ir_dereference::ir_reference_variable: {
1308c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(var_ref ");
1318c70a621939e55a81a363f04dee3333772339cbeIan Romanick      ir->var->accept(this);
132affc1413ac9f1f077a4ba1a1b7135f73d7a71167Kenneth Graunke      printf(") ");
1338c70a621939e55a81a363f04dee3333772339cbeIan Romanick      break;
1348c70a621939e55a81a363f04dee3333772339cbeIan Romanick   }
1358c70a621939e55a81a363f04dee3333772339cbeIan Romanick   case ir_dereference::ir_reference_array:
1368c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(array_ref ");
1378c70a621939e55a81a363f04dee3333772339cbeIan Romanick      ir->var->accept(this);
1388c70a621939e55a81a363f04dee3333772339cbeIan Romanick      ir->selector.array_index->accept(this);
139d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf(") ");
1408c70a621939e55a81a363f04dee3333772339cbeIan Romanick      break;
1418c70a621939e55a81a363f04dee3333772339cbeIan Romanick   case ir_dereference::ir_reference_record:
1428c70a621939e55a81a363f04dee3333772339cbeIan Romanick      printf("(record_ref ");
1438c70a621939e55a81a363f04dee3333772339cbeIan Romanick      ir->var->accept(this);
144d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick      printf("(%s)) ", ir->selector.field);
1458c70a621939e55a81a363f04dee3333772339cbeIan Romanick      break;
1468c70a621939e55a81a363f04dee3333772339cbeIan Romanick   }
1478c70a621939e55a81a363f04dee3333772339cbeIan Romanick
1488c70a621939e55a81a363f04dee3333772339cbeIan Romanick   deref_depth--;
14978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
15078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
15178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
15278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_assignment *ir)
15378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
154d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf("(assign (");
1556044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick
1566044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick   if (ir->condition)
1576044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick      ir->condition->accept(this);
1586044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick   else
1596044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick      printf("true");
1606044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick
161d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf(") (");
162d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick
1636044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick   ir->lhs->accept(this);
1646044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick
165d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf(") (");
166d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick
1676044ae79a013ba6067ffd968cee97c0d29b728c2Ian Romanick   ir->rhs->accept(this);
168d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf(") ");
16978b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
17078b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
17178b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick
17278b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanickvoid ir_print_visitor::visit(ir_constant *ir)
17378b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick{
174795492247369199d5e79f2503c40920ff8a9b686Ian Romanick   const glsl_type *const base_type = ir->type->get_base_type();
175fe10250355682bcfb87d1688151b93b08d0a4e3cIan Romanick
176d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf("(constant (");
177795492247369199d5e79f2503c40920ff8a9b686Ian Romanick   print_type(base_type);
178d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf(") ");
179795492247369199d5e79f2503c40920ff8a9b686Ian Romanick
180795492247369199d5e79f2503c40920ff8a9b686Ian Romanick   const unsigned num_values = 1
181795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      * ((ir->type->vector_elements > 0) ? ir->type->vector_elements : 1)
182795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      * ((ir->type->matrix_columns > 0) ? ir->type->matrix_columns : 1);
183795492247369199d5e79f2503c40920ff8a9b686Ian Romanick
184795492247369199d5e79f2503c40920ff8a9b686Ian Romanick   printf("(%d) (", num_values);
185795492247369199d5e79f2503c40920ff8a9b686Ian Romanick   for (unsigned i = 0; i < num_values; i++) {
186795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      if (i != 0)
187795492247369199d5e79f2503c40920ff8a9b686Ian Romanick	 printf(", ");
188795492247369199d5e79f2503c40920ff8a9b686Ian Romanick
189795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      switch (base_type->base_type) {
190795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      case GLSL_TYPE_UINT:  printf("%u", ir->value.u[i]); break;
191795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      case GLSL_TYPE_INT:   printf("%d", ir->value.i[i]); break;
192795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      case GLSL_TYPE_FLOAT: printf("%f", ir->value.f[i]); break;
193795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      case GLSL_TYPE_BOOL:  printf("%d", ir->value.b[i]); break;
194795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      default: assert(0);
195795492247369199d5e79f2503c40920ff8a9b686Ian Romanick      }
196795492247369199d5e79f2503c40920ff8a9b686Ian Romanick   }
197795492247369199d5e79f2503c40920ff8a9b686Ian Romanick   printf(")) ");
19878b51b0fdd61b58940f9043ef9046217552f2c70Ian Romanick}
199ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
200ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
201ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickvoid
202ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanickir_print_visitor::visit(ir_call *ir)
203ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick{
204ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   (void) ir;
205ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick
206ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   printf("(call FINISHME: function name here\n");
207ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick   printf("    (FINISHME: function paramaters here))\n");
208ed45ec6a515f3529f12fc23d51621e435d3b6cdfIan Romanick}
2099578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
2109578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
2119578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickvoid
2129578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanickir_print_visitor::visit(ir_return *ir)
2139578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick{
2149578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   printf("(return");
2159578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
216fb9fb5f51deca28ed1ec7b71759fb71fc26a0ab6Kenneth Graunke   ir_rvalue *const value = ir->get_value();
2179578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   if (value) {
2189578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      printf(" ");
2199578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick      value->accept(this);
2209578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick   }
2219578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick
222d14642739e488c8cb15726de5a63cb01c6ce835cIan Romanick   printf(")");
2239578c87ce23a98472d52f15b0a7063f4df036c4dIan Romanick}
224