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