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");