Mercurial > projects > ldc
comparison gen/structs.cpp @ 351:f273f5c58a9a trunk
[svn r372] Fixed extern(C++) handling now same as DMD, which is to treat it like extern(C).
Fixed a problem in resolving struct types where the size of elements might not yet be known. Switched to using DMD size() instead
of LLVM ABI size (TargetData).
author | lindquist |
---|---|
date | Mon, 14 Jul 2008 03:23:43 +0200 |
parents | 5320fe65a65d |
children | 74101be2a553 |
comparison
equal
deleted
inserted
replaced
350:b85cf5faccfc | 351:f273f5c58a9a |
---|---|
186 if (lastoffset == (unsigned)-1) { | 186 if (lastoffset == (unsigned)-1) { |
187 lastoffset = i->first; | 187 lastoffset = i->first; |
188 assert(lastoffset == 0); | 188 assert(lastoffset == 0); |
189 fieldtype = i->second.type; | 189 fieldtype = i->second.type; |
190 fieldinit = i->second.var; | 190 fieldinit = i->second.var; |
191 prevsize = getABITypeSize(fieldtype); | 191 prevsize = fieldinit->type->size(); |
192 i->second.var->ir.irField->index = idx; | 192 i->second.var->ir.irField->index = idx; |
193 } | 193 } |
194 // colliding offset? | 194 // colliding offset? |
195 else if (lastoffset == i->first) { | 195 else if (lastoffset == i->first) { |
196 size_t s = getABITypeSize(i->second.type); | 196 size_t s = i->second.var->type->size(); |
197 if (s > prevsize) { | 197 if (s > prevsize) { |
198 fieldpad += s - prevsize; | 198 fieldpad += s - prevsize; |
199 prevsize = s; | 199 prevsize = s; |
200 } | 200 } |
201 sd->ir.irStruct->hasUnions = true; | 201 sd->ir.irStruct->hasUnions = true; |
202 i->second.var->ir.irField->index = idx; | 202 i->second.var->ir.irField->index = idx; |
203 } | 203 } |
204 // intersecting offset? | 204 // intersecting offset? |
205 else if (i->first < (lastoffset + prevsize)) { | 205 else if (i->first < (lastoffset + prevsize)) { |
206 size_t s = getABITypeSize(i->second.type); | 206 size_t s = i->second.var->type->size(); |
207 assert((i->first + s) <= (lastoffset + prevsize)); // this holds because all types are aligned to their size | 207 assert((i->first + s) <= (lastoffset + prevsize)); // this holds because all types are aligned to their size |
208 sd->ir.irStruct->hasUnions = true; | 208 sd->ir.irStruct->hasUnions = true; |
209 i->second.var->ir.irField->index = idx; | 209 i->second.var->ir.irField->index = idx; |
210 i->second.var->ir.irField->indexOffset = (i->first - lastoffset) / s; | 210 i->second.var->ir.irField->indexOffset = (i->first - lastoffset) / s; |
211 } | 211 } |
224 | 224 |
225 // start new | 225 // start new |
226 lastoffset = i->first; | 226 lastoffset = i->first; |
227 fieldtype = i->second.type; | 227 fieldtype = i->second.type; |
228 fieldinit = i->second.var; | 228 fieldinit = i->second.var; |
229 prevsize = getABITypeSize(fieldtype); | 229 prevsize = fieldinit->type->size(); |
230 i->second.var->ir.irField->index = idx; | 230 i->second.var->ir.irField->index = idx; |
231 fieldpad = 0; | 231 fieldpad = 0; |
232 } | 232 } |
233 } | 233 } |
234 fieldtypes.push_back(fieldtype); | 234 fieldtypes.push_back(fieldtype); |