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