[PATCH] D49410: [PDB] Parse UDT symbols and pointers to members
Hui Huang via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 20 01:01:22 PDT 2018
Hui 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:
> 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
}
```
https://reviews.llvm.org/D49410
More information about the llvm-commits
mailing list