* dwarf2read.c (dwarf2_const_value_data): Never sign extend.
authorTom Tromey <tromey@redhat.com>
Wed, 28 Jul 2010 20:05:03 +0000 (20:05 +0000)
committerTom Tromey <tromey@redhat.com>
Wed, 28 Jul 2010 20:05:03 +0000 (20:05 +0000)
gdb/ChangeLog
gdb/dwarf2read.c

index 05ec70e..19e9e06 100644 (file)
@@ -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,
index 7a0da0e..9eb7466 100644 (file)
@@ -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;