Mercurial > projects > ldc
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 } |