Mercurial > projects > ldc
comparison gen/statements.cpp @ 96:ce7ed8f59b99 trunk
[svn r100] Moved test/ray.d to demos/ray.d.
Cleanups.
author | lindquist |
---|---|
date | Mon, 12 Nov 2007 07:58:44 +0100 |
parents | 61615fa85940 |
children | 6789050b5ad1 |
comparison
equal
deleted
inserted
replaced
95:71b8fecdae38 | 96:ce7ed8f59b99 |
---|---|
8 | 8 |
9 #include "gen/llvm.h" | 9 #include "gen/llvm.h" |
10 | 10 |
11 #include "total.h" | 11 #include "total.h" |
12 #include "init.h" | 12 #include "init.h" |
13 #include "symbol.h" | |
14 #include "mtype.h" | 13 #include "mtype.h" |
15 #include "hdrgen.h" | 14 #include "hdrgen.h" |
16 #include "port.h" | 15 #include "port.h" |
17 | 16 |
18 #include "gen/irstate.h" | 17 #include "gen/irstate.h" |
19 #include "gen/elem.h" | |
20 #include "gen/logger.h" | 18 #include "gen/logger.h" |
21 #include "gen/tollvm.h" | 19 #include "gen/tollvm.h" |
22 #include "gen/runtime.h" | 20 #include "gen/runtime.h" |
23 #include "gen/arrays.h" | 21 #include "gen/arrays.h" |
24 #include "gen/todebug.h" | 22 #include "gen/todebug.h" |
537 CaseStatement* cs = (CaseStatement*)cases->data[i]; | 535 CaseStatement* cs = (CaseStatement*)cases->data[i]; |
538 | 536 |
539 // get the case value | 537 // get the case value |
540 DValue* e = cs->exp->toElem(p); | 538 DValue* e = cs->exp->toElem(p); |
541 DConstValue* ce = e->isConst(); | 539 DConstValue* ce = e->isConst(); |
542 assert(ce && llvm::isa<llvm::ConstantInt>(ce->c)); | 540 assert(ce); |
543 llvm::ConstantInt* ec = llvm::cast<llvm::ConstantInt>(ce->c); | 541 llvm::ConstantInt* ec = isaConstantInt(ce->c); |
542 assert(ec); | |
544 delete e; | 543 delete e; |
545 | 544 |
546 // create the case bb with a nice label | 545 // create the case bb with a nice label |
547 std::string lblname("case"+std::string(cs->exp->toChars())); | 546 std::string lblname("case"+std::string(cs->exp->toChars())); |
548 llvm::BasicBlock* bb = new llvm::BasicBlock(lblname, p->topfunc(), oldend); | 547 llvm::BasicBlock* bb = new llvm::BasicBlock(lblname, p->topfunc(), oldend); |
673 // static array | 672 // static array |
674 if (aggrtype->ty == Tsarray) | 673 if (aggrtype->ty == Tsarray) |
675 { | 674 { |
676 Logger::println("foreach over static array"); | 675 Logger::println("foreach over static array"); |
677 val = aggrval->getRVal(); | 676 val = aggrval->getRVal(); |
678 assert(llvm::isa<llvm::PointerType>(val->getType())); | 677 assert(isaPointer(val->getType())); |
679 assert(llvm::isa<llvm::ArrayType>(val->getType()->getContainedType(0))); | 678 const llvm::ArrayType* arrty = isaArray(val->getType()->getContainedType(0)); |
680 size_t nelems = llvm::cast<llvm::ArrayType>(val->getType()->getContainedType(0))->getNumElements(); | 679 assert(arrty); |
680 size_t nelems = arrty->getNumElements(); | |
681 assert(nelems > 0); | 681 assert(nelems > 0); |
682 niters = llvm::ConstantInt::get(keytype,nelems,false); | 682 niters = llvm::ConstantInt::get(keytype,nelems,false); |
683 } | 683 } |
684 // dynamic array | 684 // dynamic array |
685 else if (aggrtype->ty == Tarray) | 685 else if (aggrtype->ty == Tarray) |
686 { | 686 { |
687 if (DSliceValue* slice = aggrval->isSlice()) { | 687 if (DSliceValue* slice = aggrval->isSlice()) { |
688 Logger::println("foreach over slice"); | 688 Logger::println("foreach over slice"); |
689 niters = slice->len; | 689 niters = slice->len; |
690 assert(niters); | 690 assert(niters); |
691 if (llvm::isa<llvm::ConstantInt>(niters)) { | |
692 llvm::ConstantInt* ci = llvm::cast<llvm::ConstantInt>(niters); | |
693 Logger::println("const num iters: %u", ci); | |
694 } | |
695 else { | |
696 Logger::cout() << "numiters: " << *niters <<'\n'; | |
697 } | |
698 val = slice->ptr; | 691 val = slice->ptr; |
699 assert(val); | 692 assert(val); |
700 } | 693 } |
701 else { | 694 else { |
702 Logger::println("foreach over dynamic array"); | 695 Logger::println("foreach over dynamic array"); |