Mercurial > projects > ldc
diff gen/arrays.c @ 52:0c77619e803b trunk
[svn r56] Initial support for TypeInfo.
Enums not work.
Several other bugfixes.
author | lindquist |
---|---|
date | Tue, 23 Oct 2007 05:55:12 +0200 |
parents | 61bc1b4ad3c4 |
children | 28e99b04a132 |
line wrap: on
line diff
--- a/gen/arrays.c Mon Oct 22 17:25:44 2007 +0200 +++ b/gen/arrays.c Tue Oct 23 05:55:12 2007 +0200 @@ -480,3 +480,74 @@ ////////////////////////////////////////////////////////////////////////////////////////// +llvm::Value* LLVM_DtoDynArrayCompare(TOK op, llvm::Value* l, llvm::Value* r) +{ + const char* fname; + if (op == TOKequal) + fname = "_d_dyn_array_eq"; + else if (op == TOKnotequal) + fname = "_d_dyn_array_neq"; + else + assert(0); + llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname); + assert(fn); + + Logger::cout() << "lhsType:" << *l->getType() << "\nrhsType:" << *r->getType() << '\n'; + assert(l->getType() == r->getType()); + assert(llvm::isa<llvm::PointerType>(l->getType())); + const llvm::Type* arrty = l->getType()->getContainedType(0); + assert(llvm::isa<llvm::StructType>(arrty)); + const llvm::StructType* structType = llvm::cast<llvm::StructType>(arrty); + const llvm::Type* elemType = structType->getElementType(1)->getContainedType(0); + + std::vector<const llvm::Type*> arrTypes; + arrTypes.push_back(LLVM_DtoSize_t()); + arrTypes.push_back(llvm::PointerType::get(llvm::Type::Int8Ty)); + const llvm::StructType* arrType = llvm::StructType::get(arrTypes); + + llvm::Value* llmem = l; + llvm::Value* rrmem = r; + + if (arrty != arrType) { + llmem= new llvm::AllocaInst(arrType,"tmparr",gIR->topallocapoint()); + + llvm::Value* ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,0, "tmp"),"tmp"); + ll = LLVM_DtoArrayCastLength(ll, elemType, llvm::Type::Int8Ty); + llvm::Value* lllen = LLVM_DtoGEPi(llmem, 0,0, "tmp"); + gIR->ir->CreateStore(ll,lllen); + + ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,1, "tmp"),"tmp"); + ll = new llvm::BitCastInst(ll, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp", gIR->scopebb()); + llvm::Value* llptr = LLVM_DtoGEPi(llmem, 0,1, "tmp"); + gIR->ir->CreateStore(ll,llptr); + + rrmem = new llvm::AllocaInst(arrType,"tmparr",gIR->topallocapoint()); + + llvm::Value* rr = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,0, "tmp"),"tmp"); + rr = LLVM_DtoArrayCastLength(rr, elemType, llvm::Type::Int8Ty); + llvm::Value* rrlen = LLVM_DtoGEPi(rrmem, 0,0, "tmp"); + gIR->ir->CreateStore(rr,rrlen); + + rr = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,1, "tmp"),"tmp"); + rr = new llvm::BitCastInst(rr, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp", gIR->scopebb()); + llvm::Value* rrptr = LLVM_DtoGEPi(rrmem, 0,1, "tmp"); + gIR->ir->CreateStore(rr,rrptr); + } + + std::vector<llvm::Value*> args; + args.push_back(llmem); + args.push_back(rrmem); + return new llvm::CallInst(fn, args.begin(), args.end(), "tmp", gIR->scopebb()); +} + +////////////////////////////////////////////////////////////////////////////////////////// +llvm::Value* LLVM_DtoArrayCastLength(llvm::Value* len, const llvm::Type* elemty, const llvm::Type* newelemty) +{ + llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_array_cast_len"); + assert(fn); + std::vector<llvm::Value*> args; + args.push_back(len); + args.push_back(llvm::ConstantInt::get(LLVM_DtoSize_t(), gTargetData->getTypeSize(elemty), false)); + args.push_back(llvm::ConstantInt::get(LLVM_DtoSize_t(), gTargetData->getTypeSize(newelemty), false)); + return new llvm::CallInst(fn, args.begin(), args.end(), "tmp", gIR->scopebb()); +}