aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-07-25 00:24:56 +0000
committerAnders Carlsson <andersca@mac.com>2009-07-25 00:24:56 +0000
commit4257bc6d5bd6ec0789287bc5ee7c2fea1f44c59e (patch)
tree47174250cc9f9424c7349e6a0ef91fc9df3e630f /lib/CodeGen
parent4a28d5deeba33722aa009eab488591fb9055cc7e (diff)
More work on the constant struct builder. We now try to layout all constant structs but throw away the result.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77021 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/CGExprConstant.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/lib/CodeGen/CGExprConstant.cpp b/lib/CodeGen/CGExprConstant.cpp
index 07570c1034..84e9283cad 100644
--- a/lib/CodeGen/CGExprConstant.cpp
+++ b/lib/CodeGen/CGExprConstant.cpp
@@ -34,6 +34,7 @@ class VISIBILITY_HIDDEN ConstStructBuilder {
CodeGenFunction *CGF;
bool Packed;
+
unsigned NextFieldOffsetInBytes;
std::vector<llvm::Constant *> Elements;
@@ -131,12 +132,24 @@ class VISIBILITY_HIDDEN ConstStructBuilder {
ElementNo++;
}
+ uint64_t LayoutSizeInBytes = Layout.getSize() / 8;
+
+ if (NextFieldOffsetInBytes > LayoutSizeInBytes) {
+ // If the struct is bigger than the size of the record type,
+ // we must have a flexible array member at the end.
+ assert(RD->hasFlexibleArrayMember() &&
+ "Must have flexible array member if struct is bigger than type!");
+
+ // No tail padding is necessary.
+ return true;
+ }
+
// Append tail padding if necessary.
AppendTailPadding(Layout.getSize());
-
+
assert(Layout.getSize() / 8 == NextFieldOffsetInBytes &&
"Tail padding mismatch!");
-
+
return true;
}
@@ -156,16 +169,15 @@ public:
const InitListExpr *ILE) {
ConstStructBuilder Builder(CGM, CGF);
- // FIXME: Use this when it works well enough.
- return 0;
-
if (!Builder.Build(ILE))
return 0;
llvm::Constant *Result =
CGM.getLLVMContext().getConstantStruct(Builder.Elements, Builder.Packed);
- assert(Builder.NextFieldOffsetInBytes == Builder.getSizeInBytes(Result));
+ assert(llvm::RoundUpToAlignment(Builder.NextFieldOffsetInBytes,
+ Builder.getAlignment(Result)) ==
+ Builder.getSizeInBytes(Result) && "Size mismatch!");
return Result;
}
@@ -330,6 +342,7 @@ public:
}
llvm::Constant *EmitStructInitialization(InitListExpr *ILE) {
+ // FIXME: Use the returned struct when the builder works well enough.
ConstStructBuilder::BuildStruct(CGM, CGF, ILE);
const llvm::StructType *SType =