comparison gen/arrays.cpp @ 94:61615fa85940 trunk

[svn r98] Added support for std.c.stdlib.alloca via pragma(LLVM_internal, "alloca"). Added support for array .sort and .reverse properties. Fixed some bugs with pointer arithmetic. Disabled some DMD AST optimizations that was messing things up, destroying valuable information. Added a KDevelop project file, this is what I use for coding LLVMDC now :) Other minor stuff.
author lindquist
date Mon, 12 Nov 2007 06:32:46 +0100
parents 058d3925950e
children ce7ed8f59b99
comparison
equal deleted inserted replaced
93:08508eebbb3e 94:61615fa85940
19 { 19 {
20 assert(t->next); 20 assert(t->next);
21 const llvm::Type* at = DtoType(t->next); 21 const llvm::Type* at = DtoType(t->next);
22 const llvm::Type* arrty; 22 const llvm::Type* arrty;
23 23
24 /*if (t->ty == Tsarray) {
25 TypeSArray* tsa = (TypeSArray*)t;
26 assert(tsa->dim->type->isintegral());
27 arrty = llvm::ArrayType::get(at,tsa->dim->toUInteger());
28 }
29 else {
30 arrty = llvm::ArrayType::get(at,0);
31 }*/
32 if (at == llvm::Type::VoidTy) { 24 if (at == llvm::Type::VoidTy) {
33 at = llvm::Type::Int8Ty; 25 at = llvm::Type::Int8Ty;
34 } 26 }
35 arrty = llvm::PointerType::get(at); 27 arrty = llvm::PointerType::get(at);
36 28
646 } 638 }
647 639
648 ////////////////////////////////////////////////////////////////////////////////////////// 640 //////////////////////////////////////////////////////////////////////////////////////////
649 llvm::Value* DtoArrayCastLength(llvm::Value* len, const llvm::Type* elemty, const llvm::Type* newelemty) 641 llvm::Value* DtoArrayCastLength(llvm::Value* len, const llvm::Type* elemty, const llvm::Type* newelemty)
650 { 642 {
651 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_array_cast_len"); 643 size_t esz = gTargetData->getTypeSize(elemty);
652 assert(fn); 644 size_t nsz = gTargetData->getTypeSize(newelemty);
645 if (esz == nsz)
646 return len;
647
653 std::vector<llvm::Value*> args; 648 std::vector<llvm::Value*> args;
654 args.push_back(len); 649 args.push_back(len);
655 args.push_back(llvm::ConstantInt::get(DtoSize_t(), gTargetData->getTypeSize(elemty), false)); 650 args.push_back(llvm::ConstantInt::get(DtoSize_t(), esz, false));
656 args.push_back(llvm::ConstantInt::get(DtoSize_t(), gTargetData->getTypeSize(newelemty), false)); 651 args.push_back(llvm::ConstantInt::get(DtoSize_t(), nsz, false));
652
653 llvm::Function* fn = LLVM_D_GetRuntimeFunction(gIR->module, "_d_array_cast_len");
657 return new llvm::CallInst(fn, args.begin(), args.end(), "tmp", gIR->scopebb()); 654 return new llvm::CallInst(fn, args.begin(), args.end(), "tmp", gIR->scopebb());
658 } 655 }
659 656
660 ////////////////////////////////////////////////////////////////////////////////////////// 657 //////////////////////////////////////////////////////////////////////////////////////////
661 llvm::Value* DtoDynArrayIs(TOK op, llvm::Value* l, llvm::Value* r) 658 llvm::Value* DtoDynArrayIs(TOK op, llvm::Value* l, llvm::Value* r)
720 return DtoArrayLen(next); 717 return DtoArrayLen(next);
721 } 718 }
722 return DtoLoad(DtoGEPi(v->getRVal(), 0,0, "tmp")); 719 return DtoLoad(DtoGEPi(v->getRVal(), 0,0, "tmp"));
723 } 720 }
724 else if (t->ty == Tsarray) { 721 else if (t->ty == Tsarray) {
725 const llvm::ArrayType* t = llvm::cast<llvm::ArrayType>(v->getLVal()->getType()); 722 llvm::Value* rv = v->getRVal();
723 Logger::cout() << "casting: " << *rv << '\n';
724 const llvm::ArrayType* t = llvm::cast<llvm::ArrayType>(rv->getType()->getContainedType(0));
726 return DtoConstSize_t(t->getNumElements()); 725 return DtoConstSize_t(t->getNumElements());
727 } 726 }
728 assert(0); 727 assert(0);
729 return 0; 728 return 0;
730 } 729 }