Flavio Cruz, le mer. 19 janv. 2022 22:59:13 -0800, a ecrit: > This is only done when data is inlined with a concrete size. It > ensures the C and Mig types have the same size in the target arch. > > Tested by building the hurd package. No assertions were triggered.
Applied, thanks! > --- > server.c | 4 ++-- > tests/good/case.defs | 6 ++++-- > tests/includes/types.h | 2 +- > user.c | 2 +- > utils.c | 39 ++++++++++++++++++++++++++++++++------- > utils.h | 9 ++++++--- > 6 files changed, 46 insertions(+), 16 deletions(-) > > diff --git a/server.c b/server.c > index 6d089c1..0b78990 100644 > --- a/server.c > +++ b/server.c > @@ -184,7 +184,7 @@ WriteEpilog(FILE *file, const statement_t *stats) > > WriteStaticDecl(file, itRetCodeType, > itRetCodeType->itDeallocate, itRetCodeType->itLongForm, > - !IsKernelServer, "RetCodeType"); > + /*is_server=*/ TRUE, !IsKernelServer, "RetCodeType"); > fprintf(file, "\n"); > > fprintf(file, "\tmig_routine_t routine;\n"); > @@ -1327,7 +1327,7 @@ WriteRoutine(FILE *file, const routine_t *rt) > > WriteList(file, rt->rtArgs, WriteCheckDecl, akbRequestQC, "\n", "\n"); > WriteList(file, rt->rtArgs, > - IsKernelServer ? WriteTypeDeclOut : WriteTypeDeclIn, > + IsKernelServer ? WriteTypeDeclOutServer : WriteTypeDeclInServer, > akbReplyInit, "\n", "\n"); > > WriteList(file, rt->rtArgs, WriteLocalVarDecl, > diff --git a/tests/good/case.defs b/tests/good/case.defs > index 25ba510..479f733 100644 > --- a/tests/good/case.defs > +++ b/tests/good/case.defs > @@ -19,9 +19,11 @@ > /* Tests some keywords with different casing. */ > SUBSYSTEM myroutine 100; > > -TyPe int = MACH_MSG_TYPE_INTEGER_64; > +import <stdint.h>; > + > +TyPe uint64_t = MACH_MSG_TYPE_INTEGER_64; > typE mach_port_t = MACH_MSG_TYPE_COPY_SEND; > > RouTine factorial(port : mach_port_t; > n : int; > - out result : int); > + out result : uint64_t); > diff --git a/tests/includes/types.h b/tests/includes/types.h > index c8c3afd..fe70e69 100644 > --- a/tests/includes/types.h > +++ b/tests/includes/types.h > @@ -28,7 +28,7 @@ typedef struct char_struct { > char c4; > } char_struct_t; > > -typedef char* string_t; > +typedef char string_t[256]; > typedef const char* const_string_t; > > static inline int8_t int_to_int8(int n) { > diff --git a/user.c b/user.c > index 7f355ed..9aff07c 100644 > --- a/user.c > +++ b/user.c > @@ -1164,7 +1164,7 @@ WriteRoutine(FILE *file, const routine_t *rt) > /* declarations and initializations of the mach_msg_type_t variables > for each argument */ > > - WriteList(file, rt->rtArgs, WriteTypeDeclIn, akbRequest, "\n", "\n"); > + WriteList(file, rt->rtArgs, WriteTypeDeclInUser, akbRequest, "\n", "\n"); > if (!rt->rtOneWay) > WriteList(file, rt->rtArgs, WriteCheckDecl, akbReplyQC, "\n", "\n"); > > diff --git a/utils.c b/utils.c > index 505f434..0e1e2e3 100644 > --- a/utils.c > +++ b/utils.c > @@ -190,19 +190,35 @@ WriteServerVarDecl(FILE *file, const argument_t *arg) > } > > void > -WriteTypeDeclIn(FILE *file, const argument_t *arg) > +WriteTypeDeclInServer(FILE *file, const argument_t *arg) > { > WriteStaticDecl(file, arg->argType, > arg->argType->itIndefinite ? d_NO : arg->argDeallocate, > - arg->argLongForm, TRUE, arg->argTTName); > + arg->argLongForm, /*is_server=*/TRUE, TRUE, arg->argTTName); > } > > void > -WriteTypeDeclOut(FILE *file, const argument_t *arg) > +WriteTypeDeclOutServer(FILE *file, const argument_t *arg) > { > WriteStaticDecl(file, arg->argType, > arg->argType->itIndefinite ? d_NO : arg->argDeallocate, > - arg->argLongForm, FALSE, arg->argTTName); > + arg->argLongForm, /*is_server=*/TRUE, FALSE, > arg->argTTName); > +} > + > +void > +WriteTypeDeclInUser(FILE *file, const argument_t *arg) > +{ > + WriteStaticDecl(file, arg->argType, > + arg->argType->itIndefinite ? d_NO : arg->argDeallocate, > + arg->argLongForm, /*is_server=*/FALSE, TRUE, > arg->argTTName); > +} > + > +void > +WriteTypeDeclOutUser(FILE *file, const argument_t *arg) > +{ > + WriteStaticDecl(file, arg->argType, > + arg->argType->itIndefinite ? d_NO : arg->argDeallocate, > + arg->argLongForm, /*is_server=*/FALSE, FALSE, > arg->argTTName); > } > > void > @@ -323,7 +339,8 @@ WriteStaticLongDecl(FILE *file, const ipc_type_t *it, > > static void > WriteStaticShortDecl(FILE *file, const ipc_type_t *it, > - dealloc_t dealloc, boolean_t inname, identifier_t name) > + dealloc_t dealloc, boolean_t is_server, boolean_t inname, > + identifier_t name) > { > fprintf(file, "\tconst mach_msg_type_t %s = {\n", name); > fprintf(file, "\t\t/* msgt_name = */\t\t(unsigned char) %s,\n", > @@ -337,16 +354,24 @@ WriteStaticShortDecl(FILE *file, const ipc_type_t *it, > strdealloc(dealloc)); > fprintf(file, "\t\t/* msgt_unused = */\t\t0\n"); > fprintf(file, "\t};\n"); > + if (it->itInLine && !it->itVarArray) { > + identifier_t type = is_server ? FetchServerType(it) : > FetchUserType(it); > + const u_int size_bytes = it->itSize >> 3; > + fprintf(file, "\t_Static_assert(sizeof(%s) == %d * %d, \"expected %s > to be size %d * %d\");\n", > + type, size_bytes, it->itNumber, > + type, size_bytes, it->itNumber); > + } > } > > void > WriteStaticDecl(FILE *file, const ipc_type_t *it, dealloc_t dealloc, > - boolean_t longform, boolean_t inname, identifier_t name) > + boolean_t longform, boolean_t is_server, boolean_t inname, > + identifier_t name) > { > if (longform) > WriteStaticLongDecl(file, it, dealloc, inname, name); > else > - WriteStaticShortDecl(file, it, dealloc, inname, name); > + WriteStaticShortDecl(file, it, dealloc, is_server, inname, name); > } > > /* > diff --git a/utils.h b/utils.h > index 3a4c832..91666ae 100644 > --- a/utils.h > +++ b/utils.h > @@ -46,8 +46,10 @@ extern void WriteReverseList(FILE *file, const argument_t > *args, > extern write_list_fn_t WriteNameDecl; > extern write_list_fn_t WriteUserVarDecl; > extern write_list_fn_t WriteServerVarDecl; > -extern write_list_fn_t WriteTypeDeclIn; > -extern write_list_fn_t WriteTypeDeclOut; > +extern write_list_fn_t WriteTypeDeclInServer; > +extern write_list_fn_t WriteTypeDeclOutServer; > +extern write_list_fn_t WriteTypeDeclInUser; > +extern write_list_fn_t WriteTypeDeclOutUser; > extern write_list_fn_t WriteCheckDecl; > > extern const char *ReturnTypeStr(const routine_t *rt); > @@ -63,7 +65,8 @@ extern void WriteStructDecl(FILE *file, const argument_t > *args, > > extern void WriteStaticDecl(FILE *file, const ipc_type_t *it, > dealloc_t dealloc, boolean_t longform, > - boolean_t inname, identifier_t name); > + boolean_t is_server, boolean_t inname, > + identifier_t name); > > extern void WriteCopyType(FILE *file, const ipc_type_t *it, > const char *left, const char *right, ...); > -- > 2.32.0