diff options
author | Jim Wilson <wilson@cygnus.com> | 1999-02-24 17:48:42 +0000 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 1999-02-24 09:48:42 -0800 |
commit | 5a904a61b0170a05d2a287b340df44847f62fa8e (patch) | |
tree | 46d6959f35e3370804815de6e46fac7749e856c0 /gcc | |
parent | 599f37b6d3945ce70d5c75ca42ab156b3f3c5e65 (diff) | |
download | gcc-5a904a61b0170a05d2a287b340df44847f62fa8e.zip gcc-5a904a61b0170a05d2a287b340df44847f62fa8e.tar.gz gcc-5a904a61b0170a05d2a287b340df44847f62fa8e.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 32 |
2 files changed, 37 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4677929..1ef1120 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Wed Feb 24 17:47:28 1999 Jim Wilson <wilson@cygnus.com> + + * 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 c8d27b0..48331b9 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) |