JDevlieghere created this revision. JDevlieghere added reviewers: aprantl, dexonsmith.
We generate incorrect values for the DW_AT_data_bit_offset for interfaces in Objective-C. I can only speculate as to what we were trying to achieve by taking the modulo of the bit size with the byte size, but given that the size and offset is expressed in bits, this seems wrong. Repository: rC Clang https://reviews.llvm.org/D51990 Files: clang/lib/CodeGen/CGDebugInfo.cpp clang/test/CodeGenObjC/debug-info-ivars.m Index: clang/test/CodeGenObjC/debug-info-ivars.m =================================================================== --- clang/test/CodeGenObjC/debug-info-ivars.m +++ clang/test/CodeGenObjC/debug-info-ivars.m @@ -15,30 +15,29 @@ } @end -@implementation BaseClass -@end + @implementation BaseClass + @end -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "i" -// CHECK-SAME: line: 10 -// CHECK-SAME: baseType: ![[INT:[0-9]+]] -// CHECK-SAME: size: 32, -// CHECK-NOT: offset: -// CHECK-SAME: flags: DIFlagProtected -// CHECK: ![[INT]] = !DIBasicType(name: "int" -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_1" -// CHECK-SAME: line: 11 -// CHECK-SAME: baseType: ![[UNSIGNED:[0-9]+]] -// CHECK-SAME: size: 9, -// CHECK-NOT: offset: -// CHECK-SAME: flags: DIFlagProtected -// CHECK: ![[UNSIGNED]] = !DIBasicType(name: "unsigned int" -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_2" -// CHECK-SAME: line: 12 -// CHECK-SAME: baseType: ![[UNSIGNED]] -// CHECK-SAME: size: 9, offset: 1, -// CHECK-SAME: flags: DIFlagProtected -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_3" -// CHECK-SAME: line: 14 -// CHECK-SAME: baseType: ![[UNSIGNED]] -// CHECK-SAME: size: 9, offset: 3, -// CHECK-SAME: flags: DIFlagProtected + // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "i" + // CHECK-SAME: line: 10 + // CHECK-SAME: baseType: ![[INT:[0-9]+]] + // CHECK-SAME: size: 32, + // CHECK-NOT: offset: + // CHECK-SAME: flags: DIFlagProtected + // CHECK: ![[INT]] = !DIBasicType(name: "int" + // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_1" + // CHECK-SAME: line: 11 + // CHECK-SAME: baseType: ![[UNSIGNED:[0-9]+]] + // CHECK-SAME: size: 9, offset: 96 + // CHECK-SAME: flags: DIFlagProtected + // CHECK: ![[UNSIGNED]] = !DIBasicType(name: "unsigned int" + // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_2" + // CHECK-SAME: line: 12 + // CHECK-SAME: baseType: ![[UNSIGNED]] + // CHECK-SAME: size: 9, offset: 105 + // CHECK-SAME: flags: DIFlagProtected + // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_3" + // CHECK-SAME: line: 14 + // CHECK-SAME: baseType: ![[UNSIGNED]] + // CHECK-SAME: size: 9, offset: 115 + // CHECK-SAME: flags: DIFlagProtected Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -2363,13 +2363,10 @@ // We don't know the runtime offset of an ivar if we're using the // non-fragile ABI. For bitfields, use the bit offset into the first // byte of storage of the bitfield. For other fields, use zero. - if (Field->isBitField()) { - FieldOffset = - CGM.getObjCRuntime().ComputeBitfieldBitOffset(CGM, ID, Field); - FieldOffset %= CGM.getContext().getCharWidth(); - } else { - FieldOffset = 0; - } + FieldOffset = + Field->isBitField() + ? CGM.getObjCRuntime().ComputeBitfieldBitOffset(CGM, ID, Field) + : 0; } else { FieldOffset = RL.getFieldOffset(FieldNo); }
Index: clang/test/CodeGenObjC/debug-info-ivars.m =================================================================== --- clang/test/CodeGenObjC/debug-info-ivars.m +++ clang/test/CodeGenObjC/debug-info-ivars.m @@ -15,30 +15,29 @@ } @end -@implementation BaseClass -@end + @implementation BaseClass + @end -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "i" -// CHECK-SAME: line: 10 -// CHECK-SAME: baseType: ![[INT:[0-9]+]] -// CHECK-SAME: size: 32, -// CHECK-NOT: offset: -// CHECK-SAME: flags: DIFlagProtected -// CHECK: ![[INT]] = !DIBasicType(name: "int" -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_1" -// CHECK-SAME: line: 11 -// CHECK-SAME: baseType: ![[UNSIGNED:[0-9]+]] -// CHECK-SAME: size: 9, -// CHECK-NOT: offset: -// CHECK-SAME: flags: DIFlagProtected -// CHECK: ![[UNSIGNED]] = !DIBasicType(name: "unsigned int" -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_2" -// CHECK-SAME: line: 12 -// CHECK-SAME: baseType: ![[UNSIGNED]] -// CHECK-SAME: size: 9, offset: 1, -// CHECK-SAME: flags: DIFlagProtected -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_3" -// CHECK-SAME: line: 14 -// CHECK-SAME: baseType: ![[UNSIGNED]] -// CHECK-SAME: size: 9, offset: 3, -// CHECK-SAME: flags: DIFlagProtected + // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "i" + // CHECK-SAME: line: 10 + // CHECK-SAME: baseType: ![[INT:[0-9]+]] + // CHECK-SAME: size: 32, + // CHECK-NOT: offset: + // CHECK-SAME: flags: DIFlagProtected + // CHECK: ![[INT]] = !DIBasicType(name: "int" + // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_1" + // CHECK-SAME: line: 11 + // CHECK-SAME: baseType: ![[UNSIGNED:[0-9]+]] + // CHECK-SAME: size: 9, offset: 96 + // CHECK-SAME: flags: DIFlagProtected + // CHECK: ![[UNSIGNED]] = !DIBasicType(name: "unsigned int" + // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_2" + // CHECK-SAME: line: 12 + // CHECK-SAME: baseType: ![[UNSIGNED]] + // CHECK-SAME: size: 9, offset: 105 + // CHECK-SAME: flags: DIFlagProtected + // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "flag_3" + // CHECK-SAME: line: 14 + // CHECK-SAME: baseType: ![[UNSIGNED]] + // CHECK-SAME: size: 9, offset: 115 + // CHECK-SAME: flags: DIFlagProtected Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -2363,13 +2363,10 @@ // We don't know the runtime offset of an ivar if we're using the // non-fragile ABI. For bitfields, use the bit offset into the first // byte of storage of the bitfield. For other fields, use zero. - if (Field->isBitField()) { - FieldOffset = - CGM.getObjCRuntime().ComputeBitfieldBitOffset(CGM, ID, Field); - FieldOffset %= CGM.getContext().getCharWidth(); - } else { - FieldOffset = 0; - } + FieldOffset = + Field->isBitField() + ? CGM.getObjCRuntime().ComputeBitfieldBitOffset(CGM, ID, Field) + : 0; } else { FieldOffset = RL.getFieldOffset(FieldNo); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits