X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fcontext.c;h=17699a49a591db9fcbbc03a013a9df2a15681872;hp=8bd2deef155d1b20da822b217b65e686ed49cde0;hb=69fb17bcfa5ed9c32754fa143b59f4a4a2dd4bd8;hpb=ef5079cd02c9d8666f6b9336853d2ab393e33467 diff --git a/src/context.c b/src/context.c index 8bd2dee..17699a4 100644 --- a/src/context.c +++ b/src/context.c @@ -35,7 +35,7 @@ #include "php_psi_decls.h" #include "php_psi_va_decls.h" #include "php_psi_structs.h" - +#include "php_psi_unions.h" PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErrorFunc error, unsigned flags) { @@ -43,6 +43,7 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr struct psi_predef_type *predef_type; struct psi_predef_const *predef_const; struct psi_predef_struct *predef_struct; + struct psi_predef_union *predef_union; struct psi_predef_decl *predef_decl; if (!C) { @@ -85,6 +86,7 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr decl_struct *dstruct = init_decl_struct(predef_struct->var_name, dargs); dstruct->size = predef_struct->size; + dstruct->align = predef_struct->offset; for (member = &predef_struct[1]; member->type_tag; ++member) { decl_type *type; decl_var *dvar; @@ -100,6 +102,28 @@ PSI_Context *PSI_ContextInit(PSI_Context *C, PSI_ContextOps *ops, PSI_ContextErr T.structs = add_decl_struct(T.structs, dstruct); predef_struct = member; } + for (predef_union = &psi_predef_unions[0]; predef_union->type_tag; ++predef_union) { + struct psi_predef_union *member; + decl_args *dargs = init_decl_args(NULL); + decl_union *dunion = init_decl_union(predef_union->var_name, dargs); + + dunion->size = predef_union->size; + dunion->align = dunion->offset; + for (member = &predef_union[1]; member->type_tag; ++member) { + decl_type *type; + decl_var *dvar; + decl_arg *darg; + + type = init_decl_type(member->type_tag, member->type_name); + dvar = init_decl_var(member->var_name, member->pointer_level, member->array_size); + darg = init_decl_arg(type, dvar); + darg->layout = init_decl_struct_layout(member->offset, member->size); + dargs = add_decl_arg(dargs, darg); + } + + T.unions = add_decl_union(T.unions, dunion); + predef_union = member; + } for (predef_decl = &psi_predef_decls[0]; predef_decl->type_tag; ++predef_decl) { struct psi_predef_decl *farg; decl_type *ftype = init_decl_type(predef_decl->type_tag, predef_decl->type_name);