summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2008-05-27 22:45:40 +0000
committerDevang Patel <dpatel@apple.com>2008-05-27 22:45:40 +0000
commit1c56ace4df1117d30eae6112f10f194d8f674817 (patch)
tree0a47c2b5202e2225e21084aa9544baebf6d448e1
parentd608074e096193468a0ac527583ad7988bec1d57 (diff)
downloadbcm5719-llvm-1c56ace4df1117d30eae6112f10f194d8f674817.tar.gz
bcm5719-llvm-1c56ace4df1117d30eae6112f10f194d8f674817.zip
Check first member alignment and uses packed struct if required.
llvm-svn: 51619
-rw-r--r--clang/lib/CodeGen/CodeGenTypes.cpp2
-rw-r--r--clang/test/CodeGen/struct.c3
2 files changed, 5 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp
index aa0d2ed0531..5efde77a7d2 100644
--- a/clang/lib/CodeGen/CodeGenTypes.cpp
+++ b/clang/lib/CodeGen/CodeGenTypes.cpp
@@ -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());
diff --git a/clang/test/CodeGen/struct.c b/clang/test/CodeGen/struct.c
index 4c88c2539fd..f17a7af76c8 100644
--- a/clang/test/CodeGen/struct.c
+++ b/clang/test/CodeGen/struct.c
@@ -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];
OpenPOWER on IntegriCloud