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_rvalue *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_variable *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_constant *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_loop_jump *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(ir_dereference_variable *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_enter(ir_loop *ir) 82{ 83 if (this->callback != NULL) 84 this->callback(ir, this->data); 85 86 return visit_continue; 87} 88 89ir_visitor_status 90ir_hierarchical_visitor::visit_leave(ir_loop *ir) 91{ 92 (void) ir; 93 return visit_continue; 94} 95 96ir_visitor_status 97ir_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 105ir_visitor_status 106ir_hierarchical_visitor::visit_leave(ir_function_signature *ir) 107{ 108 (void) ir; 109 return visit_continue; 110} 111 112ir_visitor_status 113ir_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 121ir_visitor_status 122ir_hierarchical_visitor::visit_leave(ir_function *ir) 123{ 124 (void) ir; 125 return visit_continue; 126} 127 128ir_visitor_status 129ir_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 137ir_visitor_status 138ir_hierarchical_visitor::visit_leave(ir_expression *ir) 139{ 140 (void) ir; 141 return visit_continue; 142} 143 144ir_visitor_status 145ir_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 153ir_visitor_status 154ir_hierarchical_visitor::visit_leave(ir_texture *ir) 155{ 156 (void) ir; 157 return visit_continue; 158} 159 160ir_visitor_status 161ir_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 169ir_visitor_status 170ir_hierarchical_visitor::visit_leave(ir_swizzle *ir) 171{ 172 (void) ir; 173 return visit_continue; 174} 175 176ir_visitor_status 177ir_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 185ir_visitor_status 186ir_hierarchical_visitor::visit_leave(ir_dereference_array *ir) 187{ 188 (void) ir; 189 return visit_continue; 190} 191 192ir_visitor_status 193ir_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 201ir_visitor_status 202ir_hierarchical_visitor::visit_leave(ir_dereference_record *ir) 203{ 204 (void) ir; 205 return visit_continue; 206} 207 208ir_visitor_status 209ir_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 217ir_visitor_status 218ir_hierarchical_visitor::visit_leave(ir_assignment *ir) 219{ 220 (void) ir; 221 return visit_continue; 222} 223 224ir_visitor_status 225ir_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 233ir_visitor_status 234ir_hierarchical_visitor::visit_leave(ir_call *ir) 235{ 236 (void) ir; 237 return visit_continue; 238} 239 240ir_visitor_status 241ir_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 249ir_visitor_status 250ir_hierarchical_visitor::visit_leave(ir_return *ir) 251{ 252 (void) ir; 253 return visit_continue; 254} 255 256ir_visitor_status 257ir_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 265ir_visitor_status 266ir_hierarchical_visitor::visit_leave(ir_discard *ir) 267{ 268 (void) ir; 269 return visit_continue; 270} 271 272ir_visitor_status 273ir_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 281ir_visitor_status 282ir_hierarchical_visitor::visit_leave(ir_if *ir) 283{ 284 (void) ir; 285 return visit_continue; 286} 287 288void 289ir_hierarchical_visitor::run(exec_list *instructions) 290{ 291 visit_list_elements(this, instructions); 292} 293 294 295void 296visit_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