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; }
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); }