comparison 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
comparison
equal deleted inserted replaced
51:61bc1b4ad3c4 52:0c77619e803b
478 return new llvm::CallInst(fn, args.begin(), args.end(), "tmp", gIR->scopebb()); 478 return new llvm::CallInst(fn, args.begin(), args.end(), "tmp", gIR->scopebb());
479 } 479 }
480 480
481 ////////////////////////////////////////////////////////////////////////////////////////// 481 //////////////////////////////////////////////////////////////////////////////////////////
482 482
483 llvm::Value* LLVM_DtoDynArrayCompare(TOK op, llvm::Value* l, llvm::Value* r)
484 {
485 const char* fname;
486 if (op == TOKequal)
487 fname = "_d_dyn_array_eq";
488 else if (op == TOKnotequal)
489 fname = "_d_dyn_array_neq";
490 else
491 assert(0);
492 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, fname);
493 assert(fn);
494
495 Logger::cout() << "lhsType:" << *l->getType() << "\nrhsType:" << *r->getType() << '\n';
496 assert(l->getType() == r->getType());
497 assert(llvm::isa<llvm::PointerType>(l->getType()));
498 const llvm::Type* arrty = l->getType()->getContainedType(0);
499 assert(llvm::isa<llvm::StructType>(arrty));
500 const llvm::StructType* structType = llvm::cast<llvm::StructType>(arrty);
501 const llvm::Type* elemType = structType->getElementType(1)->getContainedType(0);
502
503 std::vector<const llvm::Type*> arrTypes;
504 arrTypes.push_back(LLVM_DtoSize_t());
505 arrTypes.push_back(llvm::PointerType::get(llvm::Type::Int8Ty));
506 const llvm::StructType* arrType = llvm::StructType::get(arrTypes);
507
508 llvm::Value* llmem = l;
509 llvm::Value* rrmem = r;
510
511 if (arrty != arrType) {
512 llmem= new llvm::AllocaInst(arrType,"tmparr",gIR->topallocapoint());
513
514 llvm::Value* ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,0, "tmp"),"tmp");
515 ll = LLVM_DtoArrayCastLength(ll, elemType, llvm::Type::Int8Ty);
516 llvm::Value* lllen = LLVM_DtoGEPi(llmem, 0,0, "tmp");
517 gIR->ir->CreateStore(ll,lllen);
518
519 ll = gIR->ir->CreateLoad(LLVM_DtoGEPi(l, 0,1, "tmp"),"tmp");
520 ll = new llvm::BitCastInst(ll, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp", gIR->scopebb());
521 llvm::Value* llptr = LLVM_DtoGEPi(llmem, 0,1, "tmp");
522 gIR->ir->CreateStore(ll,llptr);
523
524 rrmem = new llvm::AllocaInst(arrType,"tmparr",gIR->topallocapoint());
525
526 llvm::Value* rr = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,0, "tmp"),"tmp");
527 rr = LLVM_DtoArrayCastLength(rr, elemType, llvm::Type::Int8Ty);
528 llvm::Value* rrlen = LLVM_DtoGEPi(rrmem, 0,0, "tmp");
529 gIR->ir->CreateStore(rr,rrlen);
530
531 rr = gIR->ir->CreateLoad(LLVM_DtoGEPi(r, 0,1, "tmp"),"tmp");
532 rr = new llvm::BitCastInst(rr, llvm::PointerType::get(llvm::Type::Int8Ty), "tmp", gIR->scopebb());
533 llvm::Value* rrptr = LLVM_DtoGEPi(rrmem, 0,1, "tmp");
534 gIR->ir->CreateStore(rr,rrptr);
535 }
536
537 std::vector<llvm::Value*> args;
538 args.push_back(llmem);
539 args.push_back(rrmem);
540 return new llvm::CallInst(fn, args.begin(), args.end(), "tmp", gIR->scopebb());
541 }
542
543 //////////////////////////////////////////////////////////////////////////////////////////
544 llvm::Value* LLVM_DtoArrayCastLength(llvm::Value* len, const llvm::Type* elemty, const llvm::Type* newelemty)
545 {
546 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_array_cast_len");
547 assert(fn);
548 std::vector<llvm::Value*> args;
549 args.push_back(len);
550 args.push_back(llvm::ConstantInt::get(LLVM_DtoSize_t(), gTargetData->getTypeSize(elemty), false));
551 args.push_back(llvm::ConstantInt::get(LLVM_DtoSize_t(), gTargetData->getTypeSize(newelemty), false));
552 return new llvm::CallInst(fn, args.begin(), args.end(), "tmp", gIR->scopebb());
553 }