[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