From eb68fc3d8c29d471a454e3dde138ddd9ca4062a0 Mon Sep 17 00:00:00 2001 From: Alexey Prokhin Date: Fri, 8 Oct 2010 15:58:10 +0400 Subject: [PATCH] Fixed building of LDC1. Work on arrays --- gen/arrays.cpp | 12 +++++++++++- gen/runtime.cpp | 6 ++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/gen/arrays.cpp b/gen/arrays.cpp index f0567092..9e33b077 100644 --- a/gen/arrays.cpp +++ b/gen/arrays.cpp @@ -470,7 +470,7 @@ DSliceValue* DtoNewDynArray(Loc& loc, Type* arrayType, DValue* dim, bool default LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, fnname); // call allocator - LLValue* array = gIR->CreateCallOrInvoke2(fn, arrayTypeInfo, arrayLen, ".gc_mem").getInstruction(); + LLValue* newptr = gIR->CreateCallOrInvoke2(fn, arrayTypeInfo, arrayLen, ".gc_mem").getInstruction(); // cast to wanted type const LLType* dstType = DtoType(arrayType)->getContainedType(1); @@ -504,7 +504,12 @@ DSliceValue* DtoNewMulDimDynArray(Loc& loc, Type* arrayType, DValue** dims, size bool zeroInit = vtype->isZeroInit(); if (defaultInit && !isInitialized(vtype)) defaultInit = false; + +#if DMDV2 + const char* fnname = zeroInit ? "_d_newarraymT" : "_d_newarraymiT"; +#else const char* fnname = defaultInit ? (zeroInit ? "_d_newarraymT" : "_d_newarraymiT") : "_d_newarraymvT"; +#endif LLFunction* fn = LLVM_D_GetRuntimeFunction(gIR->module, fnname); // build dims @@ -520,6 +525,9 @@ DSliceValue* DtoNewMulDimDynArray(Loc& loc, Type* arrayType, DValue** dims, size // call allocator LLValue* newptr = gIR->CreateCallOrInvoke3(fn, arrayTypeInfo, DtoConstSize_t(ndims), dimsArg, ".gc_mem").getInstruction(); +#if DMDV2 + return getSlice(arrayType, newptr); +#else // cast to wanted type const LLType* dstType = DtoType(arrayType)->getContainedType(1); if (newptr->getType() != dstType) @@ -530,6 +538,7 @@ DSliceValue* DtoNewMulDimDynArray(Loc& loc, Type* arrayType, DValue** dims, size assert(firstDim); return new DSliceValue(arrayType, firstDim, newptr); +#endif } ////////////////////////////////////////////////////////////////////////////////////////// @@ -564,6 +573,7 @@ DSliceValue* DtoResizeDynArray(Type* arrayType, DValue* array, LLValue* newdim) LLValue* arrPtr = DtoArrayPtr(array); args.push_back(DtoArrayLen(array)); + LLValue* newptr = gIR->CreateCallOrInvoke(fn, args.begin(), args.end(), ".gc_mem").getInstruction(); if (Logger::enabled()) Logger::cout() << "arrPtr = " << *arrPtr << '\n'; diff --git a/gen/runtime.cpp b/gen/runtime.cpp index da00abbe..a734de16 100644 --- a/gen/runtime.cpp +++ b/gen/runtime.cpp @@ -309,11 +309,10 @@ static void LLVM_D_BuildRuntimeModule() // void* _d_newarraymT(TypeInfo ti, size_t length, size_t* dims) // void* _d_newarraymiT(TypeInfo ti, size_t length, size_t* dims) - // void* _d_newarraymvT(TypeInfo ti, size_t length, size_t* dims) + // D1: void* _d_newarraymvT(TypeInfo ti, size_t length, size_t* dims) { llvm::StringRef fname("_d_newarraymT"); llvm::StringRef fname2("_d_newarraymiT"); - llvm::StringRef fname3("_d_newarraymvT"); std::vector types; types.push_back(typeInfoTy); types.push_back(sizeTy); @@ -323,8 +322,11 @@ static void LLVM_D_BuildRuntimeModule() ->setAttributes(Attr_NoAlias_3_NoCapture); llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname2, M) ->setAttributes(Attr_NoAlias_3_NoCapture); +#if DMDV1 + llvm::StringRef fname3("_d_newarraymvT"); llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname3, M) ->setAttributes(Attr_NoAlias_3_NoCapture); +#endif } // D1: