/// Undo the transformation performed by DtoUnpaddedStruct, writing to lval. void DtoPaddedStruct(Type* dty, LLValue* v, LLValue* lval) { assert(dty->ty == Tstruct); TypeStruct* sty = static_cast<TypeStruct*>(dty); VarDeclarations& fields = sty->sym->fields; for (unsigned i = 0; i < fields.dim; i++) { LLValue* fieldptr = DtoIndexAggregate(lval, sty->sym, fields[i]); LLValue* fieldval = DtoExtractValue(v, i); if (fields[i]->type->ty == Tstruct) { // Nested structs are the only members that can contain padding DtoPaddedStruct(fields[i]->type, fieldval, fieldptr); } else { DtoStore(fieldval, fieldptr); } } }
/// Undo the transformation performed by DtoUnpaddedStruct, writing to lval. void DtoPaddedStruct(Type* dty, LLValue* v, LLValue* lval) { assert(dty->ty == Tstruct); TypeStruct* sty = (TypeStruct*) dty; Array& fields = sty->sym->fields; for (unsigned i = 0; i < fields.dim; i++) { VarDeclaration* vd = (VarDeclaration*) fields.data[i]; LLValue* fieldptr = DtoIndexStruct(lval, sty->sym, vd); LLValue* fieldval = DtoExtractValue(v, i); if (vd->type->ty == Tstruct) { // Nested structs are the only members that can contain padding DtoPaddedStruct(vd->type, fieldval, fieldptr); } else { DtoStore(fieldval, fieldptr); } } }