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