From ae013b9da64b48f22ca82828aa3c7a909f99dbd7 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Wed, 28 Oct 2009 20:55:41 +0000 Subject: [PATCH] Code gen for array construction - WIP git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85432 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGCXX.cpp | 21 +++++++++++--- test/CodeGenCXX/array-construction.cpp | 40 ++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 test/CodeGenCXX/array-construction.cpp diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index cfa669dc4b..345eacb673 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -594,8 +594,11 @@ CodeGenFunction::EmitCXXConstructExpr(llvm::Value *Dest, // For a copy constructor, even if it is trivial, must fall thru so // its argument is code-gen'ed. if (!CD->isCopyConstructor(getContext())) { + QualType InitType = E->getType(); + if (const ArrayType *Array = getContext().getAsArrayType(InitType)) + InitType = getContext().getBaseElementType(Array); const CXXRecordDecl *RD = - cast(E->getType()->getAs()->getDecl()); + cast(InitType->getAs()->getDecl()); if (RD->hasTrivialConstructor()) return; } @@ -606,9 +609,19 @@ CodeGenFunction::EmitCXXConstructExpr(llvm::Value *Dest, EmitAggExpr((*i), Dest, false); return; } - // Call the constructor. - EmitCXXConstructorCall(CD, Ctor_Complete, Dest, - E->arg_begin(), E->arg_end()); + if (const ConstantArrayType *Array = + getContext().getAsConstantArrayType(E->getType())) { + QualType BaseElementTy = getContext().getBaseElementType(Array); + const llvm::Type *BasePtr = ConvertType(BaseElementTy); + BasePtr = llvm::PointerType::getUnqual(BasePtr); + llvm::Value *BaseAddrPtr = + Builder.CreateBitCast(Dest, BasePtr); + EmitCXXAggrConstructorCall(CD, Array, BaseAddrPtr); + } + else + // Call the constructor. + EmitCXXConstructorCall(CD, Ctor_Complete, Dest, + E->arg_begin(), E->arg_end()); } void CodeGenModule::EmitCXXConstructors(const CXXConstructorDecl *D) { diff --git a/test/CodeGenCXX/array-construction.cpp b/test/CodeGenCXX/array-construction.cpp new file mode 100644 index 0000000000..b444221533 --- /dev/null +++ b/test/CodeGenCXX/array-construction.cpp @@ -0,0 +1,40 @@ +// RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s && +// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s && +// RUN: clang-cc -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s && +// RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s && +// RUN: true + +extern "C" int printf(...); + +static int count; +static float fcount; + +class xpto { +public: + xpto() : i(count++), f(fcount++) { + printf("xpto::xpto()\n"); + } + int i; + float f; + +/** + NYI + ~xpto() { + printf("xpto::~xpto()\n"); + } +*/ +}; + +int main() { + xpto array[2][3][4]; + for (int h = 0; h < 2; h++) + for (int i = 0; i < 3; i++) + for (int j = 0; j < 4; j++) + printf("array[%d][%d][%d] = {%d, %f}\n", + h, i, j, array[h][i][j].i, array[h][i][j].f); +} + +// CHECK-LP64: call __ZN4xptoC1Ev + +// CHECK-LP32: call L__ZN4xptoC1Ev + -- 2.50.1