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



_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to