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
= NULL
;
35 ir_hierarchical_visitor::visit(ir_variable
*ir
)
37 if (this->callback
!= NULL
)
38 this->callback(ir
, this->data
);
40 return visit_continue
;
44 ir_hierarchical_visitor::visit(ir_constant
*ir
)
46 if (this->callback
!= NULL
)
47 this->callback(ir
, this->data
);
49 return visit_continue
;
53 ir_hierarchical_visitor::visit(ir_loop_jump
*ir
)
55 if (this->callback
!= NULL
)
56 this->callback(ir
, this->data
);
58 return visit_continue
;
62 ir_hierarchical_visitor::visit(ir_dereference_variable
*ir
)
64 if (this->callback
!= NULL
)
65 this->callback(ir
, this->data
);
67 return visit_continue
;
71 ir_hierarchical_visitor::visit_enter(ir_loop
*ir
)
73 if (this->callback
!= NULL
)
74 this->callback(ir
, this->data
);
76 return visit_continue
;
80 ir_hierarchical_visitor::visit_leave(ir_loop
*ir
)
83 return visit_continue
;
87 ir_hierarchical_visitor::visit_enter(ir_function_signature
*ir
)
89 if (this->callback
!= NULL
)
90 this->callback(ir
, this->data
);
92 return visit_continue
;
96 ir_hierarchical_visitor::visit_leave(ir_function_signature
*ir
)
99 return visit_continue
;
103 ir_hierarchical_visitor::visit_enter(ir_function
*ir
)
105 if (this->callback
!= NULL
)
106 this->callback(ir
, this->data
);
108 return visit_continue
;
112 ir_hierarchical_visitor::visit_leave(ir_function
*ir
)
115 return visit_continue
;
119 ir_hierarchical_visitor::visit_enter(ir_expression
*ir
)
121 if (this->callback
!= NULL
)
122 this->callback(ir
, this->data
);
124 return visit_continue
;
128 ir_hierarchical_visitor::visit_leave(ir_expression
*ir
)
131 return visit_continue
;
135 ir_hierarchical_visitor::visit_enter(ir_texture
*ir
)
137 if (this->callback
!= NULL
)
138 this->callback(ir
, this->data
);
140 return visit_continue
;
144 ir_hierarchical_visitor::visit_leave(ir_texture
*ir
)
147 return visit_continue
;
151 ir_hierarchical_visitor::visit_enter(ir_swizzle
*ir
)
153 if (this->callback
!= NULL
)
154 this->callback(ir
, this->data
);
156 return visit_continue
;
160 ir_hierarchical_visitor::visit_leave(ir_swizzle
*ir
)
163 return visit_continue
;
167 ir_hierarchical_visitor::visit_enter(ir_dereference_array
*ir
)
169 if (this->callback
!= NULL
)
170 this->callback(ir
, this->data
);
172 return visit_continue
;
176 ir_hierarchical_visitor::visit_leave(ir_dereference_array
*ir
)
179 return visit_continue
;
183 ir_hierarchical_visitor::visit_enter(ir_dereference_record
*ir
)
185 if (this->callback
!= NULL
)
186 this->callback(ir
, this->data
);
188 return visit_continue
;
192 ir_hierarchical_visitor::visit_leave(ir_dereference_record
*ir
)
195 return visit_continue
;
199 ir_hierarchical_visitor::visit_enter(ir_assignment
*ir
)
201 if (this->callback
!= NULL
)
202 this->callback(ir
, this->data
);
204 return visit_continue
;
208 ir_hierarchical_visitor::visit_leave(ir_assignment
*ir
)
211 return visit_continue
;
215 ir_hierarchical_visitor::visit_enter(ir_call
*ir
)
217 if (this->callback
!= NULL
)
218 this->callback(ir
, this->data
);
220 return visit_continue
;
224 ir_hierarchical_visitor::visit_leave(ir_call
*ir
)
227 return visit_continue
;
231 ir_hierarchical_visitor::visit_enter(ir_return
*ir
)
233 if (this->callback
!= NULL
)
234 this->callback(ir
, this->data
);
236 return visit_continue
;
240 ir_hierarchical_visitor::visit_leave(ir_return
*ir
)
243 return visit_continue
;
247 ir_hierarchical_visitor::visit_enter(ir_discard
*ir
)
249 if (this->callback
!= NULL
)
250 this->callback(ir
, this->data
);
252 return visit_continue
;
256 ir_hierarchical_visitor::visit_leave(ir_discard
*ir
)
259 return visit_continue
;
263 ir_hierarchical_visitor::visit_enter(ir_if
*ir
)
265 if (this->callback
!= NULL
)
266 this->callback(ir
, this->data
);
268 return visit_continue
;
272 ir_hierarchical_visitor::visit_leave(ir_if
*ir
)
275 return visit_continue
;
279 ir_hierarchical_visitor::run(exec_list
*instructions
)
281 visit_list_elements(this, instructions
);
286 visit_tree(ir_instruction
*ir
,
287 void (*callback
)(class ir_instruction
*ir
, void *data
),
290 ir_hierarchical_visitor v
;
292 v
.callback
= callback
;