From f0394be6484dacc42dad15586b3bbe5de0f0149b Mon Sep 17 00:00:00 2001 From: Joel Brobecker Date: Fri, 3 Jan 2003 14:01:47 +0000 Subject: [PATCH] * mdebugread.c (parse_symbol): Count until the stEnd matching the structure name. --- gdb/ChangeLog | 5 +++++ gdb/mdebugread.c | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index afc6ca5..96aa09e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2003-01-03 J. Brobecker + + * mdebugread.c (parse_symbol): Count until the stEnd matching + the structure name. + 2003-01-02 Mark Kettenis * configure.in: Remove --with-cpu option. diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index f6ec396..b5a15c3 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -865,7 +865,24 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, switch (tsym.st) { case stEnd: - goto end_of_fields; + /* C++ encodes class types as structures where there the + methods are encoded as stProc. The scope of stProc + symbols also ends with stEnd, thus creating a risk of + taking the wrong stEnd symbol record as the end of + the current struct, which would cause GDB to undercount + the real number of fields in this struct. To make sure + we really reached the right stEnd symbol record, we + check the associated name, and match it against the + struct name. Since method names are mangled while + the class name is not, there is no risk of having a + method whose name is identical to the class name + (in particular constructor method names are different + from the class name). There is therefore no risk that + this check stops the count on the StEnd of a method. */ + if (strcmp (debug_info->ss + cur_fdr->issBase + tsym.iss, + name) == 0) + goto end_of_fields; + break; case stMember: if (nfields == 0 && type_code == TYPE_CODE_UNDEF) -- 2.7.4