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