summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/SwiftCallingConv.cpp
diff options
context:
space:
mode:
authorArnold Schwaighofer <aschwaighofer@apple.com>2017-06-21 21:43:40 +0000
committerArnold Schwaighofer <aschwaighofer@apple.com>2017-06-21 21:43:40 +0000
commit7b871611b97dabe343bc40d55b401598e47b9203 (patch)
tree4fc134a6aa8434f61931596c11be5a13356a2260 /clang/lib/CodeGen/SwiftCallingConv.cpp
parent05092380773149492ca28d7af23869a18983a223 (diff)
downloadbcm5719-llvm-7b871611b97dabe343bc40d55b401598e47b9203.tar.gz
bcm5719-llvm-7b871611b97dabe343bc40d55b401598e47b9203.zip
SwiftCC: Perform physical layout when computing coercion types
We need to take type alignment padding into account whe computing physical layouts. The layout must be compatible with the input layout, offsets are defined in terms of offsets within a packed struct which are computed in terms of the alloc size of a type. Usingthe store size we would insert padding for the following type for example: struct { int3 v; long long l; } __attribute((packed)) On x86-64 int3 is padded to int4 alignment. The swiftcc type would be <{ <3 x float>, [4 x i8], i64 }> which is not compatible with <{ <3 x float>, i64 }>. The latter has i64 at offset 16 and the former at offset 20. rdar://32618125 llvm-svn: 305956
Diffstat (limited to 'clang/lib/CodeGen/SwiftCallingConv.cpp')
-rw-r--r--clang/lib/CodeGen/SwiftCallingConv.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/SwiftCallingConv.cpp b/clang/lib/CodeGen/SwiftCallingConv.cpp
index 0bfe30a32c8..fc8e36d2c59 100644
--- a/clang/lib/CodeGen/SwiftCallingConv.cpp
+++ b/clang/lib/CodeGen/SwiftCallingConv.cpp
@@ -57,6 +57,10 @@ static CharUnits getTypeStoreSize(CodeGenModule &CGM, llvm::Type *type) {
return CharUnits::fromQuantity(CGM.getDataLayout().getTypeStoreSize(type));
}
+static CharUnits getTypeAllocSize(CodeGenModule &CGM, llvm::Type *type) {
+ return CharUnits::fromQuantity(CGM.getDataLayout().getTypeAllocSize(type));
+}
+
void SwiftAggLowering::addTypedData(QualType type, CharUnits begin) {
// Deal with various aggregate types as special cases:
@@ -542,7 +546,9 @@ SwiftAggLowering::getCoerceAndExpandTypes() const {
packed = true;
elts.push_back(entry.Type);
- lastEnd = entry.End;
+
+ lastEnd = entry.Begin + getTypeAllocSize(CGM, entry.Type);
+ assert(entry.End <= lastEnd);
}
// We don't need to adjust 'packed' to deal with possible tail padding
OpenPOWER on IntegriCloud