OSDN Git Service

* dwarf2out.c (rtl_for_decl_location): Adjust rtl for byte
authordj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Apr 2004 00:24:05 +0000 (00:24 +0000)
committerdj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Apr 2004 00:24:05 +0000 (00:24 +0000)
variables stored in word registers, then in memory.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@80941 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c

index 58436c3..3c7c499 100644 (file)
@@ -1,3 +1,8 @@
+2004-04-20  DJ Delorie  <dj@redhat.com>
+       
+       * dwarf2out.c (rtl_for_decl_location): Adjust rtl for byte
+       variables stored in word registers, then in memory.
+
 2004-04-20  Eric Christopher  <echristo@redhat.com>
 
        * cp/parser.c (cp_parser_declaration): Move translate
index 86512a4..9cd05a0 100644 (file)
@@ -9756,6 +9756,24 @@ rtl_for_decl_location (tree decl)
                             plus_constant (XEXP (rtl, 0), offset));
        }
     }
+  else if (TREE_CODE (decl) == VAR_DECL
+          && GET_CODE (rtl) == MEM
+          && GET_MODE (rtl) != TYPE_MODE (TREE_TYPE (decl))
+          && BYTES_BIG_ENDIAN)
+    {
+      int rsize = GET_MODE_SIZE (GET_MODE (rtl));
+      int dsize = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (decl)));
+
+      /* If a variable is declared "register" yet is smaller than
+        a register, then if we store the variable to memory, it
+        looks like we're storing a register-sized value, when in
+        fact we are not.  We need to adjust the offset of the
+        storage location to reflect the actual value's bytes,
+        else gdb will not be able to display it.  */
+      if (rsize > dsize)
+       rtl = gen_rtx_MEM (TYPE_MODE (TREE_TYPE (decl)),
+                          plus_constant (XEXP (rtl, 0), rsize-dsize));
+    }
 
   if (rtl != NULL_RTX)
     {