From 718a89a50191e57215e37472d19c84a304477eda Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Thu, 23 Jul 2009 04:50:01 +0000 Subject: [PATCH] Use arrays as union padding. Also, since the resulting struct will always contain a single element and either a single i8 element or an array of i8s, there's no reason to use a packed struct. llvm-svn: 76854 --- clang/lib/CodeGen/CGExprConstant.cpp | 17 ++++++++++------- clang/test/CodeGen/cast-to-union.c | 4 ++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index 4f1f58f..43284b5 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -243,15 +243,18 @@ public: Types.push_back(C->getType()); unsigned CurSize = CGM.getTargetData().getTypeAllocSize(C->getType()); unsigned TotalSize = CGM.getTargetData().getTypeAllocSize(Ty); - while (CurSize < TotalSize) { - Elts.push_back(VMContext.getNullValue(llvm::Type::Int8Ty)); - Types.push_back(llvm::Type::Int8Ty); - CurSize++; + + assert(CurSize <= TotalSize && "Union size mismatch!"); + if (unsigned NumPadBytes = TotalSize - CurSize) { + const llvm::Type *Ty = llvm::Type::Int8Ty; + if (NumPadBytes > 1) + Ty = VMContext.getArrayType(Ty, NumPadBytes); + + Elts.push_back(VMContext.getNullValue(Ty)); + Types.push_back(Ty); } - // This always generates a packed struct - // FIXME: Try to generate an unpacked struct when we can - llvm::StructType* STy = VMContext.getStructType(Types, true); + llvm::StructType* STy = VMContext.getStructType(Types, false); return VMContext.getConstantStruct(STy, Elts); } diff --git a/clang/test/CodeGen/cast-to-union.c b/clang/test/CodeGen/cast-to-union.c index 6098bcc..39644c0 100644 --- a/clang/test/CodeGen/cast-to-union.c +++ b/clang/test/CodeGen/cast-to-union.c @@ -1,7 +1,7 @@ // RUN: clang-cc -emit-llvm < %s -o %t && // RUN: grep "store i32 351, i32*" %t && -// RUN: grep "w = global %0 <{ i32 2, i8 0, i8 0, i8 0, i8 0 }>" %t && -// RUN: grep "y = global %1 <{ double 7.300000e+01 }>" %t +// RUN: grep "w = global %0 { i32 2, \[4 x i8\] zeroinitializer }" %t && +// RUN: grep "y = global %1 { double 7.300000e+01 }" %t union u { int i; double d; }; -- 2.7.4