Fix dwarf2 debug error found by gdb testsuite: add big-endian correction.
authorJim Wilson <wilson@cygnus.com>
Wed, 24 Feb 1999 17:48:42 +0000 (17:48 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Wed, 24 Feb 1999 17:48:42 +0000 (09:48 -0800)
* 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

gcc/ChangeLog
gcc/dwarf2out.c

index 4677929f9a333530f689458e4feb8307d49fce8e..1ef11200c1b70a83d51b335ecc8d263d2e499569 100644 (file)
@@ -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
index c8d27b0cd272b642d9c0c80b329e68c877c86a9b..48331b9e789e47edee1d5124eb5d27b452388c44 100644 (file)
@@ -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)