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]

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


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.


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