Don't use getLLVMFieldNo for bitfields when constructing the ivar layout maps for GC.
authorAnders Carlsson <andersca@mac.com>
Fri, 24 Jul 2009 17:23:54 +0000 (17:23 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 24 Jul 2009 17:23:54 +0000 (17:23 +0000)
llvm-svn: 76978

clang/lib/CodeGen/CGObjCMac.cpp
clang/test/CodeGenObjC/ivar-layout-64-bitfields.m [new file with mode: 0644]

index 4b4605e..073b4ac 100644 (file)
@@ -3042,10 +3042,14 @@ void CGObjCCommonMac::BuildAggrIvarLayout(const ObjCImplementationDecl *OI,
   for (unsigned i = 0, e = RecFields.size(); i != e; ++i) {
     FieldDecl *Field = RecFields[i];
     uint64_t FieldOffset;
-    if (RD)
-      FieldOffset = 
-        Layout->getElementOffset(CGM.getTypes().getLLVMFieldNo(Field));
-    else
+    if (RD) {
+      if (Field->isBitField()) {
+        CodeGenTypes::BitFieldInfo Info = CGM.getTypes().getBitFieldInfo(Field);
+        FieldOffset = Layout->getElementOffset(Info.FieldNo);
+      } else 
+        FieldOffset = 
+          Layout->getElementOffset(CGM.getTypes().getLLVMFieldNo(Field));
+    } else
       FieldOffset = ComputeIvarBaseOffset(CGM, OI, cast<ObjCIvarDecl>(Field));
 
     // Skip over unnamed or bitfields
diff --git a/clang/test/CodeGenObjC/ivar-layout-64-bitfields.m b/clang/test/CodeGenObjC/ivar-layout-64-bitfields.m
new file mode 100644 (file)
index 0000000..69f5393
--- /dev/null
@@ -0,0 +1,12 @@
+// RUN: clang-cc -triple x86_64-apple-darwin9 -fobjc-gc -emit-llvm -o %t %s
+@interface I
+{
+  struct {
+    unsigned int d : 1;
+  } bitfield;
+}
+@end
+
+@implementation I
+@end
+