]> granicus.if.org Git - clang/commitdiff
__alignof attribute on the field must consider
authorFariborz Jahanian <fjahanian@apple.com>
Thu, 5 May 2011 21:19:14 +0000 (21:19 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Thu, 5 May 2011 21:19:14 +0000 (21:19 +0000)
packed attribute on the field. //rdar://9217290

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130948 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp
test/CodeGen/packed-arrays.c
test/CodeGen/packed-structure.c

index 717c3a8ffee14858181b861d475bf3f610ebbd36..d6535e9f8cf61eee0d6c87e1df063ec6de759807 100644 (file)
@@ -635,6 +635,10 @@ CharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) const {
       UseAlignAttrOnly = true;
     }
   }
+  else if (isa<FieldDecl>(D))
+      UseAlignAttrOnly = 
+        D->hasAttr<PackedAttr>() ||
+        cast<FieldDecl>(D)->getParent()->hasAttr<PackedAttr>();
 
   // If we're using the align attribute only, just ignore everything
   // else about the declaration and its type.
index 785db4d2dde20d9fe436479acec5e6f672a7c27c..0c8bb6c7bd4f94697533d4cd89d9f35ac2b4bf4d 100644 (file)
@@ -34,10 +34,8 @@ int align3 = __alignof(struct s3);
 
 // CHECK: @align0_x = global i32 1
 int align0_x = __alignof(((struct s0*) 0)->x);
-// We are currently incompatible with GCC here. <rdar://problem/9217290>
 //
-// CHECK-XFAIL: @align1_x = global i32 1
-// CHECK: @align1_x = global i32 4
+// CHECK: @align1_x = global i32 1
 int align1_x = __alignof(((struct s1*) 0)->x);
 // CHECK: @align2_x = global i32 1
 int align2_x = __alignof(((struct s2*) 0)->x);
@@ -66,22 +64,22 @@ int f0_b(struct s0 *a) {
   return *(a->x + 1);
 }
 
+// Note that we are incompatible with GCC on this example.
+// 
 // CHECK: define i32 @f1_a
-// CHECK:   load i32* %{{.*}}, align 4
+// CHECK:   load i32* %{{.*}}, align 1
 // CHECK: }
 // CHECK: define i32 @f1_b
 // CHECK:   load i32* %{{.*}}, align 4
 // CHECK: }
 
-// Note that we are incompatible with GCC on these two examples.
+// Note that we are incompatible with GCC on this example.
 //
 // CHECK: define i32 @f1_c
-// CHECK-XFAIL:   load i32* %{{.*}}, align 1
 // CHECK:   load i32* %{{.*}}, align 4
 // CHECK: }
 // CHECK: define i32 @f1_d
-// CHECK-XFAIL:   load i32* %{{.*}}, align 1
-// CHECK:   load i32* %{{.*}}, align 4
+// CHECK:   load i32* %{{.*}}, align 1
 // CHECK: }
 int f1_a(struct s1 *a) {
   return a->x[1];
index 731a50bb077290422ba33ae28e287405205ebf46..3aeaa23eb3bc537c4b205fdc1694db7c2cbfc5bd 100644 (file)
@@ -10,8 +10,7 @@ struct s0 {
 
 // CHECK-GLOBAL: @s0_align_x = global i32 4
 
-// FIXME: This should be 1 to match gcc. PR7951.
-// CHECK-GLOBAL: @s0_align_y = global i32 4
+// CHECK-GLOBAL: @s0_align_y = global i32 1
 
 // CHECK-GLOBAL: @s0_align = global i32 4
 int s0_align_x = __alignof(((struct s0*)0)->x);
@@ -27,7 +26,7 @@ int s0_load_x(struct s0 *a) { return a->x; }
 // with align 1 (in 2363.1 at least).
 //
 // CHECK-FUNCTIONS: define i32 @s0_load_y
-// CHECK-FUNCTIONS: [[s0_load_y:%.*]] = load i32* {{.*}}, align 4
+// CHECK-FUNCTIONS: [[s0_load_y:%.*]] = load i32* {{.*}}, align 1
 // CHECK-FUNCTIONS: ret i32 [[s0_load_y]]
 int s0_load_y(struct s0 *a) { return a->y; }
 // CHECK-FUNCTIONS: define void @s0_copy
@@ -92,11 +91,11 @@ struct __attribute__((packed, aligned)) s3 {
   short aShort;
   int anInt;
 };
-// CHECK-GLOBAL: @s3_1 = global i32 2
+// CHECK-GLOBAL: @s3_1 = global i32 1
 int s3_1 = __alignof(((struct s3*) 0)->anInt);
 // CHECK-FUNCTIONS: define i32 @test3(
 int test3(struct s3 *ptr) {
   // CHECK-FUNCTIONS:      [[PTR:%.*]] = getelementptr inbounds {{%.*}}* {{%.*}}, i32 0, i32 1
-  // CHECK-FUNCTIONS-NEXT: load i32* [[PTR]], align 2
+  // CHECK-FUNCTIONS-NEXT: load i32* [[PTR]], align 1
   return ptr->anInt;
 }