comparison gen/toir.c @ 82:d8dd47ef3973 trunk

[svn r86] Changed the way arguments are given storage. It is now detected if they will need it during semantic passes. Initial support for debug information. Very limited, but MUCH better than nothing :)
author lindquist
date Fri, 02 Nov 2007 01:17:26 +0100
parents 3587401b6eeb
children 339422268de1
comparison
equal deleted inserted replaced
81:3587401b6eeb 82:d8dd47ef3973
166 if (!vd->llvmValue) { 166 if (!vd->llvmValue) {
167 // TODO: determine this properly 167 // TODO: determine this properly
168 // this happens when the DMD frontend generates by pointer wrappers for struct opEquals(S) and opCmp(S) 168 // this happens when the DMD frontend generates by pointer wrappers for struct opEquals(S) and opCmp(S)
169 vd->llvmValue = &p->func().func->getArgumentList().back(); 169 vd->llvmValue = &p->func().func->getArgumentList().back();
170 } 170 }
171 if (vd->isRef() || vd->isOut()) { 171 if (vd->isRef() || vd->isOut() || DtoIsPassedByRef(vd->type) || llvm::isa<llvm::AllocaInst>(vd->llvmValue)) {
172 e->mem = vd->llvmValue; 172 e->mem = vd->llvmValue;
173 e->type = elem::VAR; 173 e->type = elem::VAR;
174 } 174 e->vardecl = vd;
175 else { 175 }
176 if (DtoIsPassedByRef(vd->type)) { 176 else if (llvm::isa<llvm::Argument>(vd->llvmValue)) {
177 e->mem = vd->llvmValue; 177 e->val = vd->llvmValue;
178 e->type = elem::VAR; 178 e->type = elem::VAL;
179 } 179 e->vardecl = vd;
180 else { 180 }
181 if (llvm::isa<llvm::Argument>(vd->llvmValue)) { 181 else assert(0);
182 e->val = vd->llvmValue;
183 e->type = elem::VAL;
184 e->vardecl = vd;
185 }
186 else if (llvm::isa<llvm::AllocaInst>(vd->llvmValue)) {
187 e->mem = vd->llvmValue;
188 e->type = elem::VAR;
189 }
190 else
191 assert(0);
192 }
193 }
194 } 182 }
195 else { 183 else {
196 // take care of forward references of global variables 184 // take care of forward references of global variables
197 if (!vd->llvmTouched && vd->isDataseg()) 185 if (!vd->llvmTouched && vd->isDataseg())
198 vd->toObjFile(); 186 vd->toObjFile();
460 DtoResizeDynArray(l->mem, r->getValue()); 448 DtoResizeDynArray(l->mem, r->getValue());
461 delete r; 449 delete r;
462 delete l; 450 delete l;
463 return 0; 451 return 0;
464 } 452 }
465
466 // handle function argument - allocate temp storage for it :/ annoying
467 if (l->mem == 0) {
468 assert(l->val);
469 if (llvm::isa<llvm::Argument>(l->val))
470 DtoGiveArgumentStorage(l);
471 else {
472 Logger::cout() << "here it comes... " << *l->val << '\n';
473 assert(0);
474 }
475 }
476 //e->val = l->store(r->getValue());
477 453
478 Type* e1type = DtoDType(e1->type); 454 Type* e1type = DtoDType(e1->type);
479 Type* e2type = DtoDType(e2->type); 455 Type* e2type = DtoDType(e2->type);
480 TY e1ty = e1type->ty; 456 TY e1ty = e1type->ty;
481 TY e2ty = e2type->ty; 457 TY e2ty = e2type->ty;
687 if (llvm::isa<llvm::PointerType>(storeVal->getType()) && storeVal->getType()->getContainedType(0) != tmp->getType()) 663 if (llvm::isa<llvm::PointerType>(storeVal->getType()) && storeVal->getType()->getContainedType(0) != tmp->getType())
688 { 664 {
689 tmp = DtoPointedType(storeVal, tmp); 665 tmp = DtoPointedType(storeVal, tmp);
690 }*/ 666 }*/
691 667
692 if (l->mem == 0) 668 assert(l->mem);
693 DtoGiveArgumentStorage(l);
694 new llvm::StoreInst(val,l->mem,p->scopebb()); 669 new llvm::StoreInst(val,l->mem,p->scopebb());
695 e->type = elem::VAR; 670 e->type = elem::VAR;
696 671
697 delete l; 672 delete l;
698 delete r; 673 delete r;
760 if (storeVal->getType()->getContainedType(0) != tmp->getType()) 735 if (storeVal->getType()->getContainedType(0) != tmp->getType())
761 { 736 {
762 tmp = DtoPointedType(storeVal, tmp); 737 tmp = DtoPointedType(storeVal, tmp);
763 }*/ 738 }*/
764 739
765 if (l->mem == 0) 740 assert(l->mem);
766 DtoGiveArgumentStorage(l);
767 new llvm::StoreInst(tmp, l->mem, p->scopebb()); 741 new llvm::StoreInst(tmp, l->mem, p->scopebb());
768 742
769 delete l; 743 delete l;
770 delete r; 744 delete r;
771 745
812 if (storeVal->getType()->getContainedType(0) != tmp->getType()) 786 if (storeVal->getType()->getContainedType(0) != tmp->getType())
813 { 787 {
814 tmp = DtoPointedType(storeVal, tmp); 788 tmp = DtoPointedType(storeVal, tmp);
815 }*/ 789 }*/
816 790
817 if (l->mem == 0) 791 assert(l->mem);
818 DtoGiveArgumentStorage(l);
819 new llvm::StoreInst(tmp,l->mem,p->scopebb()); 792 new llvm::StoreInst(tmp,l->mem,p->scopebb());
820 793
821 delete l; 794 delete l;
822 delete r; 795 delete r;
823 796
879 if (storeVal->getType()->getContainedType(0) != tmp->getType()) 852 if (storeVal->getType()->getContainedType(0) != tmp->getType())
880 { 853 {
881 tmp = DtoPointedType(storeVal, tmp); 854 tmp = DtoPointedType(storeVal, tmp);
882 }*/ 855 }*/
883 856
884 if (l->mem == 0) 857 assert(l->mem);
885 DtoGiveArgumentStorage(l);
886 new llvm::StoreInst(tmp,l->mem,p->scopebb()); 858 new llvm::StoreInst(tmp,l->mem,p->scopebb());
887 859
888 delete l; 860 delete l;
889 delete r; 861 delete r;
890 862
946 if (storeVal->getType()->getContainedType(0) != tmp->getType()) 918 if (storeVal->getType()->getContainedType(0) != tmp->getType())
947 { 919 {
948 tmp = DtoPointedType(storeVal, tmp); 920 tmp = DtoPointedType(storeVal, tmp);
949 }*/ 921 }*/
950 922
951 if (l->mem == 0) 923 assert(l->mem);
952 DtoGiveArgumentStorage(l);
953 new llvm::StoreInst(tmp,l->mem,p->scopebb()); 924 new llvm::StoreInst(tmp,l->mem,p->scopebb());
954 925
955 delete l; 926 delete l;
956 delete r; 927 delete r;
957 928
1018 } 989 }
1019 else if (fn->funcdecl->llvmInternal == LLVMva_start) { 990 else if (fn->funcdecl->llvmInternal == LLVMva_start) {
1020 va_magic = true; 991 va_magic = true;
1021 } 992 }
1022 else if (fn->funcdecl->llvmInternal == LLVMva_arg) { 993 else if (fn->funcdecl->llvmInternal == LLVMva_arg) {
1023 Argument* fnarg = Argument::getNth(tf->parameters, 0); 994 //Argument* fnarg = Argument::getNth(tf->parameters, 0);
1024 Expression* exp = (Expression*)arguments->data[0]; 995 Expression* exp = (Expression*)arguments->data[0];
1025 elem* expelem = exp->toElem(p); 996 elem* expelem = exp->toElem(p);
1026 assert(expelem->mem); 997 assert(expelem->mem);
1027 elem* e = new elem; 998 elem* e = new elem;
1028 Type* t = DtoDType(type); 999 Type* t = DtoDType(type);
2156 } 2127 }
2157 } 2128 }
2158 else 2129 else
2159 assert(post); 2130 assert(post);
2160 2131
2161 if (l->mem == 0) 2132 assert(l->mem);
2162 DtoGiveArgumentStorage(l);
2163 new llvm::StoreInst(post,l->mem,p->scopebb()); 2133 new llvm::StoreInst(post,l->mem,p->scopebb());
2164 2134
2165 delete l; 2135 delete l;
2166 delete r; 2136 delete r;
2167 2137
2501 llvm::Value* uval = u->getValue(); \ 2471 llvm::Value* uval = u->getValue(); \
2502 assert(uval); \ 2472 assert(uval); \
2503 llvm::Value* vval = v->getValue(); \ 2473 llvm::Value* vval = v->getValue(); \
2504 assert(vval); \ 2474 assert(vval); \
2505 llvm::Value* tmp = llvm::BinaryOperator::create(llvm::Instruction::Y, uval, vval, "tmp", p->scopebb()); \ 2475 llvm::Value* tmp = llvm::BinaryOperator::create(llvm::Instruction::Y, uval, vval, "tmp", p->scopebb()); \
2506 if (u->mem == 0) \ 2476 assert(u->mem); \
2507 DtoGiveArgumentStorage(u); \
2508 Logger::cout() << *tmp << '|' << *u->mem << '\n'; \ 2477 Logger::cout() << *tmp << '|' << *u->mem << '\n'; \
2509 new llvm::StoreInst(DtoPointedType(u->mem, tmp), u->mem, p->scopebb()); \ 2478 new llvm::StoreInst(DtoPointedType(u->mem, tmp), u->mem, p->scopebb()); \
2510 delete u; \ 2479 delete u; \
2511 delete v; \ 2480 delete v; \
2512 elem* e = new elem; \ 2481 elem* e = new elem; \