On Mon, Mar 2, 2015 at 11:03 AM, Justus Winter
<4win...@informatik.uni-hamburg.de> wrote:
> Hi David :)
>
> thanks for cleaning up after me ;)  (again and again...)
>
> Quoting David Michael (2015-02-18 05:39:46)
>> On Sun, Feb 15, 2015 at 11:09 AM, Justus Winter
>> <4win...@informatik.uni-hamburg.de> wrote:
>> > * utils.c (WriteFieldDeclPrim): Generate a union with an additional
>> > pointer field for variable-length arrays.
>>
>> This makes GDB's awk script go haywire because it doesn't know how to
>> deal with unions.  The following is a workaround to get it building
>> again, but I'm not sure of its correctness.  Can someone more
>> knowledgeable than me check on this?
>
> Not that I'm claiming to know why gdb does what it does, but Samuel
> asked me to look into this.

Thanks for looking into it.

> For some reason (proxying?), gdb uses mig to create server-side stubs
> for the *reply*-half of some protocols.  It then uses an awk-script to
> insert the following code into the server-stubs:
>
> if (In0P->Head.msgh_size == sizeof (Reply)
>          && ! (In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX)
>          && ! BAD_TYPECHECK(&In0P->return_codeType, &return_codeCheck)
>          && In0P->return_code != 0)
> /* Error return, only the error code argument is passed.  */
> {
>   kern_return_t (*sfun)(mach_port_t, kern_return_t, int, data_t, 
> mach_msg_type_number_t, data_t, mach_msg_type_number_t) = 
> S_proc_getprocinfo_reply;
>   OutP->RetCode = (*(kern_return_t (*)(mach_port_t, kern_return_t))sfun) 
> (In0P->Head.msgh_request_port, In0P->return_code);
>   return;
> }
>
> This is inserted *before* any type checks.  The awk script has this to
> say:
>
> # The first args type checking statement; we need to insert our chunk of
> # code that bypasses all the type checks if this is an error return, after
> # which we're done until we get to the next function.  Handily, the size
> # of mig's Reply structure is also the size of the alternate Request
> # structure that we want to check for.
> [...]
> # Force the function into a type that only takes the first two args, via
> # the temp variable SFUN (is there another way to correctly do this cast?).
> # This is possibly bogus, but easier than supplying bogus values for all
> # the other args (we can't just pass 0 for them, as they might not be scalar).
>
> I don't see why it bothers with SFUN in the first place.  It could just do
>
>   OutP->RetCode = (*(kern_return_t (*)(mach_port_t, kern_return_t)) 
> S_proc_getprocinfo_reply) (In0P->Head.msgh_request_port, In0P->return_code);

That was my first thought as well, but the comment "is there another
way to correctly do this cast?" made me think I was missing some
subtlety.  Thomas took care of updating this last time mig was
modified; maybe he is familiar with its design choices?

> right?  If so, the main reason for parsing the struct is gone, and we
> could simplify the script a lot and thus making it less likely to
> break in the future.  Getting rid of it entirely would be nice though.
>
> A word about the patch.  It seems to cheat by assuming `data_t' as the
> type as soon at it sees a union.  That shouldn't matter since the type
> is only used for the stupid cast.  But the better way would be to just
> get rid of the parsing in the first place, or the whole script when
> we're at it.

Yes, I'd be in favor of anything that makes the build process less
dependent on the exact mig output.  I don't know enough about what gdb
is doing to remove this script entirely, but I'll see if it still
works when using a direct cast instead of all the argument parsing.

Thanks.

David

Reply via email to