diff options
author | DJ Delorie <dj@redhat.com> | 2004-04-20 20:24:05 -0400 |
---|---|---|
committer | DJ Delorie <dj@gcc.gnu.org> | 2004-04-20 20:24:05 -0400 |
commit | 8b495402400e81c04278169c6176888f936fd6af (patch) | |
tree | d1f75e32e70eb5b6db5f1b876cf585a131e1711f /gcc | |
parent | e3ab7ec73ddb1202f51a2475d16388029373aae2 (diff) | |
download | gcc-8b495402400e81c04278169c6176888f936fd6af.zip gcc-8b495402400e81c04278169c6176888f936fd6af.tar.gz gcc-8b495402400e81c04278169c6176888f936fd6af.tar.bz2 |
dwarf2out.c (rtl_for_decl_location): Adjust rtl for byte variables stored in word registers, then in memory.
* dwarf2out.c (rtl_for_decl_location): Adjust rtl for byte
variables stored in word registers, then in memory.
From-SVN: r80941
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 18 |
2 files changed, 23 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 58436c3..3c7c499 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 86512a4..9cd05a0 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -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) { |