dwarf2out.c (mem_loc_descriptor): New argument MODE.

* dwarf2out.c (mem_loc_descriptor): New argument MODE.  All callers
        changed.  Handle autoincrement addressing modes.

From-SVN: r28981
This commit is contained in:
Jeffrey A Law 1999-08-30 07:32:33 +00:00 committed by Jeff Law
parent f83a09927c
commit e60d4d7b38
2 changed files with 36 additions and 9 deletions

View file

@ -1,5 +1,8 @@
Mon Aug 30 01:02:09 1999 Jeffrey A Law (law@cygnus.com)
* dwarf2out.c (mem_loc_descriptor): New argument MODE. All callers
changed. Handle autoincrement addressing modes.
* integrate.c (copy_rtx_and_substitute): Handle internal_arg_pointer
just like we would the virtual incoming args register when
integrating.

View file

@ -2573,7 +2573,7 @@ static int type_is_enum PROTO((tree));
static dw_loc_descr_ref reg_loc_descriptor PROTO((rtx));
static dw_loc_descr_ref based_loc_descr PROTO((unsigned, long));
static int is_based_loc PROTO((rtx));
static dw_loc_descr_ref mem_loc_descriptor PROTO((rtx));
static dw_loc_descr_ref mem_loc_descriptor PROTO((rtx, enum machine_mode mode));
static dw_loc_descr_ref concat_loc_descriptor PROTO((rtx, rtx));
static dw_loc_descr_ref loc_descriptor PROTO((rtx));
static unsigned ceiling PROTO((unsigned, unsigned));
@ -6581,11 +6581,15 @@ is_based_loc (rtl)
When creating memory location descriptors, we are effectively transforming
the RTL for a memory-resident object into its Dwarf postfix expression
equivalent. This routine recursively descends an RTL tree, turning
it into Dwarf postfix code as it goes. */
it into Dwarf postfix code as it goes.
MODE is the mode of the memory reference, needed to handle some
autoincrement addressing modes. */
static dw_loc_descr_ref
mem_loc_descriptor (rtl)
mem_loc_descriptor (rtl, mode)
register rtx rtl;
enum machine_mode mode;
{
dw_loc_descr_ref mem_loc_result = NULL;
/* Note that for a dynamically sized array, the location we will generate a
@ -6595,6 +6599,13 @@ mem_loc_descriptor (rtl)
switch (GET_CODE (rtl))
{
case POST_INC:
case POST_DEC:
/* POST_INC and POST_DEC can be handled just like a SUBREG. So we
just fall into the SUBREG code. */
/* ... fall through ... */
case SUBREG:
/* The case of a subreg may arise when we have a local (register)
variable or a formal (register) parameter which doesn't quite fill
@ -6623,7 +6634,7 @@ mem_loc_descriptor (rtl)
break;
case MEM:
mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0));
mem_loc_result = mem_loc_descriptor (XEXP (rtl, 0), mode);
add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_deref, 0, 0));
break;
@ -6638,14 +6649,27 @@ mem_loc_descriptor (rtl)
mem_loc_result->dw_loc_oprnd1.v.val_addr = addr_to_string (rtl);
break;
case PRE_INC:
case PRE_DEC:
/* Turn these into a PLUS expression and fall into the PLUS code
below. */
rtl = gen_rtx_PLUS (word_mode, XEXP (rtl, 0),
GEN_INT (GET_CODE (rtl) == PRE_INC
? GET_MODE_UNIT_SIZE (mode)
: - GET_MODE_UNIT_SIZE (mode)));
/* ... fall through ... */
case PLUS:
if (is_based_loc (rtl))
mem_loc_result = based_loc_descr (reg_number (XEXP (rtl, 0)),
INTVAL (XEXP (rtl, 1)));
else
{
add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 0)));
add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 1)));
add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 0),
mode));
add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 1),
mode));
add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_plus, 0, 0));
}
break;
@ -6653,8 +6677,8 @@ mem_loc_descriptor (rtl)
case MULT:
/* If a pseudo-reg is optimized away, it is possible for it to
be replaced with a MEM containing a multiply. */
add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 0)));
add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 1)));
add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 0), mode));
add_loc_descr (&mem_loc_result, mem_loc_descriptor (XEXP (rtl, 1), mode));
add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_mul, 0, 0));
break;
@ -6721,7 +6745,7 @@ loc_descriptor (rtl)
break;
case MEM:
loc_result = mem_loc_descriptor (XEXP (rtl, 0));
loc_result = mem_loc_descriptor (XEXP (rtl, 0), GET_MODE (rtl));
break;
case CONCAT: