From 053315c2134b7832b351c599fa3fa11abf6ca4e7 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 28 Jul 2010 20:05:03 +0000 Subject: [PATCH] * dwarf2read.c (dwarf2_const_value_data): Never sign extend. --- gdb/ChangeLog | 4 ++++ gdb/dwarf2read.c | 16 ++++++++-------- 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 + + * dwarf2read.c (dwarf2_const_value_data): Never sign extend. + 2010-07-28 Daniel Jacobowitz * 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; -- 2.7.4