Implement _d_arraycatnTX and remove _d_arraycatnT.

With this commit, the first simple applications can be linked and run!
This commit is contained in:
kai 2015-03-21 17:37:51 +01:00
parent 51b9822916
commit 9ef4c8f421
3 changed files with 34 additions and 16 deletions

View file

@ -757,23 +757,43 @@ DSliceValue* DtoCatArrays(Loc& loc, Type* arrayType, Expression* exp1, Expressio
if (exp1->op == TOKcat)
{ // handle multiple concat
fn = LLVM_D_GetRuntimeFunction(loc, gIR->module, "_d_arraycatnT");
fn = LLVM_D_GetRuntimeFunction(loc, gIR->module, "_d_arraycatnTX");
args.push_back(DtoSlicePtr(toElem(exp2)));
// Create array of slices
std::vector<LLValue*> arrs;
arrs.push_back(DtoSlicePtr(toElem(exp2)));
CatExp *ce = static_cast<CatExp*>(exp1);
do
{
args.push_back(DtoSlicePtr(toElem(ce->e2)));
arrs.push_back(DtoSlicePtr(toElem(ce->e2)));
ce = static_cast<CatExp *>(ce->e1);
} while (ce->op == TOKcat);
args.push_back(DtoSlicePtr(toElem(ce)));
// uint n
args.push_back(DtoConstUint(args.size()));
arrs.push_back(DtoSlicePtr(toElem(ce)));
// Create static array from slices
LLPointerType* ptrarraytype = isaPointer(arrs[0]->getType());
assert(ptrarraytype && "Expected pointer type");
LLStructType* arraytype = isaStruct(ptrarraytype->getElementType());
assert(arraytype && "Expected struct type");
LLArrayType* type = LLArrayType::get(arraytype, arrs.size());
LLValue* array = DtoRawAlloca(type, 0, ".slicearray");
unsigned int i = 0;
for (std::vector<LLValue*>::iterator I = arrs.begin(), E = arrs.end(); I != E; ++I)
{
DtoStore(DtoLoad(*I), DtoGEPi(array, 0, i++, ".slice"));
}
LLStructType* type2 = DtoArrayType(arraytype);
LLValue* array2 = DtoRawAlloca(type2, 0, ".array");
DtoStore(DtoConstSize_t(arrs.size()), DtoGEPi(array2, 0, 0, ".len"));
DtoStore(DtoBitCast(array, ptrarraytype), DtoGEPi(array2, 0, 1, ".ptr"));
//LLValue* val = DtoLoad(array2);
LLValue* val = DtoBitCast(DtoLoad(array2), DtoArrayType(DtoArrayType(LLType::getInt8Ty(gIR->context()))));
// TypeInfo ti
args.push_back(DtoTypeInfoOf(arrayType));
std::reverse(args.begin(), args.end());
// byte[][] arrs
args.push_back(val);
}
else
{

View file

@ -136,9 +136,7 @@ void DtoDeleteArray(Loc& loc, DValue* arr)
llvm::AllocaInst* DtoAlloca(Type* type, const char* name)
{
LLType* lltype = i1ToI8(DtoType(type));
llvm::AllocaInst* ai = new llvm::AllocaInst(lltype, name, gIR->topallocapoint());
ai->setAlignment(type->alignsize());
return ai;
return DtoRawAlloca(lltype, type->alignsize(), name);
}
llvm::AllocaInst* DtoArrayAlloca(Type* type, unsigned arraysize, const char* name)

View file

@ -75,7 +75,7 @@ static void checkForImplicitGCCall(const Loc &loc, const char *name)
"_d_arrayappendcd",
"_d_arrayappendwd",
"_d_arraycatT",
"_d_arraycatnT",
"_d_arraycatnTX",
"_d_arraysetlengthT",
"_d_arraysetlengthiT",
"_d_assocarrayliteralTX",
@ -483,10 +483,10 @@ static void LLVM_D_BuildRuntimeModule()
LLFunctionType* fty = llvm::FunctionType::get(voidArrayTy, types, false);
llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M);
}
// byte[] _d_arraycatnT(TypeInfo ti, uint n, ...)
// void[] _d_arraycatnTX(const TypeInfo ti, byte[][] arrs)
{
llvm::StringRef fname("_d_arraycatnT");
LLType *types[] = { typeInfoTy };
llvm::StringRef fname("_d_arraycatnTX");
LLType *types[] = { typeInfoTy, rt_array(voidArrayTy) };
LLFunctionType* fty = llvm::FunctionType::get(voidArrayTy, types, true);
llvm::Function::Create(fty, llvm::GlobalValue::ExternalLinkage, fname, M);
}