Add missing parenthesis in foreach_iter
[mesa.git] / ir_print_visitor.cpp
1 /*
2 * Copyright © 2010 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 */
23 #include <cstdio>
24 #include "ir_print_visitor.h"
25 #include "glsl_types.h"
26
27 static void
28 print_type(const glsl_type *t)
29 {
30 if (t->base_type == GLSL_TYPE_ARRAY) {
31 printf("array (");
32 print_type(t->fields.array);
33 printf(") (%u))", t->length);
34 } else if (t->base_type == GLSL_TYPE_STRUCT) {
35 printf("struct (%s %u ", t->name ? t->name : "@", t->length);
36 printf("(FINISHME: structure fields go here) ");
37 printf(")");
38 } else {
39 printf("%s", t->name);
40 }
41 }
42
43
44 void ir_print_visitor::visit(ir_variable *ir)
45 {
46 if (deref_depth) {
47 printf("(%s)", ir->name);
48 } else {
49 printf("(declare ");
50
51 const char *const cent = (ir->centroid) ? "centroid " : "";
52 const char *const inv = (ir->invariant) ? "invariant " : "";
53 const char *const mode[] = { "", "uniform ", "in ", "out ", "inout " };
54 const char *const interp[] = { "", "flat", "noperspective" };
55
56 printf("(%s%s%s%s) ",
57 cent, inv, mode[ir->mode], interp[ir->interpolation]);
58
59 printf("(");
60 print_type(ir->type);
61 printf(") ");
62 printf("(%s)) ", ir->name);
63 }
64 }
65
66
67 void ir_print_visitor::visit(ir_label *ir)
68 {
69 printf("\n(label %s)", ir->label);
70 }
71
72
73 void ir_print_visitor::visit(ir_function_signature *ir)
74 {
75 printf("%s:%d:\n", __func__, __LINE__);
76 (void) ir;
77 }
78
79
80 void ir_print_visitor::visit(ir_function *ir)
81 {
82 printf("(function %s\n", ir->name);
83 printf(")\n");
84 }
85
86
87 void ir_print_visitor::visit(ir_expression *ir)
88 {
89 printf("(expression ");
90
91 printf("(FINISHME: operator) ");
92
93 printf("(");
94 if (ir->operands[0])
95 ir->operands[0]->accept(this);
96 printf(") ");
97
98 printf("(");
99 if (ir->operands[1])
100 ir->operands[1]->accept(this);
101 printf(")) ");
102 }
103
104
105 void ir_print_visitor::visit(ir_swizzle *ir)
106 {
107 const unsigned swiz[4] = {
108 ir->mask.x,
109 ir->mask.y,
110 ir->mask.z,
111 ir->mask.w,
112 };
113
114 printf("(swiz ");
115 for (unsigned i = 0; i < ir->mask.num_components; i++) {
116 printf("%c", "xyzw"[swiz[i]]);
117 }
118 printf(" ");
119 ir->val->accept(this);
120 printf(")");
121 }
122
123
124 void ir_print_visitor::visit(ir_dereference *ir)
125 {
126 deref_depth++;
127
128 switch (ir->mode) {
129 case ir_dereference::ir_reference_variable: {
130 printf("(var_ref ");
131 ir->var->accept(this);
132 printf(") ");
133 break;
134 }
135 case ir_dereference::ir_reference_array:
136 printf("(array_ref ");
137 ir->var->accept(this);
138 ir->selector.array_index->accept(this);
139 printf(") ");
140 break;
141 case ir_dereference::ir_reference_record:
142 printf("(record_ref ");
143 ir->var->accept(this);
144 printf("(%s)) ", ir->selector.field);
145 break;
146 }
147
148 deref_depth--;
149 }
150
151
152 void ir_print_visitor::visit(ir_assignment *ir)
153 {
154 printf("(assign (");
155
156 if (ir->condition)
157 ir->condition->accept(this);
158 else
159 printf("true");
160
161 printf(") (");
162
163 ir->lhs->accept(this);
164
165 printf(") (");
166
167 ir->rhs->accept(this);
168 printf(") ");
169 }
170
171
172 void ir_print_visitor::visit(ir_constant *ir)
173 {
174 const glsl_type *const base_type = ir->type->get_base_type();
175
176 printf("(constant (");
177 print_type(base_type);
178 printf(") ");
179
180 printf("(%d) (", ir->type->components());
181 for (unsigned i = 0; i < ir->type->components(); i++) {
182 if (i != 0)
183 printf(", ");
184
185 switch (base_type->base_type) {
186 case GLSL_TYPE_UINT: printf("%u", ir->value.u[i]); break;
187 case GLSL_TYPE_INT: printf("%d", ir->value.i[i]); break;
188 case GLSL_TYPE_FLOAT: printf("%f", ir->value.f[i]); break;
189 case GLSL_TYPE_BOOL: printf("%d", ir->value.b[i]); break;
190 default: assert(0);
191 }
192 }
193 printf(")) ");
194 }
195
196
197 void
198 ir_print_visitor::visit(ir_call *ir)
199 {
200 (void) ir;
201
202 printf("(call FINISHME: function name here\n");
203 printf(" (FINISHME: function paramaters here))\n");
204 }
205
206
207 void
208 ir_print_visitor::visit(ir_return *ir)
209 {
210 printf("(return");
211
212 ir_rvalue *const value = ir->get_value();
213 if (value) {
214 printf(" ");
215 value->accept(this);
216 }
217
218 printf(")");
219 }