From: Daniel Jacobowitz <drow@mvista.com>
To: Jason Merrill <jason@redhat.com>
Cc: libstdc++@gcc.gnu.org, gdb@sources.redhat.com
Subject: Re: C++ debugging progress
Date: Wed, 28 Nov 2001 09:41:00 -0000 [thread overview]
Message-ID: <20011128124118.A23447@nevyn.them.org> (raw)
In-Reply-To: <wvl667v1btw.fsf@prospero.cambridge.redhat.com>
On Wed, Nov 28, 2001 at 09:31:07AM +0000, Jason Merrill wrote:
> >>>>> "Daniel" == Daniel Jacobowitz <drow@mvista.com> writes:
>
> > I'll not be posting the patches for another day or two. The way I do it now
> > is grossly inefficient; I look through RTTI at every lookup instead of once
> > per type. It also depends on presence of RTTI. There's not much I can do
> > about that - or rather, I could, but AFAICT it would require walking the
> > inheritance graph in the proper order and I don't have the machinery to do
> > that easily. I'm not heartbroken that we need RTTI for debugging though.
>
> So you're using the inheritance information in the RTTI rather than the debug
> info? That seems unfortunate. I'm not sure why you would need to worry
> about ordering; the debug info should tell you exactly where things are.
> If it doesn't, it should probably be fixed.
In that case, the debug info absolutely needs to be fixed.
(I'm looking at stabs here. I haven't tried to see what Dwarf2 emits
yet. I don't have my head wrapped around Dwarf2. Yeah, I know, I
should be using it.)
Consider this:
struct Base { int xxx; };
struct Left : public virtual Base { int yyy; };
struct Right : public virtual Base { int zzz; };
struct Bottom : public Left, public Right { int bbb; };
int main() { struct Bottom bzz; return 1; }
The question, of course, is: Where's bzz.xxx?
Dwarf2 first:
<1><115>: Abbrev Number: 15 (DW_TAG_structure_type)
DW_AT_sibling : <1c2>
DW_AT_name : Bottom
DW_AT_byte_size : 24
DW_AT_decl_file : 1
DW_AT_decl_line : 4
DW_AT_containing_type: <22e>
<2><128>: Abbrev Number: 16 (DW_TAG_inheritance)
DW_AT_type : <22e>
DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0; )
DW_AT_accessibility: 1 (public)
<2><131>: Abbrev Number: 16 (DW_TAG_inheritance)
DW_AT_type : <2df>
DW_AT_data_member_location: 2 byte block: 23 8 (DW_OP_plus_uconst: 8; )
DW_AT_accessibility: 1 (public)
<2><13a>: Abbrev Number: 3 (DW_TAG_member)
DW_AT_name : bbb
DW_AT_decl_file : 1
DW_AT_decl_line : 4
DW_AT_type : <cd>
DW_AT_data_member_location: 2 byte block: 23 10 (DW_OP_plus_uconst: 16; )
Do you see it? I don't, and I'm pretty sure it's not there. It's at
+20. That's not the best piece of information, though; what would be
more useful would be the vtable offset, in a Bottom vtable, for the
vbase offset. That saves us a whole lot of grubbing around through
memory. That's not there either, or in the entry for Left where it
would be logical to have it:
<1><22e>: Abbrev Number: 15 (DW_TAG_structure_type)
DW_AT_sibling : <2df>
DW_AT_name : Left
DW_AT_byte_size : 12
DW_AT_decl_file : 1
DW_AT_decl_line : 2
DW_AT_containing_type: <22e>
<2><23f>: Abbrev Number: 22 (DW_TAG_inheritance)
DW_AT_type : <56>
DW_AT_data_member_location: 2 byte block: 23 8 (DW_OP_plus_uconst: 8; )
DW_AT_virtuality : 1 (virtual)
DW_AT_accessibility: 1 (public)
<2><249>: Abbrev Number: 23 (DW_TAG_member)
DW_AT_name : _vptr.Left
DW_AT_type : <3b1>
DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0; )
DW_AT_artificial : 1
<2><25d>: Abbrev Number: 3 (DW_TAG_member)
DW_AT_name : yyy
DW_AT_decl_file : 1
DW_AT_decl_line : 2
DW_AT_type : <cd>
DW_AT_data_member_location: 2 byte block: 23 4 (DW_OP_plus_uconst: 4; )
No dice.
Meanwhile, in stabs gunk, member functions trimmed for brevity:
.stabs "Bottom:Tt(0,32)=s24!2,020,(0,38)=xsLeft:;
0264,(0,39)=xsRight:;bbb:(0,1),128,32;
<snip>;;
~%(0,38);"
That tells me that it's 24 bytes, that it has a Left at 0 bits and a
Right at 8 bits and int bbb at 128 bits, and that its vptr is in the
Left.
The Left says:
.stabs "Left:Tt(0,317)=s12!1,1264,(0,25);.vf(0,317):(0,329),0;
yyy:(0,1),32,32;
<snip>;;
~%(0,317);"
So it's 12 bytes, has a (virtual) Base at 64 bits, a vptr at 0 bits,
and int yyy at 32 bits. That doesn't tell me anything at all.
So I've got the inheritence graph now, from either Dwarf2 or stabs.
That is, technically, enough information for me to figure out the
layout of the vbase and vcall offsets. But that's hideously
complicated! If you see a better way, I'd love to know it.
--
Daniel Jacobowitz Carnegie Mellon University
MontaVista Software Debian GNU/Linux Developer
WARNING: multiple messages have this Message-ID
From: Daniel Jacobowitz <drow@mvista.com>
To: Jason Merrill <jason@redhat.com>
Cc: libstdc++@gcc.gnu.org, gdb@sources.redhat.com
Subject: Re: C++ debugging progress
Date: Wed, 21 Nov 2001 04:12:00 -0000 [thread overview]
Message-ID: <20011128124118.A23447@nevyn.them.org> (raw)
Message-ID: <20011121041200.eX6RWfzAibxDWkVUuB6wU9WEea8psEB2uk1snvO_RUA@z> (raw)
In-Reply-To: <wvl667v1btw.fsf@prospero.cambridge.redhat.com>
On Wed, Nov 28, 2001 at 09:31:07AM +0000, Jason Merrill wrote:
> >>>>> "Daniel" == Daniel Jacobowitz <drow@mvista.com> writes:
>
> > I'll not be posting the patches for another day or two. The way I do it now
> > is grossly inefficient; I look through RTTI at every lookup instead of once
> > per type. It also depends on presence of RTTI. There's not much I can do
> > about that - or rather, I could, but AFAICT it would require walking the
> > inheritance graph in the proper order and I don't have the machinery to do
> > that easily. I'm not heartbroken that we need RTTI for debugging though.
>
> So you're using the inheritance information in the RTTI rather than the debug
> info? That seems unfortunate. I'm not sure why you would need to worry
> about ordering; the debug info should tell you exactly where things are.
> If it doesn't, it should probably be fixed.
In that case, the debug info absolutely needs to be fixed.
(I'm looking at stabs here. I haven't tried to see what Dwarf2 emits
yet. I don't have my head wrapped around Dwarf2. Yeah, I know, I
should be using it.)
Consider this:
struct Base { int xxx; };
struct Left : public virtual Base { int yyy; };
struct Right : public virtual Base { int zzz; };
struct Bottom : public Left, public Right { int bbb; };
int main() { struct Bottom bzz; return 1; }
The question, of course, is: Where's bzz.xxx?
Dwarf2 first:
<1><115>: Abbrev Number: 15 (DW_TAG_structure_type)
DW_AT_sibling : <1c2>
DW_AT_name : Bottom
DW_AT_byte_size : 24
DW_AT_decl_file : 1
DW_AT_decl_line : 4
DW_AT_containing_type: <22e>
<2><128>: Abbrev Number: 16 (DW_TAG_inheritance)
DW_AT_type : <22e>
DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0; )
DW_AT_accessibility: 1 (public)
<2><131>: Abbrev Number: 16 (DW_TAG_inheritance)
DW_AT_type : <2df>
DW_AT_data_member_location: 2 byte block: 23 8 (DW_OP_plus_uconst: 8; )
DW_AT_accessibility: 1 (public)
<2><13a>: Abbrev Number: 3 (DW_TAG_member)
DW_AT_name : bbb
DW_AT_decl_file : 1
DW_AT_decl_line : 4
DW_AT_type : <cd>
DW_AT_data_member_location: 2 byte block: 23 10 (DW_OP_plus_uconst: 16; )
Do you see it? I don't, and I'm pretty sure it's not there. It's at
+20. That's not the best piece of information, though; what would be
more useful would be the vtable offset, in a Bottom vtable, for the
vbase offset. That saves us a whole lot of grubbing around through
memory. That's not there either, or in the entry for Left where it
would be logical to have it:
<1><22e>: Abbrev Number: 15 (DW_TAG_structure_type)
DW_AT_sibling : <2df>
DW_AT_name : Left
DW_AT_byte_size : 12
DW_AT_decl_file : 1
DW_AT_decl_line : 2
DW_AT_containing_type: <22e>
<2><23f>: Abbrev Number: 22 (DW_TAG_inheritance)
DW_AT_type : <56>
DW_AT_data_member_location: 2 byte block: 23 8 (DW_OP_plus_uconst: 8; )
DW_AT_virtuality : 1 (virtual)
DW_AT_accessibility: 1 (public)
<2><249>: Abbrev Number: 23 (DW_TAG_member)
DW_AT_name : _vptr.Left
DW_AT_type : <3b1>
DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0; )
DW_AT_artificial : 1
<2><25d>: Abbrev Number: 3 (DW_TAG_member)
DW_AT_name : yyy
DW_AT_decl_file : 1
DW_AT_decl_line : 2
DW_AT_type : <cd>
DW_AT_data_member_location: 2 byte block: 23 4 (DW_OP_plus_uconst: 4; )
No dice.
Meanwhile, in stabs gunk, member functions trimmed for brevity:
.stabs "Bottom:Tt(0,32)=s24!2,020,(0,38)=xsLeft:;
0264,(0,39)=xsRight:;bbb:(0,1),128,32;
<snip>;;
~%(0,38);"
That tells me that it's 24 bytes, that it has a Left at 0 bits and a
Right at 8 bits and int bbb at 128 bits, and that its vptr is in the
Left.
The Left says:
.stabs "Left:Tt(0,317)=s12!1,1264,(0,25);.vf(0,317):(0,329),0;
yyy:(0,1),32,32;
<snip>;;
~%(0,317);"
So it's 12 bytes, has a (virtual) Base at 64 bits, a vptr at 0 bits,
and int yyy at 32 bits. That doesn't tell me anything at all.
So I've got the inheritence graph now, from either Dwarf2 or stabs.
That is, technically, enough information for me to figure out the
layout of the vbase and vcall offsets. But that's hideously
complicated! If you see a better way, I'd love to know it.
--
Daniel Jacobowitz Carnegie Mellon University
MontaVista Software Debian GNU/Linux Developer
next prev parent reply other threads:[~2001-11-28 9:41 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-11-27 23:03 Daniel Jacobowitz
2001-11-18 21:43 ` Daniel Jacobowitz
2001-11-19 9:04 ` Benjamin Kosnik
2001-11-27 23:36 ` Benjamin Kosnik
2001-11-19 11:16 ` Daniel Berlin
2001-11-21 13:37 ` Dan Mosedale
2001-11-28 12:25 ` Dan Mosedale
2001-11-27 23:43 ` Daniel Berlin
2001-11-19 13:41 ` Jason Merrill
2001-11-28 1:31 ` Jason Merrill
2001-11-28 9:41 ` Daniel Jacobowitz [this message]
2001-11-21 4:12 ` Daniel Jacobowitz
2001-11-21 5:06 ` Daniel Berlin
2001-11-28 10:36 ` Daniel Berlin
2001-11-28 10:49 ` Daniel Jacobowitz
2001-11-21 12:33 ` Daniel Jacobowitz
2001-11-28 11:41 ` Jason Merrill
2001-11-21 13:21 ` Jason Merrill
2001-11-21 13:42 ` Daniel Jacobowitz
2001-11-28 12:32 ` Daniel Jacobowitz
2001-11-21 16:38 ` Jason Merrill
2001-11-22 0:13 ` Daniel Jacobowitz
2001-11-24 22:52 ` Jason Merrill
2001-11-29 9:44 ` Jason Merrill
2001-11-29 12:28 ` Daniel Jacobowitz
2001-11-25 8:34 ` Daniel Jacobowitz
2001-11-25 9:01 ` Kevin Buettner
2001-11-25 10:30 ` Jason Merrill
2001-11-29 19:12 ` Jason Merrill
2001-11-29 13:11 ` Kevin Buettner
2001-11-29 12:50 ` Benjamin Kosnik
2001-11-25 8:40 ` Benjamin Kosnik
2001-11-28 13:31 ` Daniel Jacobowitz
2001-11-28 13:03 ` Jason Merrill
[not found] ` <20011128151819.A31514@nevyn.them.org>
2001-11-21 22:26 ` Jason Merrill
2001-11-28 13:14 ` Jason Merrill
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20011128124118.A23447@nevyn.them.org \
--to=drow@mvista.com \
--cc=gdb@sources.redhat.com \
--cc=jason@redhat.com \
--cc=libstdc++@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox