Mercurial > projects > ldc
diff gen/arrays.c @ 40:8b0e809563df trunk
[svn r44] Lots of bug fixes.
New array literal support
New array ~= operator support (for single element)
New with statement support
More...
author | lindquist |
---|---|
date | Fri, 19 Oct 2007 07:43:21 +0200 |
parents | 77cdca8c210f |
children | eb7bf7b7972e |
line wrap: on
line diff
--- a/gen/arrays.c Wed Oct 10 06:21:31 2007 +0200 +++ b/gen/arrays.c Fri Oct 19 07:43:21 2007 +0200 @@ -1,8 +1,4 @@ -#include "llvm/Constants.h" -#include "llvm/Type.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Instructions.h" -#include "llvm/CallingConv.h" +#include "gen/llvm.h" #include "mtype.h" #include "dsymbol.h" @@ -218,16 +214,17 @@ } ////////////////////////////////////////////////////////////////////////////////////////// -llvm::Constant* LLVM_DtoArrayInitializer(ArrayInitializer* arrinit) +llvm::Constant* LLVM_DtoConstArrayInitializer(ArrayInitializer* arrinit) { Logger::println("arr init begin"); - assert(arrinit->type->ty == Tsarray); - TypeSArray* t = (TypeSArray*)arrinit->type; + Type* arrinittype = LLVM_DtoDType(arrinit->type); + assert(arrinittype->ty == Tsarray); + TypeSArray* t = (TypeSArray*)arrinittype; integer_t tdim = t->dim->toInteger(); std::vector<llvm::Constant*> inits(tdim, 0); - const llvm::Type* elemty = LLVM_DtoType(arrinit->type->next); + const llvm::Type* elemty = LLVM_DtoType(arrinittype->next); assert(arrinit->index.dim == arrinit->value.dim); for (int i=0,j=0; i < tdim; ++i) @@ -255,23 +252,19 @@ if (!init) { - elem* e = t->next->defaultInit()->toElem(gIR); - v = llvm::cast<llvm::Constant>(e->val); - delete e; + v = t->next->defaultInit()->toConstElem(gIR); } else if (ExpInitializer* ex = init->isExpInitializer()) { - elem* e = ex->exp->toElem(gIR); - v = llvm::cast<llvm::Constant>(e->val); - delete e; + v = ex->exp->toConstElem(gIR); } else if (StructInitializer* si = init->isStructInitializer()) { - v = LLVM_DtoStructInitializer(si); + v = LLVM_DtoConstStructInitializer(si); } else if (ArrayInitializer* ai = init->isArrayInitializer()) { - v = LLVM_DtoArrayInitializer(ai); + v = LLVM_DtoConstArrayInitializer(ai); } else if (init->isVoidInitializer()) { @@ -415,3 +408,61 @@ new llvm::StoreInst(sz,len,gIR->scopebb()); } +////////////////////////////////////////////////////////////////////////////////////////// +void LLVM_DtoCatArrayElement(llvm::Value* arr, Expression* exp) +{ + llvm::Value* ptr = LLVM_DtoGEPi(arr, 0, 0, "tmp", gIR->scopebb()); + llvm::Value* idx = new llvm::LoadInst(ptr, "tmp", gIR->scopebb()); + llvm::Value* one = llvm::ConstantInt::get(idx->getType(),1,false); + llvm::Value* len = llvm::BinaryOperator::createAdd(idx, one, "tmp", gIR->scopebb()); + LLVM_DtoResizeDynArray(arr,len); + + ptr = LLVM_DtoGEPi(arr, 0, 1, "tmp", gIR->scopebb()); + ptr = new llvm::LoadInst(ptr, "tmp", gIR->scopebb()); + ptr = new llvm::GetElementPtrInst(ptr, idx, "tmp", gIR->scopebb()); + + elem* e = exp->toElem(gIR); + Type* et = LLVM_DtoDType(exp->type); + + if (et->ty == Tstruct) { + TypeStruct* ts = (TypeStruct*)et; + LLVM_DtoStructCopy(ts,ptr,e->getValue()); + } + else { + llvm::Value* val = e->getValue(); + Logger::cout() << "ptr = '" << *ptr << "' element = '" << *val << "'\n"; + new llvm::StoreInst(val, ptr, gIR->scopebb()); + } +} + +////////////////////////////////////////////////////////////////////////////////////////// +llvm::Value* LLVM_DtoStaticArrayCompare(TOK op, llvm::Value* l, llvm::Value* r) +{ + const char* fname; + if (op == TOKequal) + fname = "_d_static_array_eq"; + else if (op == TOKnotequal) + fname = "_d_static_array_neq"; + else + assert(0); + llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname); + assert(fn); + + assert(l->getType() == r->getType()); + assert(llvm::isa<llvm::PointerType>(l->getType())); + const llvm::Type* arrty = l->getType()->getContainedType(0); + assert(llvm::isa<llvm::ArrayType>(arrty)); + + llvm::Value* ll = new llvm::BitCastInst(l, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp", gIR->scopebb()); + llvm::Value* rr = new llvm::BitCastInst(r, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp", gIR->scopebb()); + llvm::Value* n = llvm::ConstantInt::get(LLVM_DtoSize_t(),gTargetData->getTypeSize(arrty),false); + + std::vector<llvm::Value*> args; + args.push_back(ll); + args.push_back(rr); + args.push_back(n); + return new llvm::CallInst(fn, args.begin(), args.end(), "tmp", gIR->scopebb()); +} + +////////////////////////////////////////////////////////////////////////////////////////// +