+static long get_Sel_array_index_long(ir_node *n, int dim) {
+ ir_node *index = get_Sel_index(n, dim);
+ assert(get_irn_op(index) == op_Const);
+ return get_tarval_long(get_Const_tarval(index));
+}
+
+compound_graph_path *rec_get_accessed_path(ir_node *ptr, int depth) {
+ compound_graph_path *res;
+ if (get_irn_op(ptr) == op_SymConst) {
+ assert(get_SymConst_kind(ptr) == symconst_addr_ent);
+ entity *root = get_SymConst_entity(ptr);
+ res = new_compound_graph_path(get_entity_type(root), depth);
+ } else {
+ assert(get_irn_op(ptr) == op_Sel);
+ res = rec_get_accessed_path(get_Sel_ptr(ptr), depth+1);
+ entity *field = get_Sel_entity(ptr);
+ int path_len = get_compound_graph_path_length(res);
+ int pos = path_len - depth -1;
+ set_compound_graph_path_node(res, pos, field);
+ if (is_Array_type(get_entity_owner(field))) {
+ assert(get_Sel_n_indexs(ptr) == 1 && "multi dim arrays not implemented");
+ set_compound_graph_path_array_index(res, pos, get_Sel_array_index_long(ptr, 0));
+ }
+ }
+ return res;
+}
+
+compound_graph_path *get_accessed_path(ir_node *ptr) {
+ return rec_get_accessed_path(ptr, 0);
+}
+
+