This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

debug/7241: DWARF encoding for "char" incorrect in gcc


>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.

>How-To-Repeat:
As above.
>Fix:
	
>Release-Note:
>Audit-Trail:
>Unformatted:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]