From 4257bc6d5bd6ec0789287bc5ee7c2fea1f44c59e Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sat, 25 Jul 2009 00:24:56 +0000 Subject: [PATCH] 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 --- lib/CodeGen/CGExprConstant.cpp | 25 +++++++++++++++++++------ utils/ABITest/layout/Makefile | 4 ++-- 2 files changed, 21 insertions(+), 8 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 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 = diff --git a/utils/ABITest/layout/Makefile b/utils/ABITest/layout/Makefile index 0520625fcf..95536b884a 100644 --- a/utils/ABITest/layout/Makefile +++ b/utils/ABITest/layout/Makefile @@ -11,11 +11,11 @@ TIMEOUT := 5 CFLAGS := -std=gnu99 -X_COMPILER := llvm-gcc +X_COMPILER := /Developer/usr/bin/llvm-gcc-4.2 Y_COMPILER := clang CC := gcc -ifeq (0, 0) +ifeq (1, 0) X_CFLAGS := -m32 Y_CFLAGS := -m32 CC_CFLAGS := -m32