summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-05-29 10:58:49 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-05-29 10:58:49 +0000
commit5a6d0ede91bddf21b494382d6d975d6fb2db80a9 (patch)
tree74cf8bf6939ae3ebe51adcaf330528bfaef2c1c3 /clang
parentbb936ce207115981248e27c591d534867d941b12 (diff)
downloadbcm5719-llvm-5a6d0ede91bddf21b494382d6d975d6fb2db80a9.tar.gz
bcm5719-llvm-5a6d0ede91bddf21b494382d6d975d6fb2db80a9.zip
Always use packed structs. This isn't really very nice, but there's
nothing fundamentally wrong with it. Emitting unpacked structs where possible is more work for almost no practical benefit. We'll probably want to fix it at some point anyway, but it's low priority. The issue with long double in particular is that LLVM thinks an X86 long double is 10 bytes, while clang considers it for all purposes to be either 12 or 16 bytes, depending on the platform, even in a packed struct. llvm-svn: 51673
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CodeGenTypes.cpp11
-rw-r--r--clang/test/CodeGen/struct-x86-darwin.c22
-rw-r--r--clang/test/CodeGen/struct.c3
3 files changed, 15 insertions, 21 deletions
diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp
index 5efde77a7d2..ec4f6df2b4d 100644
--- a/clang/lib/CodeGen/CodeGenTypes.cpp
+++ b/clang/lib/CodeGen/CodeGenTypes.cpp
@@ -482,14 +482,13 @@ void RecordOrganizer::layoutStructFields(const ASTRecordLayout &RL) {
// FIXME : Use SmallVector
uint64_t llvmSize = 0;
std::vector<const llvm::Type*> LLVMFields;
- bool packedStruct = false;
int NumMembers = RD.getNumMembers();
for (int curField = 0; curField < NumMembers; curField++) {
const FieldDecl *FD = RD.getMember(curField);
uint64_t offset = RL.getFieldOffset(curField);
const llvm::Type *Ty = CGT.ConvertTypeRecursive(FD->getType());
- uint64_t size = CGT.getTargetData().getABITypeSize(Ty) * 8;
+ uint64_t size = CGT.getTargetData().getTypeStoreSizeInBits(Ty);
if (FD->isBitField()) {
Expr *BitWidth = FD->getBitWidth();
@@ -513,12 +512,6 @@ void RecordOrganizer::layoutStructFields(const ASTRecordLayout &RL) {
llvmSize += 8;
}
- 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());
LLVMFields.push_back(Ty);
@@ -530,7 +523,7 @@ void RecordOrganizer::layoutStructFields(const ASTRecordLayout &RL) {
llvmSize += 8;
}
- STy = llvm::StructType::get(LLVMFields, packedStruct);
+ STy = llvm::StructType::get(LLVMFields, true);
assert(CGT.getTargetData().getABITypeSizeInBits(STy) == RL.getSize());
}
diff --git a/clang/test/CodeGen/struct-x86-darwin.c b/clang/test/CodeGen/struct-x86-darwin.c
index 3d3729dc9b9..68e6d729618 100644
--- a/clang/test/CodeGen/struct-x86-darwin.c
+++ b/clang/test/CodeGen/struct-x86-darwin.c
@@ -1,16 +1,14 @@
-// RUN: clang < %s -emit-llvm > %t1
-// Run grep "STest1 = type { i32, \[4 x i16\], double }" %t1 &&
-// RUN: grep "STest2 = type { i16, i16, i32, i32 }" %t1 &&
-// RUN: grep "STest3 = type { i8, i8, i16, i32 }" %t1 &&
-// RUN: grep "STestB1 = type { i8, i8 }" %t1 &&
-// RUN: grep "STestB2 = type { i8, i8, i8 }" %t1 &&
-// RUN: grep "STestB3 = type { i8, i8 }" %t1 &&
-// RUN: grep "STestB4 = type { i8, i8, i8, i8 }" %t1
-// RUN: grep "STestB5 = type { i8, i8, i8, i8, i8, i8 }" %t1
-// RUN: grep "STestB6 = type { i8, i8, i8, i8 }" %t1
+// RUN: clang < %s -emit-llvm > %t1 -triple=i686-apple-darwin9
+// Run grep "STest1 = type <{ i32, \[4 x i16\], double }>" %t1 &&
+// RUN: grep "STest2 = type <{ i16, i16, i32, i32 }>" %t1 &&
+// RUN: grep "STest3 = type <{ i8, i8, i16, i32 }>" %t1 &&
+// RUN: grep "STestB1 = type <{ i8, i8 }>" %t1 &&
+// RUN: grep "STestB2 = type <{ i8, i8, i8 }>" %t1 &&
+// RUN: grep "STestB3 = type <{ i8, i8 }>" %t1 &&
+// RUN: grep "STestB4 = type <{ i8, i8, i8, i8 }>" %t1
+// RUN: grep "STestB5 = type <{ i8, i8, i8, i8, i8, i8 }>" %t1
+// RUN: grep "STestB6 = type <{ i8, i8, i8, i8 }>" %t1
// Test struct layout for x86-darwin target
-// FIXME : Enable this test for x86-darwin only. At the moment clang hard codes
-// x86-darwin as the target
struct STest1 {int x; short y[4]; double z; } st1;
struct STest2 {short a,b; int c,d; } st2;
diff --git a/clang/test/CodeGen/struct.c b/clang/test/CodeGen/struct.c
index f17a7af76c8..f567a0b2ff1 100644
--- a/clang/test/CodeGen/struct.c
+++ b/clang/test/CodeGen/struct.c
@@ -163,3 +163,6 @@ int f14(int i, ...) {
/* Attribute packed */
struct __attribute__((packed)) S2839 { double a[19]; signed char b; } s2839[5];
+
+struct __attribute__((packed)) SS { long double a; char b; } SS;
+
OpenPOWER on IntegriCloud