comparison gen/toir.c @ 72:d7e764e62462 trunk

[svn r76] Fixed: TypeInfo for structs. Fixed: PostExp was unable to allocate storage for parameters. Fixed: Many types of functions and delegates were broken. Misc cleanups.
author lindquist
date Mon, 29 Oct 2007 03:28:12 +0100
parents fb265a6efea1
children b706170e24a9
comparison
equal deleted inserted replaced
71:53d3086b5ad3 72:d7e764e62462
114 Logger::println("VarDeclaration %s", vd->toChars()); 114 Logger::println("VarDeclaration %s", vd->toChars());
115 115
116 // _arguments 116 // _arguments
117 if (vd->ident == Id::_arguments) 117 if (vd->ident == Id::_arguments)
118 { 118 {
119 Logger::println("Id::_arguments");
119 vd->llvmValue = p->func().decl->llvmArguments; 120 vd->llvmValue = p->func().decl->llvmArguments;
120 assert(vd->llvmValue); 121 assert(vd->llvmValue);
121 e->mem = vd->llvmValue; 122 e->mem = vd->llvmValue;
122 e->type = elem::VAR; 123 e->type = elem::VAR;
123 } 124 }
124 // _argptr 125 // _argptr
125 else if (vd->ident == Id::_argptr) 126 else if (vd->ident == Id::_argptr)
126 { 127 {
128 Logger::println("Id::_argptr");
127 vd->llvmValue = p->func().decl->llvmArgPtr; 129 vd->llvmValue = p->func().decl->llvmArgPtr;
128 assert(vd->llvmValue); 130 assert(vd->llvmValue);
129 e->mem = vd->llvmValue; 131 e->mem = vd->llvmValue;
130 e->type = elem::VAR; 132 e->type = elem::VAR;
131 } 133 }
132 // _dollar 134 // _dollar
133 else if (vd->ident == Id::dollar) 135 else if (vd->ident == Id::dollar)
134 { 136 {
137 Logger::println("Id::dollar");
135 assert(!p->arrays.empty()); 138 assert(!p->arrays.empty());
136 llvm::Value* tmp = LLVM_DtoGEPi(p->arrays.back(),0,0,"tmp",p->scopebb()); 139 llvm::Value* tmp = LLVM_DtoGEPi(p->arrays.back(),0,0,"tmp",p->scopebb());
137 e->val = new llvm::LoadInst(tmp,"tmp",p->scopebb()); 140 e->val = new llvm::LoadInst(tmp,"tmp",p->scopebb());
138 e->type = elem::VAL; 141 e->type = elem::VAL;
139 } 142 }
150 e->mem = tid->llvmValue; 153 e->mem = tid->llvmValue;
151 e->type = elem::VAR; 154 e->type = elem::VAR;
152 } 155 }
153 // nested variable 156 // nested variable
154 else if (vd->nestedref) { 157 else if (vd->nestedref) {
158 Logger::println("nested variable");
155 e->mem = LLVM_DtoNestedVariable(vd); 159 e->mem = LLVM_DtoNestedVariable(vd);
156 e->type = elem::VAR; 160 e->type = elem::VAR;
157 e->vardecl = vd; 161 e->vardecl = vd;
158 } 162 }
159 // function parameter 163 // function parameter
160 else if (vd->isParameter()) { 164 else if (vd->isParameter()) {
161 Logger::println("function param"); 165 Logger::println("function param");
162 assert(vd->llvmValue); 166 if (!vd->llvmValue) {
167 // TODO: determine this properly
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();
170 }
163 if (vd->isRef() || vd->isOut()) { 171 if (vd->isRef() || vd->isOut()) {
164 e->mem = vd->llvmValue; 172 e->mem = vd->llvmValue;
165 e->type = elem::VAR; 173 e->type = elem::VAR;
166 } 174 }
167 else { 175 else {
1430 e->istypeinfo = true; 1438 e->istypeinfo = true;
1431 } 1439 }
1432 1440
1433 assert(vd->llvmValue); 1441 assert(vd->llvmValue);
1434 Type* t = LLVM_DtoDType(type); 1442 Type* t = LLVM_DtoDType(type);
1443 Type* tnext = LLVM_DtoDType(t->next);
1435 Type* vdtype = LLVM_DtoDType(vd->type); 1444 Type* vdtype = LLVM_DtoDType(vd->type);
1436 1445
1437 llvm::Value* llvalue = vd->nestedref ? LLVM_DtoNestedVariable(vd) : vd->llvmValue; 1446 llvm::Value* llvalue = vd->nestedref ? LLVM_DtoNestedVariable(vd) : vd->llvmValue;
1438 1447
1439 if (vdtype->ty == Tstruct && !(t->ty == Tpointer && t->next == vdtype)) { 1448 if (vdtype->ty == Tstruct && !(t->ty == Tpointer && t->next == vdtype)) {
1440 TypeStruct* vdt = (TypeStruct*)vdtype; 1449 TypeStruct* vdt = (TypeStruct*)vdtype;
1450 assert(vdt->sym);
1441 e = new elem; 1451 e = new elem;
1442 std::vector<unsigned> dst(1,0); 1452 bool donormally = true;
1443 vdt->sym->offsetToIndex(t->next, offset, dst); 1453 if (offset == 0) {
1444 llvm::Value* ptr = llvalue; 1454 const llvm::Type* llt = LLVM_DtoType(t);
1445 assert(ptr); 1455 e->mem = p->ir->CreateBitCast(llvalue, llt, "tmp");
1446 e->mem = LLVM_DtoGEP(ptr,dst,"tmp"); 1456 }
1457 else {
1458 std::vector<unsigned> dst(1,0);
1459 vdt->sym->offsetToIndex(tnext, offset, dst);
1460 llvm::Value* ptr = llvalue;
1461 assert(ptr);
1462 e->mem = LLVM_DtoGEP(ptr,dst,"tmp");
1463 }
1447 e->type = elem::VAL; 1464 e->type = elem::VAL;
1448 e->field = true; 1465 e->field = true;
1449 } 1466 }
1450 else if (vdtype->ty == Tsarray) { 1467 else if (vdtype->ty == Tsarray) {
1451 e = new elem; 1468 e = new elem;
2116 } 2133 }
2117 } 2134 }
2118 else 2135 else
2119 assert(post); 2136 assert(post);
2120 2137
2121 //llvm::Value* tostore = l->storeVal ? l->storeVal : l->val; 2138 if (l->mem == 0)
2139 LLVM_DtoGiveArgumentStorage(l);
2122 new llvm::StoreInst(post,l->mem,p->scopebb()); 2140 new llvm::StoreInst(post,l->mem,p->scopebb());
2123 2141
2124 delete l; 2142 delete l;
2125 delete r; 2143 delete r;
2126 2144