X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcontext_validate.c;fp=src%2Fcontext_validate.c;h=6a89d6ec9bc2fbadedb8b9f2f957b07b87e93908;hp=66b2a77f0b3a7ee2dcb2a6f0d49b7f0781ef1da8;hb=d199099941c6546d29cb5900e2862b79a55e620f;hpb=6a459a08a40a2c243b0211ceb0cb263d29302627 diff --git a/src/context_validate.c b/src/context_validate.c index 66b2a77..6a89d6e 100644 --- a/src/context_validate.c +++ b/src/context_validate.c @@ -222,6 +222,7 @@ static inline int validate_decl_struct(PSI_Data *data, decl_struct *s) { } } else { token_t t; + size_t size, align; if (darg->var->pointer_level && (!darg->var->array_size || darg->var->pointer_level == 1)) { t = PSI_T_POINTER; @@ -229,17 +230,21 @@ static inline int validate_decl_struct(PSI_Data *data, decl_struct *s) { t = real_decl_type(darg->type)->type; } + size = psi_t_size(t) * (darg->var->array_size ?: 1); + if (i) { decl_arg *last = s->args->args[i-1]; - darg->layout = init_decl_struct_layout( - psi_t_align(t, last->layout->pos + last->layout->len), - psi_t_size(t) * darg->var->array_size); + + align = psi_t_align(t, last->layout->pos + last->layout->len); } else { - darg->layout = init_decl_struct_layout(0, psi_t_size(t)); + align = 0; } + + darg->layout = init_decl_struct_layout(align, size); } if (s->size < darg->layout->pos + darg->layout->len) { s->size = darg->layout->pos + darg->layout->len; + /* FIXME: align struct */ } }