Mercurial > projects > ldc
diff gen/llvmhelpers.cpp @ 1029:4d366a75d95f
Added hasUnalignedFields helper to check if a type has unaligned fields - as per request from fvbommel. Result is cached in TypeStruct.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Tue, 03 Mar 2009 15:08:26 +0100 |
parents | 80490f65d4e1 |
children | 39f12f5aa515 |
line wrap: on
line diff
--- a/gen/llvmhelpers.cpp Tue Mar 03 14:10:37 2009 +0100 +++ b/gen/llvmhelpers.cpp Tue Mar 03 15:08:26 2009 +0100 @@ -1565,3 +1565,33 @@ return false; #endif } + +////////////////////////////////////////////////////////////////////////////////////////// + +bool hasUnalignedFields(Type* t) +{ + t = t->toBasetype(); + if (t->ty != Tstruct) + return false; + + TypeStruct* ts = (TypeStruct*)t; + if (ts->unaligned) + return (ts->unaligned == 2); + + StructDeclaration* sym = ts->sym; + + // go through all the fields and try to find something unaligned + ts->unaligned = 2; + for (int i = 0; i < sym->fields.dim; i++) + { + VarDeclaration* f = (VarDeclaration*)sym->fields.data[i]; + unsigned a = f->type->alignsize() - 1; + if (((f->offset + a) & ~a) != f->offset) + return true; + else if (f->type->toBasetype()->ty == Tstruct && hasUnalignedFields(f->type)) + return true; + } + + ts->unaligned = 1; + return false; +}