diff options
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r-- | gcc/emit-rtl.c | 61 |
1 files changed, 41 insertions, 20 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index fd26d015763..aa9e96584a1 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -68,7 +68,7 @@ enum machine_mode ptr_mode; /* Mode whose width is POINTER_SIZE. */ /* Datastructures maintained for currently processed function in RTL form. */ -struct rtl_data rtl; +struct rtl_data x_rtl; /* Indexed by pseudo register number, gives the rtx for that pseudo. Allocated in parallel with regno_pointer_align. @@ -172,11 +172,11 @@ static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def))) static GTY ((if_marked ("ggc_marked_p"), param_is (struct rtx_def))) htab_t const_fixed_htab; -#define first_insn (rtl.emit.x_first_insn) -#define last_insn (rtl.emit.x_last_insn) -#define cur_insn_uid (rtl.emit.x_cur_insn_uid) -#define last_location (rtl.emit.x_last_location) -#define first_label_num (rtl.emit.x_first_label_num) +#define first_insn (crtl->emit.x_first_insn) +#define last_insn (crtl->emit.x_last_insn) +#define cur_insn_uid (crtl->emit.x_cur_insn_uid) +#define last_location (crtl->emit.x_last_location) +#define first_label_num (crtl->emit.x_first_label_num) static rtx make_call_insn_raw (rtx); static rtx change_address_1 (rtx, enum machine_mode, rtx, int); @@ -887,22 +887,22 @@ gen_reg_rtx (enum machine_mode mode) /* Make sure regno_pointer_align, and regno_reg_rtx are large enough to have an element for this pseudo reg number. */ - if (reg_rtx_no == rtl.emit.regno_pointer_align_length) + if (reg_rtx_no == crtl->emit.regno_pointer_align_length) { - int old_size = rtl.emit.regno_pointer_align_length; + int old_size = crtl->emit.regno_pointer_align_length; char *new; rtx *new1; - new = xrealloc (rtl.emit.regno_pointer_align, old_size * 2); + new = xrealloc (crtl->emit.regno_pointer_align, old_size * 2); memset (new + old_size, 0, old_size); - rtl.emit.regno_pointer_align = (unsigned char *) new; + crtl->emit.regno_pointer_align = (unsigned char *) new; new1 = ggc_realloc (regno_reg_rtx, old_size * 2 * sizeof (rtx)); memset (new1 + old_size, 0, old_size * sizeof (rtx)); regno_reg_rtx = new1; - rtl.emit.regno_pointer_align_length = old_size * 2; + crtl->emit.regno_pointer_align_length = old_size * 2; } val = gen_raw_REG (mode, reg_rtx_no); @@ -964,11 +964,32 @@ set_reg_attrs_from_value (rtx reg, rtx x) int offset; offset = byte_lowpart_offset (GET_MODE (reg), GET_MODE (x)); - if (MEM_P (x) && MEM_OFFSET (x) && GET_CODE (MEM_OFFSET (x)) == CONST_INT) - REG_ATTRS (reg) - = get_reg_attrs (MEM_EXPR (x), INTVAL (MEM_OFFSET (x)) + offset); - if (REG_P (x) && REG_ATTRS (x)) - update_reg_offset (reg, x, offset); + if (MEM_P (x)) + { + if (MEM_OFFSET (x) && GET_CODE (MEM_OFFSET (x)) == CONST_INT) + REG_ATTRS (reg) + = get_reg_attrs (MEM_EXPR (x), INTVAL (MEM_OFFSET (x)) + offset); + if (MEM_POINTER (x)) + mark_reg_pointer (reg, MEM_ALIGN (x)); + } + else if (REG_P (x)) + { + if (REG_ATTRS (x)) + update_reg_offset (reg, x, offset); + if (REG_POINTER (x)) + mark_reg_pointer (reg, REGNO_POINTER_ALIGN (REGNO (x))); + } +} + +/* Generate a REG rtx for a new pseudo register, copying the mode + and attributes from X. */ + +rtx +gen_reg_rtx_and_attrs (rtx x) +{ + rtx reg = gen_reg_rtx (GET_MODE (x)); + set_reg_attrs_from_value (reg, x); + return reg; } /* Set the register attributes for registers contained in PARM_RTX. @@ -4988,14 +5009,14 @@ init_emit (void) /* Init the tables that describe all the pseudo regs. */ - rtl.emit.regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101; + crtl->emit.regno_pointer_align_length = LAST_VIRTUAL_REGISTER + 101; - rtl.emit.regno_pointer_align - = xcalloc (rtl.emit.regno_pointer_align_length + crtl->emit.regno_pointer_align + = xcalloc (crtl->emit.regno_pointer_align_length * sizeof (unsigned char), 1); regno_reg_rtx - = ggc_alloc (rtl.emit.regno_pointer_align_length * sizeof (rtx)); + = ggc_alloc (crtl->emit.regno_pointer_align_length * sizeof (rtx)); /* Put copies of all the hard registers into regno_reg_rtx. */ memcpy (regno_reg_rtx, |