comparison gen/toir.c @ 29:253a5fc4033a trunk

[svn r33] * Added support for assignment to function arguments
author lindquist
date Thu, 04 Oct 2007 13:45:22 +0200
parents 1c80c18f3c82
children 881158a93592
comparison
equal deleted inserted replaced
28:1c80c18f3c82 29:253a5fc4033a
135 if (vd->type->ty == Tstruct || vd->type->ty == Tdelegate || vd->type->ty == Tarray) { 135 if (vd->type->ty == Tstruct || vd->type->ty == Tdelegate || vd->type->ty == Tarray) {
136 e->mem = vd->llvmValue; 136 e->mem = vd->llvmValue;
137 e->type = elem::VAR; 137 e->type = elem::VAR;
138 } 138 }
139 else { 139 else {
140 e->val = vd->llvmValue; 140 if (llvm::isa<llvm::Argument>(vd->llvmValue)) {
141 e->type = elem::VAL; 141 e->val = vd->llvmValue;
142 e->type = elem::VAL;
143 e->vardecl = vd;
144 }
145 else if (llvm::isa<llvm::AllocaInst>(vd->llvmValue)) {
146 e->mem = vd->llvmValue;
147 e->type = elem::VAR;
148 }
149 else
150 assert(0);
142 } 151 }
143 } 152 }
144 } 153 }
145 else { 154 else {
146 e->mem = vd->llvmValue; 155 e->mem = vd->llvmValue;
320 329
321 p->lvals.push_back(l->mem); 330 p->lvals.push_back(l->mem);
322 elem* r = e2->toElem(p); 331 elem* r = e2->toElem(p);
323 p->lvals.pop_back(); 332 p->lvals.pop_back();
324 333
325 assert(l->mem); 334 // handle function argument - allocate temp storage for it :/ annoying
335 if (l->mem == 0) {
336 LLVM_DtoGiveArgumentStorage(l);
337 }
326 //e->val = l->store(r->getValue()); 338 //e->val = l->store(r->getValue());
327 339
328 TY e1ty = e1->type->ty; 340 TY e1ty = e1->type->ty;
329 TY e2ty = e2->type->ty; 341 TY e2ty = e2->type->ty;
330 342
514 if (llvm::isa<llvm::PointerType>(storeVal->getType()) && storeVal->getType()->getContainedType(0) != tmp->getType()) 526 if (llvm::isa<llvm::PointerType>(storeVal->getType()) && storeVal->getType()->getContainedType(0) != tmp->getType())
515 { 527 {
516 tmp = LLVM_DtoPointedType(storeVal, tmp); 528 tmp = LLVM_DtoPointedType(storeVal, tmp);
517 }*/ 529 }*/
518 530
531 if (l->mem == 0)
532 LLVM_DtoGiveArgumentStorage(l);
519 new llvm::StoreInst(val,l->mem,p->scopebb()); 533 new llvm::StoreInst(val,l->mem,p->scopebb());
520 e->type = elem::VAR; 534 e->type = elem::VAR;
521 535
522 delete l; 536 delete l;
523 delete r; 537 delete r;
583 if (storeVal->getType()->getContainedType(0) != tmp->getType()) 597 if (storeVal->getType()->getContainedType(0) != tmp->getType())
584 { 598 {
585 tmp = LLVM_DtoPointedType(storeVal, tmp); 599 tmp = LLVM_DtoPointedType(storeVal, tmp);
586 }*/ 600 }*/
587 601
602 if (l->mem == 0)
603 LLVM_DtoGiveArgumentStorage(l);
588 new llvm::StoreInst(tmp, l->mem, p->scopebb()); 604 new llvm::StoreInst(tmp, l->mem, p->scopebb());
589 605
590 delete l; 606 delete l;
591 delete r; 607 delete r;
592 608
633 if (storeVal->getType()->getContainedType(0) != tmp->getType()) 649 if (storeVal->getType()->getContainedType(0) != tmp->getType())
634 { 650 {
635 tmp = LLVM_DtoPointedType(storeVal, tmp); 651 tmp = LLVM_DtoPointedType(storeVal, tmp);
636 }*/ 652 }*/
637 653
654 if (l->mem == 0)
655 LLVM_DtoGiveArgumentStorage(l);
638 new llvm::StoreInst(tmp,l->mem,p->scopebb()); 656 new llvm::StoreInst(tmp,l->mem,p->scopebb());
639 657
640 delete l; 658 delete l;
641 delete r; 659 delete r;
642 660
694 if (storeVal->getType()->getContainedType(0) != tmp->getType()) 712 if (storeVal->getType()->getContainedType(0) != tmp->getType())
695 { 713 {
696 tmp = LLVM_DtoPointedType(storeVal, tmp); 714 tmp = LLVM_DtoPointedType(storeVal, tmp);
697 }*/ 715 }*/
698 716
717 if (l->mem == 0)
718 LLVM_DtoGiveArgumentStorage(l);
699 new llvm::StoreInst(tmp,l->mem,p->scopebb()); 719 new llvm::StoreInst(tmp,l->mem,p->scopebb());
700 720
701 delete l; 721 delete l;
702 delete r; 722 delete r;
703 723
755 if (storeVal->getType()->getContainedType(0) != tmp->getType()) 775 if (storeVal->getType()->getContainedType(0) != tmp->getType())
756 { 776 {
757 tmp = LLVM_DtoPointedType(storeVal, tmp); 777 tmp = LLVM_DtoPointedType(storeVal, tmp);
758 }*/ 778 }*/
759 779
780 if (l->mem == 0)
781 LLVM_DtoGiveArgumentStorage(l);
760 new llvm::StoreInst(tmp,l->mem,p->scopebb()); 782 new llvm::StoreInst(tmp,l->mem,p->scopebb());
761 783
762 delete l; 784 delete l;
763 delete r; 785 delete r;
764 786
2077 LOG_SCOPE; \ 2099 LOG_SCOPE; \
2078 elem* u = e1->toElem(p); \ 2100 elem* u = e1->toElem(p); \
2079 elem* v = e2->toElem(p); \ 2101 elem* v = e2->toElem(p); \
2080 llvm::Value* tmp = llvm::BinaryOperator::create(llvm::Instruction::Y, u->getValue(), v->getValue(), "tmp", p->scopebb()); \ 2102 llvm::Value* tmp = llvm::BinaryOperator::create(llvm::Instruction::Y, u->getValue(), v->getValue(), "tmp", p->scopebb()); \
2081 Logger::cout() << *tmp << '|' << *u->mem << '\n'; \ 2103 Logger::cout() << *tmp << '|' << *u->mem << '\n'; \
2104 if (u->mem == 0) \
2105 LLVM_DtoGiveArgumentStorage(u); \
2082 new llvm::StoreInst(LLVM_DtoPointedType(u->mem, tmp), u->mem, p->scopebb()); \ 2106 new llvm::StoreInst(LLVM_DtoPointedType(u->mem, tmp), u->mem, p->scopebb()); \
2083 delete u; \ 2107 delete u; \
2084 delete v; \ 2108 delete v; \
2085 elem* e = new elem; \ 2109 elem* e = new elem; \
2086 e->mem = u->mem; \ 2110 e->mem = u->mem; \