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