Mercurial > projects > ldc
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; \ |