From: Jim Wilson Date: Wed, 24 Feb 1999 17:48:42 +0000 (+0000) Subject: Fix dwarf2 debug error found by gdb testsuite: add big-endian correction. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5a904a61b0170a05d2a287b340df44847f62fa8e;p=gcc.git Fix dwarf2 debug error found by gdb testsuite: add big-endian correction. * dwarf2out.c (add_location_or_const_value_attribute): Add big endian correction for parms passed in regs but living on the stack. From-SVN: r25412 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4677929f9a3..1ef11200c1b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Wed Feb 24 17:47:28 1999 Jim Wilson + + * dwarf2out.c (add_location_or_const_value_attribute): Add big + endian correction for parms passed in regs but living on the stack. + Wed Feb 24 14:03:54 1999 Jeffrey A Law (law@cygnus.com) * calls.c (compute_argument_block_size): New function, extracted from diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index c8d27b0cd27..48331b9e789 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -7084,6 +7084,38 @@ add_location_or_const_value_attribute (die, decl) && TYPE_SIZE (declared_type) <= TYPE_SIZE (passed_type)) rtl = DECL_INCOMING_RTL (decl); } + + /* If the parm was passed in registers, but lives on the stack, then + make a big endian correction if the mode of the type of the + parameter is not the same as the mode of the rtl. */ + /* ??? This is the same series of checks that are made in dbxout.c before + we reach the big endian correction code there. It isn't clear if all + of these checks are necessary here, but keeping them all is the safe + thing to do. */ + else if (GET_CODE (rtl) == MEM + && XEXP (rtl, 0) != const0_rtx + && ! CONSTANT_P (XEXP (rtl, 0)) + /* Not passed in memory. */ + && GET_CODE (DECL_INCOMING_RTL (decl)) != MEM + /* Not passed by invisible reference. */ + && (GET_CODE (XEXP (rtl, 0)) != REG + || REGNO (XEXP (rtl, 0)) == HARD_FRAME_POINTER_REGNUM + || REGNO (XEXP (rtl, 0)) == STACK_POINTER_REGNUM +#if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM + || REGNO (XEXP (rtl, 0)) == ARG_POINTER_REGNUM +#endif + ) + /* Big endian correction check. */ + && BYTES_BIG_ENDIAN + && TYPE_MODE (TREE_TYPE (decl)) != GET_MODE (rtl) + && (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl))) + < UNITS_PER_WORD)) + { + int offset = (UNITS_PER_WORD + - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl)))); + rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)), + plus_constant (XEXP (rtl, 0), offset)); + } } if (rtl == NULL_RTX)