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 27 ir_hierarchical_visitor::ir_hierarchical_visitor() 28 { 29 this->base_ir = NULL; 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; 35 } 36 37 ir_visitor_status 38 ir_hierarchical_visitor::visit(ir_rvalue *ir) 39 { 40 if (this->callback_enter != NULL) 41 this->callback_enter(ir, this->data_enter); 42 43 return visit_continue; 44 } 45 46 ir_visitor_status 47 ir_hierarchical_visitor::visit(ir_variable *ir) 48 { 49 if (this->callback_enter != NULL) 50 this->callback_enter(ir, this->data_enter); 51 52 return visit_continue; 53 } 54 55 ir_visitor_status 56 ir_hierarchical_visitor::visit(ir_constant *ir) 57 { 58 if (this->callback_enter != NULL) 59 this->callback_enter(ir, this->data_enter); 60 61 return visit_continue; 62 } 63 64 ir_visitor_status 65 ir_hierarchical_visitor::visit(ir_loop_jump *ir) 66 { 67 if (this->callback_enter != NULL) 68 this->callback_enter(ir, this->data_enter); 69 70 return visit_continue; 71 } 72 73 ir_visitor_status 74 ir_hierarchical_visitor::visit(ir_dereference_variable *ir) 75 { 76 if (this->callback_enter != NULL) 77 this->callback_enter(ir, this->data_enter); 78 79 return visit_continue; 80 } 81 82 ir_visitor_status 83 ir_hierarchical_visitor::visit(ir_barrier *ir) 84 { 85 if (this->callback_enter != NULL) 86 this->callback_enter(ir, this->data_enter); 87 88 return visit_continue; 89 } 90 91 ir_visitor_status 92 ir_hierarchical_visitor::visit_enter(ir_loop *ir) 93 { 94 if (this->callback_enter != NULL) 95 this->callback_enter(ir, this->data_enter); 96 97 return visit_continue; 98 } 99 100 ir_visitor_status 101 ir_hierarchical_visitor::visit_leave(ir_loop *ir) 102 { 103 if (this->callback_leave != NULL) 104 this->callback_leave(ir, this->data_leave); 105 106 return visit_continue; 107 } 108 109 ir_visitor_status 110 ir_hierarchical_visitor::visit_enter(ir_function_signature *ir) 111 { 112 if (this->callback_enter != NULL) 113 this->callback_enter(ir, this->data_enter); 114 115 return visit_continue; 116 } 117 118 ir_visitor_status 119 ir_hierarchical_visitor::visit_leave(ir_function_signature *ir) 120 { 121 if (this->callback_leave != NULL) 122 this->callback_leave(ir, this->data_leave); 123 124 return visit_continue; 125 } 126 127 ir_visitor_status 128 ir_hierarchical_visitor::visit_enter(ir_function *ir) 129 { 130 if (this->callback_enter != NULL) 131 this->callback_enter(ir, this->data_enter); 132 133 return visit_continue; 134 } 135 136 ir_visitor_status 137 ir_hierarchical_visitor::visit_leave(ir_function *ir) 138 { 139 if (this->callback_leave != NULL) 140 this->callback_leave(ir, this->data_leave); 141 142 return visit_continue; 143 } 144 145 ir_visitor_status 146 ir_hierarchical_visitor::visit_enter(ir_expression *ir) 147 { 148 if (this->callback_enter != NULL) 149 this->callback_enter(ir, this->data_enter); 150 151 return visit_continue; 152 } 153 154 ir_visitor_status 155 ir_hierarchical_visitor::visit_leave(ir_expression *ir) 156 { 157 if (this->callback_leave != NULL) 158 this->callback_leave(ir, this->data_leave); 159 160 return visit_continue; 161 } 162 163 ir_visitor_status 164 ir_hierarchical_visitor::visit_enter(ir_texture *ir) 165 { 166 if (this->callback_enter != NULL) 167 this->callback_enter(ir, this->data_enter); 168 169 return visit_continue; 170 } 171 172 ir_visitor_status 173 ir_hierarchical_visitor::visit_leave(ir_texture *ir) 174 { 175 if (this->callback_leave != NULL) 176 this->callback_leave(ir, this->data_leave); 177 178 return visit_continue; 179 } 180 181 ir_visitor_status 182 ir_hierarchical_visitor::visit_enter(ir_swizzle *ir) 183 { 184 if (this->callback_enter != NULL) 185 this->callback_enter(ir, this->data_enter); 186 187 return visit_continue; 188 } 189 190 ir_visitor_status 191 ir_hierarchical_visitor::visit_leave(ir_swizzle *ir) 192 { 193 if (this->callback_leave != NULL) 194 this->callback_leave(ir, this->data_leave); 195 196 return visit_continue; 197 } 198 199 ir_visitor_status 200 ir_hierarchical_visitor::visit_enter(ir_dereference_array *ir) 201 { 202 if (this->callback_enter != NULL) 203 this->callback_enter(ir, this->data_enter); 204 205 return visit_continue; 206 } 207 208 ir_visitor_status 209 ir_hierarchical_visitor::visit_leave(ir_dereference_array *ir) 210 { 211 if (this->callback_leave != NULL) 212 this->callback_leave(ir, this->data_leave); 213 214 return visit_continue; 215 } 216 217 ir_visitor_status 218 ir_hierarchical_visitor::visit_enter(ir_dereference_record *ir) 219 { 220 if (this->callback_enter != NULL) 221 this->callback_enter(ir, this->data_enter); 222 223 return visit_continue; 224 } 225 226 ir_visitor_status 227 ir_hierarchical_visitor::visit_leave(ir_dereference_record *ir) 228 { 229 if (this->callback_leave != NULL) 230 this->callback_leave(ir, this->data_leave); 231 232 return visit_continue; 233 } 234 235 ir_visitor_status 236 ir_hierarchical_visitor::visit_enter(ir_assignment *ir) 237 { 238 if (this->callback_enter != NULL) 239 this->callback_enter(ir, this->data_enter); 240 241 return visit_continue; 242 } 243 244 ir_visitor_status 245 ir_hierarchical_visitor::visit_leave(ir_assignment *ir) 246 { 247 if (this->callback_leave != NULL) 248 this->callback_leave(ir, this->data_leave); 249 250 return visit_continue; 251 } 252 253 ir_visitor_status 254 ir_hierarchical_visitor::visit_enter(ir_call *ir) 255 { 256 if (this->callback_enter != NULL) 257 this->callback_enter(ir, this->data_enter); 258 259 return visit_continue; 260 } 261 262 ir_visitor_status 263 ir_hierarchical_visitor::visit_leave(ir_call *ir) 264 { 265 if (this->callback_leave != NULL) 266 this->callback_leave(ir, this->data_leave); 267 268 return visit_continue; 269 } 270 271 ir_visitor_status 272 ir_hierarchical_visitor::visit_enter(ir_return *ir) 273 { 274 if (this->callback_enter != NULL) 275 this->callback_enter(ir, this->data_enter); 276 277 return visit_continue; 278 } 279 280 ir_visitor_status 281 ir_hierarchical_visitor::visit_leave(ir_return *ir) 282 { 283 if (this->callback_leave != NULL) 284 this->callback_leave(ir, this->data_leave); 285 286 return visit_continue; 287 } 288 289 ir_visitor_status 290 ir_hierarchical_visitor::visit_enter(ir_discard *ir) 291 { 292 if (this->callback_enter != NULL) 293 this->callback_enter(ir, this->data_enter); 294 295 return visit_continue; 296 } 297 298 ir_visitor_status 299 ir_hierarchical_visitor::visit_leave(ir_discard *ir) 300 { 301 if (this->callback_leave != NULL) 302 this->callback_leave(ir, this->data_leave); 303 304 return visit_continue; 305 } 306 307 ir_visitor_status 308 ir_hierarchical_visitor::visit_enter(ir_if *ir) 309 { 310 if (this->callback_enter != NULL) 311 this->callback_enter(ir, this->data_enter); 312 313 return visit_continue; 314 } 315 316 ir_visitor_status 317 ir_hierarchical_visitor::visit_leave(ir_if *ir) 318 { 319 if (this->callback_leave != NULL) 320 this->callback_leave(ir, this->data_leave); 321 322 return visit_continue; 323 } 324 325 ir_visitor_status 326 ir_hierarchical_visitor::visit_enter(ir_emit_vertex *ir) 327 { 328 if (this->callback_enter != NULL) 329 this->callback_enter(ir, this->data_enter); 330 331 return visit_continue; 332 } 333 334 ir_visitor_status 335 ir_hierarchical_visitor::visit_leave(ir_emit_vertex *ir) 336 { 337 if (this->callback_leave != NULL) 338 this->callback_leave(ir, this->data_leave); 339 340 return visit_continue; 341 } 342 343 ir_visitor_status 344 ir_hierarchical_visitor::visit_enter(ir_end_primitive *ir) 345 { 346 if (this->callback_enter != NULL) 347 this->callback_enter(ir, this->data_enter); 348 349 return visit_continue; 350 } 351 352 ir_visitor_status 353 ir_hierarchical_visitor::visit_leave(ir_end_primitive *ir) 354 { 355 if (this->callback_leave != NULL) 356 this->callback_leave(ir, this->data_leave); 357 358 return visit_continue; 359 } 360 361 void 362 ir_hierarchical_visitor::run(exec_list *instructions) 363 { 364 visit_list_elements(this, instructions); 365 } 366 367 368 void 369 visit_tree(ir_instruction *ir, 370 void (*callback_enter)(class ir_instruction *ir, void *data), 371 void *data_enter, 372 void (*callback_leave)(class ir_instruction *ir, void *data), 373 void *data_leave) 374 { 375 ir_hierarchical_visitor v; 376 377 v.callback_enter = callback_enter; 378 v.callback_leave = callback_leave; 379 v.data_enter = data_enter; 380 v.data_leave = data_leave; 381 382 ir->accept(&v); 383 } 384