void get_address_description (tree op, struct mem_address *addr) { addr->symbol = TMR_SYMBOL (op); addr->base = TMR_BASE (op); addr->index = TMR_INDEX (op); addr->step = TMR_STEP (op); addr->offset = TMR_OFFSET (op); }
tree tree_mem_ref_addr (tree type, tree mem_ref) { tree addr; tree act_elem; tree step = TMR_STEP (mem_ref), offset = TMR_OFFSET (mem_ref); tree sym = TMR_SYMBOL (mem_ref), base = TMR_BASE (mem_ref); tree addr_base = NULL_TREE, addr_off = NULL_TREE; if (sym) addr_base = fold_convert (type, build_addr (sym, current_function_decl)); else if (base && POINTER_TYPE_P (TREE_TYPE (base))) { addr_base = fold_convert (type, base); base = NULL_TREE; } act_elem = TMR_INDEX (mem_ref); if (act_elem) { if (step) act_elem = fold_build2 (MULT_EXPR, sizetype, act_elem, step); addr_off = act_elem; } act_elem = base; if (act_elem) { if (addr_off) addr_off = fold_build2 (PLUS_EXPR, sizetype, addr_off, act_elem); else addr_off = act_elem; } if (offset && !integer_zerop (offset)) { if (addr_off) addr_off = fold_build2 (PLUS_EXPR, sizetype, addr_off, offset); else addr_off = offset; } if (addr_off) { if (addr_base) addr = fold_build2 (POINTER_PLUS_EXPR, type, addr_base, addr_off); else addr = fold_convert (type, addr_off); } else if (addr_base) addr = addr_base; else addr = build_int_cst (type, 0); return addr; }
static void get_tmr_operands (gimple stmt, tree expr, int flags) { if (TREE_THIS_VOLATILE (expr)) gimple_set_has_volatile_ops (stmt, true); /* First record the real operands. */ get_expr_operands (stmt, &TMR_BASE (expr), opf_use | (flags & opf_no_vops)); get_expr_operands (stmt, &TMR_INDEX (expr), opf_use | (flags & opf_no_vops)); get_expr_operands (stmt, &TMR_INDEX2 (expr), opf_use | (flags & opf_no_vops)); add_virtual_operand (stmt, flags); }
tree tree_mem_ref_addr (tree type, tree mem_ref) { tree addr; tree act_elem; tree step = TMR_STEP (mem_ref), offset = TMR_OFFSET (mem_ref); tree addr_base = NULL_TREE, addr_off = NULL_TREE; addr_base = fold_convert (type, TMR_BASE (mem_ref)); act_elem = TMR_INDEX (mem_ref); if (act_elem) { if (step) act_elem = fold_build2 (MULT_EXPR, TREE_TYPE (act_elem), act_elem, step); addr_off = act_elem; } act_elem = TMR_INDEX2 (mem_ref); if (act_elem) { if (addr_off) addr_off = fold_build2 (PLUS_EXPR, TREE_TYPE (addr_off), addr_off, act_elem); else addr_off = act_elem; } if (offset && !integer_zerop (offset)) { if (addr_off) addr_off = fold_build2 (PLUS_EXPR, TREE_TYPE (addr_off), addr_off, fold_convert (TREE_TYPE (addr_off), offset)); else addr_off = offset; } if (addr_off) addr = fold_build_pointer_plus (addr_base, addr_off); else addr = addr_base; return addr; }
void get_address_description (tree op, struct mem_address *addr) { if (TREE_CODE (TMR_BASE (op)) == ADDR_EXPR) { addr->symbol = TMR_BASE (op); addr->base = TMR_INDEX2 (op); } else { addr->symbol = NULL_TREE; if (TMR_INDEX2 (op)) { gcc_assert (integer_zerop (TMR_BASE (op))); addr->base = TMR_INDEX2 (op); } else addr->base = TMR_BASE (op); } addr->index = TMR_INDEX (op); addr->step = TMR_STEP (op); addr->offset = TMR_OFFSET (op); }
bool for_each_index (tree *addr_p, bool (*cbck) (tree, tree *, void *), void *data) { tree *nxt, *idx; for (; ; addr_p = nxt) { switch (TREE_CODE (*addr_p)) { case SSA_NAME: return cbck (*addr_p, addr_p, data); case MISALIGNED_INDIRECT_REF: case ALIGN_INDIRECT_REF: case INDIRECT_REF: nxt = &TREE_OPERAND (*addr_p, 0); return cbck (*addr_p, nxt, data); case BIT_FIELD_REF: case VIEW_CONVERT_EXPR: case REALPART_EXPR: case IMAGPART_EXPR: nxt = &TREE_OPERAND (*addr_p, 0); break; case COMPONENT_REF: /* If the component has varying offset, it behaves like index as well. */ idx = &TREE_OPERAND (*addr_p, 2); if (*idx && !cbck (*addr_p, idx, data)) return false; nxt = &TREE_OPERAND (*addr_p, 0); break; case ARRAY_REF: case ARRAY_RANGE_REF: nxt = &TREE_OPERAND (*addr_p, 0); if (!cbck (*addr_p, &TREE_OPERAND (*addr_p, 1), data)) return false; break; case VAR_DECL: case PARM_DECL: case STRING_CST: case RESULT_DECL: case VECTOR_CST: case COMPLEX_CST: case INTEGER_CST: case REAL_CST: case FIXED_CST: case CONSTRUCTOR: return true; case TARGET_MEM_REF: idx = &TMR_BASE (*addr_p); if (*idx && !cbck (*addr_p, idx, data)) return false; idx = &TMR_INDEX (*addr_p); if (*idx && !cbck (*addr_p, idx, data)) return false; return true; default: gcc_unreachable (); } } }