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
24#include "ir.h"
25#include "ir_hierarchical_visitor.h"
26
27ir_hierarchical_visitor::ir_hierarchical_visitor()
28{
29   this->base_ir = NULL;
30   this->callback = NULL;
31   this->data = NULL;
32   this->in_assignee = false;
33}
34
35ir_visitor_status
36ir_hierarchical_visitor::visit(ir_variable *ir)
37{
38   if (this->callback != NULL)
39      this->callback(ir, this->data);
40
41   return visit_continue;
42}
43
44ir_visitor_status
45ir_hierarchical_visitor::visit(ir_constant *ir)
46{
47   if (this->callback != NULL)
48      this->callback(ir, this->data);
49
50   return visit_continue;
51}
52
53ir_visitor_status
54ir_hierarchical_visitor::visit(ir_loop_jump *ir)
55{
56   if (this->callback != NULL)
57      this->callback(ir, this->data);
58
59   return visit_continue;
60}
61
62ir_visitor_status
63ir_hierarchical_visitor::visit(ir_dereference_variable *ir)
64{
65   if (this->callback != NULL)
66      this->callback(ir, this->data);
67
68   return visit_continue;
69}
70
71ir_visitor_status
72ir_hierarchical_visitor::visit_enter(ir_loop *ir)
73{
74   if (this->callback != NULL)
75      this->callback(ir, this->data);
76
77   return visit_continue;
78}
79
80ir_visitor_status
81ir_hierarchical_visitor::visit_leave(ir_loop *ir)
82{
83   (void) ir;
84   return visit_continue;
85}
86
87ir_visitor_status
88ir_hierarchical_visitor::visit_enter(ir_function_signature *ir)
89{
90   if (this->callback != NULL)
91      this->callback(ir, this->data);
92
93   return visit_continue;
94}
95
96ir_visitor_status
97ir_hierarchical_visitor::visit_leave(ir_function_signature *ir)
98{
99   (void) ir;
100   return visit_continue;
101}
102
103ir_visitor_status
104ir_hierarchical_visitor::visit_enter(ir_function *ir)
105{
106   if (this->callback != NULL)
107      this->callback(ir, this->data);
108
109   return visit_continue;
110}
111
112ir_visitor_status
113ir_hierarchical_visitor::visit_leave(ir_function *ir)
114{
115   (void) ir;
116   return visit_continue;
117}
118
119ir_visitor_status
120ir_hierarchical_visitor::visit_enter(ir_expression *ir)
121{
122   if (this->callback != NULL)
123      this->callback(ir, this->data);
124
125   return visit_continue;
126}
127
128ir_visitor_status
129ir_hierarchical_visitor::visit_leave(ir_expression *ir)
130{
131   (void) ir;
132   return visit_continue;
133}
134
135ir_visitor_status
136ir_hierarchical_visitor::visit_enter(ir_texture *ir)
137{
138   if (this->callback != NULL)
139      this->callback(ir, this->data);
140
141   return visit_continue;
142}
143
144ir_visitor_status
145ir_hierarchical_visitor::visit_leave(ir_texture *ir)
146{
147   (void) ir;
148   return visit_continue;
149}
150
151ir_visitor_status
152ir_hierarchical_visitor::visit_enter(ir_swizzle *ir)
153{
154   if (this->callback != NULL)
155      this->callback(ir, this->data);
156
157   return visit_continue;
158}
159
160ir_visitor_status
161ir_hierarchical_visitor::visit_leave(ir_swizzle *ir)
162{
163   (void) ir;
164   return visit_continue;
165}
166
167ir_visitor_status
168ir_hierarchical_visitor::visit_enter(ir_dereference_array *ir)
169{
170   if (this->callback != NULL)
171      this->callback(ir, this->data);
172
173   return visit_continue;
174}
175
176ir_visitor_status
177ir_hierarchical_visitor::visit_leave(ir_dereference_array *ir)
178{
179   (void) ir;
180   return visit_continue;
181}
182
183ir_visitor_status
184ir_hierarchical_visitor::visit_enter(ir_dereference_record *ir)
185{
186   if (this->callback != NULL)
187      this->callback(ir, this->data);
188
189   return visit_continue;
190}
191
192ir_visitor_status
193ir_hierarchical_visitor::visit_leave(ir_dereference_record *ir)
194{
195   (void) ir;
196   return visit_continue;
197}
198
199ir_visitor_status
200ir_hierarchical_visitor::visit_enter(ir_assignment *ir)
201{
202   if (this->callback != NULL)
203      this->callback(ir, this->data);
204
205   return visit_continue;
206}
207
208ir_visitor_status
209ir_hierarchical_visitor::visit_leave(ir_assignment *ir)
210{
211   (void) ir;
212   return visit_continue;
213}
214
215ir_visitor_status
216ir_hierarchical_visitor::visit_enter(ir_call *ir)
217{
218   if (this->callback != NULL)
219      this->callback(ir, this->data);
220
221   return visit_continue;
222}
223
224ir_visitor_status
225ir_hierarchical_visitor::visit_leave(ir_call *ir)
226{
227   (void) ir;
228   return visit_continue;
229}
230
231ir_visitor_status
232ir_hierarchical_visitor::visit_enter(ir_return *ir)
233{
234   if (this->callback != NULL)
235      this->callback(ir, this->data);
236
237   return visit_continue;
238}
239
240ir_visitor_status
241ir_hierarchical_visitor::visit_leave(ir_return *ir)
242{
243   (void) ir;
244   return visit_continue;
245}
246
247ir_visitor_status
248ir_hierarchical_visitor::visit_enter(ir_discard *ir)
249{
250   if (this->callback != NULL)
251      this->callback(ir, this->data);
252
253   return visit_continue;
254}
255
256ir_visitor_status
257ir_hierarchical_visitor::visit_leave(ir_discard *ir)
258{
259   (void) ir;
260   return visit_continue;
261}
262
263ir_visitor_status
264ir_hierarchical_visitor::visit_enter(ir_if *ir)
265{
266   if (this->callback != NULL)
267      this->callback(ir, this->data);
268
269   return visit_continue;
270}
271
272ir_visitor_status
273ir_hierarchical_visitor::visit_leave(ir_if *ir)
274{
275   (void) ir;
276   return visit_continue;
277}
278
279void
280ir_hierarchical_visitor::run(exec_list *instructions)
281{
282   visit_list_elements(this, instructions);
283}
284
285
286void
287visit_tree(ir_instruction *ir,
288	   void (*callback)(class ir_instruction *ir, void *data),
289	   void *data)
290{
291   ir_hierarchical_visitor v;
292
293   v.callback = callback;
294   v.data = data;
295
296   ir->accept(&v);
297}
298