[Lldb-commits] [PATCH] D49410: [PDB] Parse UDT symbols and pointers to members
Aleksandr Urakov via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Wed Jul 25 00:49:29 PDT 2018
aleksandr.urakov added inline comments.
================
Comment at: lit/SymbolFile/PDB/Inputs/ClassLayoutTest.cpp:37
+ };
+ union { // Test unnamed union. MSVC treats it as `int a; float b;`
+ int a;
----------------
aleksandr.urakov wrote:
> Hui wrote:
> > aleksandr.urakov wrote:
> > > Here is a problem. `MicrosoftRecordLayoutBuilder` asserts every field or base offset, but in our case fields `a` and `b` are treated as `struct Complex`'s fields, not `union`'s, so lldb crashes in debug on this. I can't find enough info in PDB to restore the unnamed union here. Do you have any ideas about it?
> >
> > Based on MSVC cl yielded PDB, you could have full information to restore the unnamed UDT.
> >
> > From my experience, PDB yielded by clang-cl (/Z7 or /Zi) is slightly different from the one by cl.
> >
> > Both contain information about forwarded unnamed UDT.
> > However PDB yielded by clang-cl more or less lacks the member information. See below.
> >
> > The CodeView info is good. Maybe you need to look at LLC?
> >
> > CodeView
> >
> > ```
> > FieldList (0x1044) {
> > TypeLeafKind: LF_FIELDLIST (0x1203)
> > DataMember {
> > TypeLeafKind: LF_MEMBER (0x150D)
> > AccessSpecifier: Public (0x3)
> > Type: int (0x74)
> > FieldOffset: 0x0
> > Name: a
> > }
> > DataMember {
> > TypeLeafKind: LF_MEMBER (0x150D)
> > AccessSpecifier: Public (0x3)
> > Type: float (0x40)
> > FieldOffset: 0x0
> > Name: b
> > }
> > }
> >
> > Union (0x1045) {
> > TypeLeafKind: LF_UNION (0x1506)
> > MemberCount: 2
> > Properties [ (0x608)
> > HasUniqueName (0x200)
> > Nested (0x8)
> > Sealed (0x400)
> > ]
> > FieldList: <field list> (0x1044)
> > SizeOf: 4
> > Name: Complex::<unnamed-tag>
> > LinkageName: .?AT<unnamed-type-$S2>@Complex@@
> > }
> >
> > ```
> >
> > llvm-pdbutil pdb (clang-cl /z7)
> >
> > (found unnamed symbol, however size = 0, they will be just ignored. See PDBASTParser.cpp #259
> > The size should not be zero)
> >
> >
> > ```
> > struct Complex::<unnamed-tag> [sizeof = 0] {}
> >
> > union Complex::<unnamed-tag> [sizeof = 0] {}
> >
> > struct Complex [sizeof = 728] {
> > data +0x00 [sizeof=720] _List* array[90]
> > data +0x2d0 [sizeof=4] int x
> > data +0x2d4 [sizeof=4] int a
> > data +0x2d4 [sizeof=4] float b
> > }
> >
> > ```
> >
> > llvm-pdbutil pdb ( cl /z7)
> >
> > ( you have full information to restore unnamed)
> > ```
> >
> > struct Complex [sizeof = 728] {
> > data +0x00 [sizeof=720] _List* array[90]
> > data +0x2d0 [sizeof=4] int x
> > data +0x2d4 [sizeof=4] int a
> > data +0x2d4 [sizeof=4] float b
> > }
> >
> > Total padding 3 bytes (25% of class size)
> > Immediate padding 3 bytes (25% of class size)
> >
> > struct Complex::<unnamed-tag> [sizeof = 4] {
> > data +0x00 [sizeof=4] int x
> > }
> >
> > union Complex::<unnamed-tag> [sizeof = 4] {
> > data +0x00 [sizeof=4] int a
> > data +0x00 [sizeof=4] float b
> > }
> > ```
> >
> >
> Thank you! But what means `LLC`?
I have figured that out, sorry. I usually use disassembly tools for this purpose.
https://reviews.llvm.org/D49410
More information about the lldb-commits
mailing list