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);