aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2010-07-28 20:05:03 +0000
committerTom Tromey <tromey@redhat.com>2010-07-28 20:05:03 +0000
commit053315c2134b7832b351c599fa3fa11abf6ca4e7 (patch)
tree14e668d7fa467a638259da54bcdff0ccb8d0d682
parent3ce3b1ba3153a2fc9265ba78cc25acaa7db127ba (diff)
downloadgdb-053315c2134b7832b351c599fa3fa11abf6ca4e7.zip
gdb-053315c2134b7832b351c599fa3fa11abf6ca4e7.tar.gz
gdb-053315c2134b7832b351c599fa3fa11abf6ca4e7.tar.bz2
* dwarf2read.c (dwarf2_const_value_data): Never sign extend.
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/dwarf2read.c16
2 files changed, 12 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 05ec70e..19e9e06 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2010-07-27 Tom Tromey <tromey@redhat.com>
+
+ * dwarf2read.c (dwarf2_const_value_data): Never sign extend.
+
2010-07-28 Daniel Jacobowitz <dan@codesourcery.com>
* dwarf2read.c (read_subroutine_type): Improve THIS detection,
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 7a0da0e..9eb7466 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -10485,8 +10485,13 @@ dwarf2_const_value (struct attribute *attr, struct symbol *sym,
}
-/* Given an attr with a DW_FORM_dataN value in host byte order, sign-
- or zero-extend it as appropriate for the symbol's type. */
+/* Given an attr with a DW_FORM_dataN value in host byte order,
+ zero-extend it as appropriate for the symbol's type. The DWARF
+ standard (v4) is not entirely clear about the meaning of using
+ DW_FORM_dataN for a constant with a signed type, where the type is
+ wider than the data. The conclusion of a discussion on the DWARF
+ list was that this is unspecified. We choose to always zero-extend
+ because that is the interpretation long in use by GCC. */
static void
dwarf2_const_value_data (struct attribute *attr,
struct symbol *sym,
@@ -10495,12 +10500,7 @@ dwarf2_const_value_data (struct attribute *attr,
LONGEST l = DW_UNSND (attr);
if (bits < sizeof (l) * 8)
- {
- if (TYPE_UNSIGNED (SYMBOL_TYPE (sym)))
- l &= ((LONGEST) 1 << bits) - 1;
- else
- l = (l << (sizeof (l) * 8 - bits)) >> (sizeof (l) * 8 - bits);
- }
+ l &= ((LONGEST) 1 << bits) - 1;
SYMBOL_VALUE (sym) = l;
SYMBOL_CLASS (sym) = LOC_CONST;