debug/7241: DWARF encoding for "char" incorrect in gcc
Franz Sirl
Franz.Sirl-kernel@lauterbach.com
Tue Jul 9 04:12:00 GMT 2002
At 12:01 09.07.2002, jcownie@etnus.com wrote:
> >Number: 7241
> >Category: debug
> >Synopsis: DWARF encoding for "char" incorrect in gcc
> >Confidential: no
> >Severity: serious
> >Priority: medium
> >Responsible: unassigned
> >State: open
> >Class: sw-bug
> >Submitter-Id: net
> >Arrival-Date: Tue Jul 09 03:06:00 PDT 2002
> >Closed-Date:
> >Last-Modified:
> >Originator: James Cownie
> >Release: 3.1
> >Organization:
>Etnus LLC
> >Environment:
>System: Linux pc4 2.4.18 #1 Tue Apr 2 10:17:01 BST 2002 i686 unknown
>Architecture: i686
>host: i686-pc-linux-gnu
>build: i686-pc-linux-gnu
>target: i686-pc-linux-gnu
>configured with: /home1/GNU/gcc-3.1/configure
>
> >Description:
>The DWARF emitted for a "char" variable is incorrect from gcc, but
>correct from g++.
>
>Consider this code
>---- const_strings.c ---------
>typedef struct
>{
> const char * name;
> int value;
>} named_value;
>
>int main (int argc, char ** argv)
>{
> named_value v;
> const char * zero = "zero";
>
> v.name = "one";
> v.value = 1;
>
> v.value++;
>}
>-------------------------------
>jcownie@pc4: gcc31 -v -g -c const_strings.c
>Reading specs from /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/specs
>Configured with: /home1/GNU/gcc-3.1/configure
>Thread model: single
>gcc version 3.1
> /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/cc1 -lang-c -v -iprefix
> /home1/jim/bin/Linux-i686/../lib/gcc-lib/i686-pc-linux-gnu/3.1/
> -D__GNUC__=3 -D__GNUC_MINOR__=1 -D__GNUC_PATCHLEVEL__=0 -D__ELF__ -Dunix
> -D__gnu_linux__ -Dlinux -D__ELF__ -D__unix__ -D__gnu_linux__ -D__linux__
> -D__unix -D__linux -Asystem=posix -D__NO_INLINE__ -D__STDC_HOSTED__=1
> -Acpu=i386 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i686__
> -D__tune_pentiumpro__ const_strings.c -quiet -dumpbase const_strings.c -g
> -version -o /tmp/ccStmXSo.s
>GNU CPP version 3.1 (cpplib) (i386 Linux/ELF)
>GNU C version 3.1 (i686-pc-linux-gnu)
> compiled by GNU C version 3.1.
>ignoring nonexistent directory
>"/home1/jim/bin/Linux-i686/../lib/gcc-lib/i686-pc-linux-gnu/3.1/include"
>ignoring nonexistent directory
>"/home1/jim/bin/Linux-i686/../lib/gcc-lib/i686-pc-linux-gnu/3.1/../../../../i686-pc-linux-gnu/include"
>ignoring nonexistent directory "NONE/include"
>ignoring nonexistent directory "/usr/local/i686-pc-linux-gnu/include"
>#include "..." search starts here:
>#include <...> search starts here:
> /usr/local/include
> /usr/local/lib/gcc-lib/i686-pc-linux-gnu/3.1/include
> /usr/include
>End of search list.
> as --traditional-format -V -Qy -o const_strings.o /tmp/ccStmXSo.s
>GNU assembler version 2.12 (i686-pc-linux-gnu) using BFD version 2.12
>
>If we dump out the DWARF info with readelf -wi we see that the
>definition of the base type "char" is
>
> <1><a0>: Abbrev Number: 6 (DW_TAG_base_type)
> DW_AT_name : char
> DW_AT_byte_size : 1
> DW_AT_encoding : 5 (signed)
>
>Which (see page 62 of the DWARF 3 document) defines it as a signed
>binary integer of size one byte, _NOT_ a signed character (which would
>be encoding 6).
>
>If we do the same thing with g++, we get
> <1><d7>: Abbrev Number: 5 (DW_TAG_base_type)
> DW_AT_name : char
> DW_AT_byte_size : 1
> DW_AT_encoding : 6 (signed char)
>
>which is correct.
Hmm, I would rather think g++ is the wrong one here. IIRC in C++ (C too?)
"char"/"signed char"/"unsigned char" are actually 3 distinct types and thus
encoding 6 should have only be used if you would have explicitly written
"signed char" in your example, or?
Franz.
More information about the Gcc-bugs
mailing list