]> granicus.if.org Git - clang/commitdiff
Check first member alignment and uses packed struct if required.
authorDevang Patel <dpatel@apple.com>
Tue, 27 May 2008 22:45:40 +0000 (22:45 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 27 May 2008 22:45:40 +0000 (22:45 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51619 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CodeGenTypes.cpp
test/CodeGen/struct.c

index aa0d2ed0531f37ea8d1634094bda191ec5a90f1a..5efde77a7d220b7f150188d0f5529834ea40c8ca 100644 (file)
@@ -516,6 +516,8 @@ void RecordOrganizer::layoutStructFields(const ASTRecordLayout &RL) {
       unsigned Align = CGT.getTargetData().getABITypeAlignment(Ty) * 8;
       if (llvmSize % Align)
         packedStruct = true;
+      else if (offset == 0 && RL.getAlignment() % Align)
+        packedStruct = true;
 
       llvmSize += size;
       CGT.addFieldInfo(FD, LLVMFields.size());
index 4c88c2539fdfc6b06f51d9517dcc607a37853121..f17a7af76c8358da30ca9a139c1d39b59426af43 100644 (file)
@@ -160,3 +160,6 @@ int f14(int i, ...) {
   a13 b = __builtin_va_arg(l, a13);
   return b.b;
 }
+
+/* Attribute packed */
+struct __attribute__((packed)) S2839 { double a[19];  signed char b; } s2839[5];