2 * Copyright © 2010 Intel Corporation
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:
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
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.
25 #include "ir_hierarchical_visitor.h"
27 ir_hierarchical_visitor::ir_hierarchical_visitor()
30 this->callback_enter
= NULL
;
31 this->callback_leave
= NULL
;
32 this->data_enter
= NULL
;
33 this->data_leave
= NULL
;
34 this->in_assignee
= false;
38 ir_hierarchical_visitor::visit(ir_rvalue
*ir
)
40 call_enter_leave_callbacks(ir
);
42 return visit_continue
;
46 ir_hierarchical_visitor::visit(ir_variable
*ir
)
48 call_enter_leave_callbacks(ir
);
50 return visit_continue
;
54 ir_hierarchical_visitor::visit(ir_constant
*ir
)
56 call_enter_leave_callbacks(ir
);
58 return visit_continue
;
62 ir_hierarchical_visitor::visit(ir_loop_jump
*ir
)
64 call_enter_leave_callbacks(ir
);
66 return visit_continue
;
70 ir_hierarchical_visitor::visit(ir_dereference_variable
*ir
)
72 call_enter_leave_callbacks(ir
);
74 return visit_continue
;
78 ir_hierarchical_visitor::visit(ir_barrier
*ir
)
80 call_enter_leave_callbacks(ir
);
82 return visit_continue
;
86 ir_hierarchical_visitor::visit_enter(ir_loop
*ir
)
88 if (this->callback_enter
!= NULL
)
89 this->callback_enter(ir
, this->data_enter
);
91 return visit_continue
;
95 ir_hierarchical_visitor::visit_leave(ir_loop
*ir
)
97 if (this->callback_leave
!= NULL
)
98 this->callback_leave(ir
, this->data_leave
);
100 return visit_continue
;
104 ir_hierarchical_visitor::visit_enter(ir_function_signature
*ir
)
106 if (this->callback_enter
!= NULL
)
107 this->callback_enter(ir
, this->data_enter
);
109 return visit_continue
;
113 ir_hierarchical_visitor::visit_leave(ir_function_signature
*ir
)
115 if (this->callback_leave
!= NULL
)
116 this->callback_leave(ir
, this->data_leave
);
118 return visit_continue
;
122 ir_hierarchical_visitor::visit_enter(ir_function
*ir
)
124 if (this->callback_enter
!= NULL
)
125 this->callback_enter(ir
, this->data_enter
);
127 return visit_continue
;
131 ir_hierarchical_visitor::visit_leave(ir_function
*ir
)
133 if (this->callback_leave
!= NULL
)
134 this->callback_leave(ir
, this->data_leave
);
136 return visit_continue
;
140 ir_hierarchical_visitor::visit_enter(ir_expression
*ir
)
142 if (this->callback_enter
!= NULL
)
143 this->callback_enter(ir
, this->data_enter
);
145 return visit_continue
;
149 ir_hierarchical_visitor::visit_leave(ir_expression
*ir
)
151 if (this->callback_leave
!= NULL
)
152 this->callback_leave(ir
, this->data_leave
);
154 return visit_continue
;
158 ir_hierarchical_visitor::visit_enter(ir_texture
*ir
)
160 if (this->callback_enter
!= NULL
)
161 this->callback_enter(ir
, this->data_enter
);
163 return visit_continue
;
167 ir_hierarchical_visitor::visit_leave(ir_texture
*ir
)
169 if (this->callback_leave
!= NULL
)
170 this->callback_leave(ir
, this->data_leave
);
172 return visit_continue
;
176 ir_hierarchical_visitor::visit_enter(ir_swizzle
*ir
)
178 if (this->callback_enter
!= NULL
)
179 this->callback_enter(ir
, this->data_enter
);
181 return visit_continue
;
185 ir_hierarchical_visitor::visit_leave(ir_swizzle
*ir
)
187 if (this->callback_leave
!= NULL
)
188 this->callback_leave(ir
, this->data_leave
);
190 return visit_continue
;
194 ir_hierarchical_visitor::visit_enter(ir_dereference_array
*ir
)
196 if (this->callback_enter
!= NULL
)
197 this->callback_enter(ir
, this->data_enter
);
199 return visit_continue
;
203 ir_hierarchical_visitor::visit_leave(ir_dereference_array
*ir
)
205 if (this->callback_leave
!= NULL
)
206 this->callback_leave(ir
, this->data_leave
);
208 return visit_continue
;
212 ir_hierarchical_visitor::visit_enter(ir_dereference_record
*ir
)
214 if (this->callback_enter
!= NULL
)
215 this->callback_enter(ir
, this->data_enter
);
217 return visit_continue
;
221 ir_hierarchical_visitor::visit_leave(ir_dereference_record
*ir
)
223 if (this->callback_leave
!= NULL
)
224 this->callback_leave(ir
, this->data_leave
);
226 return visit_continue
;
230 ir_hierarchical_visitor::visit_enter(ir_assignment
*ir
)
232 if (this->callback_enter
!= NULL
)
233 this->callback_enter(ir
, this->data_enter
);
235 return visit_continue
;
239 ir_hierarchical_visitor::visit_leave(ir_assignment
*ir
)
241 if (this->callback_leave
!= NULL
)
242 this->callback_leave(ir
, this->data_leave
);
244 return visit_continue
;
248 ir_hierarchical_visitor::visit_enter(ir_call
*ir
)
250 if (this->callback_enter
!= NULL
)
251 this->callback_enter(ir
, this->data_enter
);
253 return visit_continue
;
257 ir_hierarchical_visitor::visit_leave(ir_call
*ir
)
259 if (this->callback_leave
!= NULL
)
260 this->callback_leave(ir
, this->data_leave
);
262 return visit_continue
;
266 ir_hierarchical_visitor::visit_enter(ir_return
*ir
)
268 if (this->callback_enter
!= NULL
)
269 this->callback_enter(ir
, this->data_enter
);
271 return visit_continue
;
275 ir_hierarchical_visitor::visit_leave(ir_return
*ir
)
277 if (this->callback_leave
!= NULL
)
278 this->callback_leave(ir
, this->data_leave
);
280 return visit_continue
;
284 ir_hierarchical_visitor::visit_enter(ir_discard
*ir
)
286 if (this->callback_enter
!= NULL
)
287 this->callback_enter(ir
, this->data_enter
);
289 return visit_continue
;
293 ir_hierarchical_visitor::visit_leave(ir_discard
*ir
)
295 if (this->callback_leave
!= NULL
)
296 this->callback_leave(ir
, this->data_leave
);
298 return visit_continue
;
302 ir_hierarchical_visitor::visit_enter(ir_demote
*ir
)
304 if (this->callback_enter
!= NULL
)
305 this->callback_enter(ir
, this->data_enter
);
307 return visit_continue
;
311 ir_hierarchical_visitor::visit_leave(ir_demote
*ir
)
313 if (this->callback_leave
!= NULL
)
314 this->callback_leave(ir
, this->data_leave
);
316 return visit_continue
;
320 ir_hierarchical_visitor::visit_enter(ir_if
*ir
)
322 if (this->callback_enter
!= NULL
)
323 this->callback_enter(ir
, this->data_enter
);
325 return visit_continue
;
329 ir_hierarchical_visitor::visit_leave(ir_if
*ir
)
331 if (this->callback_leave
!= NULL
)
332 this->callback_leave(ir
, this->data_leave
);
334 return visit_continue
;
338 ir_hierarchical_visitor::visit_enter(ir_emit_vertex
*ir
)
340 if (this->callback_enter
!= NULL
)
341 this->callback_enter(ir
, this->data_enter
);
343 return visit_continue
;
347 ir_hierarchical_visitor::visit_leave(ir_emit_vertex
*ir
)
349 if (this->callback_leave
!= NULL
)
350 this->callback_leave(ir
, this->data_leave
);
352 return visit_continue
;
356 ir_hierarchical_visitor::visit_enter(ir_end_primitive
*ir
)
358 if (this->callback_enter
!= NULL
)
359 this->callback_enter(ir
, this->data_enter
);
361 return visit_continue
;
365 ir_hierarchical_visitor::visit_leave(ir_end_primitive
*ir
)
367 if (this->callback_leave
!= NULL
)
368 this->callback_leave(ir
, this->data_leave
);
370 return visit_continue
;
374 ir_hierarchical_visitor::run(exec_list
*instructions
)
376 visit_list_elements(this, instructions
);
380 ir_hierarchical_visitor::call_enter_leave_callbacks(class ir_instruction
*ir
)
382 if (this->callback_enter
!= NULL
)
383 this->callback_enter(ir
, this->data_enter
);
384 if (this->callback_leave
!= NULL
)
385 this->callback_leave(ir
, this->data_leave
);
389 visit_tree(ir_instruction
*ir
,
390 void (*callback_enter
)(class ir_instruction
*ir
, void *data
),
392 void (*callback_leave
)(class ir_instruction
*ir
, void *data
),
395 ir_hierarchical_visitor v
;
397 v
.callback_enter
= callback_enter
;
398 v
.callback_leave
= callback_leave
;
399 v
.data_enter
= data_enter
;
400 v
.data_leave
= data_leave
;