aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@cygnus.com>1999-02-24 17:48:42 +0000
committerJim Wilson <wilson@gcc.gnu.org>1999-02-24 09:48:42 -0800
commit5a904a61b0170a05d2a287b340df44847f62fa8e (patch)
tree46d6959f35e3370804815de6e46fac7749e856c0
parent599f37b6d3945ce70d5c75ca42ab156b3f3c5e65 (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/dwarf2out.c32
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)