[PATCH] D21489: [codeview] Added support for bitfield type

Amjad Aboud via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 27 01:14:55 PDT 2016


aaboud added a comment.

In http://reviews.llvm.org/D21489#467609, @majnemer wrote:

> Consider this input:
>
>   #pragma pack(1)
>   struct S {
>     char    : 8;
>     short   : 8;
>     short x : 8;
>   } s;
>
>
> Your patch appears to give:
>
>   BitField (0x1001) {
>     TypeLeafKind: LF_BITFIELD (0x1205)
>     Type: short (0x11)
>     BitSize: 8
>     BitOffset: 0
>   }
>   FieldList (0x1002) {
>     TypeLeafKind: LF_FIELDLIST (0x1203)
>     DataMember {
>       AccessSpecifier: Public (0x3)
>       Type: 0x1001
>       FieldOffset: 0x2
>       Name: x
>     }
>   }
>   
>
> MSVC gives:
>
>   BitField (0x1001) {
>     TypeLeafKind: LF_BITFIELD (0x1205)
>     Type: short (0x11)
>     BitSize: 8
>     BitOffset: 8
>   }
>   FieldList (0x1002) {
>     TypeLeafKind: LF_FIELDLIST (0x1203)
>     DataMember {
>       AccessSpecifier: Public (0x3)
>       Type: 0x1001
>       FieldOffset: 0x1
>       Name: x
>     }
>   }


You are right, this case is not handled correctly yet.
However, this is because Clang (FE) does not provide the information, this is how LLVM IR looks like:

  !5 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S", file: !1, line: 2, size: 24, align: 8, elements: !6, identifier: ".?AUS@@")
  !6 = !{!7}
  !7 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !5, file: !1, line: 5, baseType: !8, size: 8, align: 16, offset: 16)
  !8 = !DIBasicType(name: "short", size: 16, align: 16, encoding: DW_ATE_signed)

and this how it should look like to fix the problem, once we make Clang emit the following the above code will work:

  !5 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "S", file: !1, line: 2, size: 24, align: 8, elements: !6, identifier: ".?AUS@@")
  !6 = !{!7, !9, 11}
  !7 = !DIDerivedType(tag: DW_TAG_member, scope: !5, file: !1, line: 3, baseType: !8, size: 8, align: 8, offset: 0)
  !8 = !DIBasicType(name: "char", size: 8, align: 8, encoding: DW_ATE_signed)
  !9 = !DIDerivedType(tag: DW_TAG_member, scope: !5, file: !1, line: 4, baseType: !10, size: 8, align: 16, offset: 8)
  !10 = !DIBasicType(name: "short", size: 16, align: 16, encoding: DW_ATE_signed)
  !11 = !DIDerivedType(tag: DW_TAG_member, name: "x", scope: !5, file: !1, line: 5, baseType: !11, size: 8, align: 16, offset: 16)

Then all we need to do, is not to emit members with no name, but to consider the size and alignment they consume.


http://reviews.llvm.org/D21489





More information about the llvm-commits mailing list