Mercurial > projects > ldc
comparison gen/statements.cpp @ 308:6b62e8cdf970 trunk
[svn r329] Cleaned up a bunch of array code for handling special slice cases no
longer relevant.
author | lindquist |
---|---|
date | Sat, 28 Jun 2008 05:57:16 +0200 |
parents | 2b72433d5c8c |
children | d59c363fccad |
comparison
equal
deleted
inserted
replaced
307:7ade5e035beb | 308:6b62e8cdf970 |
---|---|
910 // what to iterate | 910 // what to iterate |
911 DValue* aggrval = aggr->toElem(p); | 911 DValue* aggrval = aggr->toElem(p); |
912 Type* aggrtype = DtoDType(aggr->type); | 912 Type* aggrtype = DtoDType(aggr->type); |
913 | 913 |
914 // get length and pointer | 914 // get length and pointer |
915 LLValue* val = 0; | 915 LLValue* niters = DtoArrayLen(aggrval); |
916 LLValue* niters = 0; | 916 LLValue* val = DtoArrayPtr(aggrval); |
917 | |
918 // static array | |
919 if (aggrtype->ty == Tsarray) | |
920 { | |
921 Logger::println("foreach over static array"); | |
922 val = aggrval->getRVal(); | |
923 assert(isaPointer(val->getType())); | |
924 const llvm::ArrayType* arrty = isaArray(val->getType()->getContainedType(0)); | |
925 assert(arrty); | |
926 size_t nelems = arrty->getNumElements(); | |
927 if(nelems == 0) | |
928 return; | |
929 niters = llvm::ConstantInt::get(keytype,nelems,false); | |
930 } | |
931 // dynamic array | |
932 else if (aggrtype->ty == Tarray) | |
933 { | |
934 if (DSliceValue* slice = aggrval->isSlice()) { | |
935 Logger::println("foreach over slice"); | |
936 niters = slice->len; | |
937 assert(niters); | |
938 val = slice->ptr; | |
939 assert(val); | |
940 } | |
941 else { | |
942 Logger::println("foreach over dynamic array"); | |
943 val = aggrval->getRVal(); | |
944 niters = DtoGEPi(val,0,0); | |
945 niters = DtoLoad(niters, "numiterations"); | |
946 val = DtoGEPi(val,0,1); | |
947 val = DtoLoad(val, "collection"); | |
948 } | |
949 } | |
950 else | |
951 { | |
952 assert(0 && "aggregate type is not Tarray or Tsarray"); | |
953 } | |
954 | 917 |
955 if (niters->getType() != keytype) | 918 if (niters->getType() != keytype) |
956 { | 919 { |
957 size_t sz1 = getTypeBitSize(niters->getType()); | 920 size_t sz1 = getTypeBitSize(niters->getType()); |
958 size_t sz2 = getTypeBitSize(keytype); | 921 size_t sz2 = getTypeBitSize(keytype); |
999 p->scope() = IRScope(bodybb,nextbb); | 962 p->scope() = IRScope(bodybb,nextbb); |
1000 | 963 |
1001 // get value for this iteration | 964 // get value for this iteration |
1002 LLConstant* zero = llvm::ConstantInt::get(keytype,0,false); | 965 LLConstant* zero = llvm::ConstantInt::get(keytype,0,false); |
1003 LLValue* loadedKey = p->ir->CreateLoad(keyvar,"tmp"); | 966 LLValue* loadedKey = p->ir->CreateLoad(keyvar,"tmp"); |
1004 if (aggrtype->ty == Tsarray) | 967 value->ir.irLocal->value = DtoGEP1(val,loadedKey); |
1005 value->ir.irLocal->value = DtoGEP(val,zero,loadedKey,"tmp"); | |
1006 else if (aggrtype->ty == Tarray) | |
1007 value->ir.irLocal->value = llvm::GetElementPtrInst::Create(val,loadedKey,"tmp",p->scopebb()); | |
1008 | 968 |
1009 if (!value->isRef() && !value->isOut()) { | 969 if (!value->isRef() && !value->isOut()) { |
1010 DValue* dst = new DVarValue(value->type, valvar, true); | 970 DValue* dst = new DVarValue(value->type, valvar, true); |
1011 DValue* src = new DVarValue(value->type, value->ir.irLocal->value, true); | 971 DValue* src = new DVarValue(value->type, value->ir.irLocal->value, true); |
1012 DtoAssign(dst, src); | 972 DtoAssign(dst, src); |