From d214e5e79e38b18bc3786b3e8ba0e55fdbba294b Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Mon, 20 Apr 2015 00:22:32 +0200 Subject: [PATCH] [GDB] Hurd: Simplify the reply_mig_hack.awk script. gdb/ * reply_mig_hack.awk: Don't bother to declare an intermediate function pointer variable. ... allowing us to simplify the parsing a little bit. And, instead of "warning: initialization from incompatible pointer type", we now get "warning: function called through a non-compatible type". Oh well. --- gdb/ChangeLog | 5 +++++ gdb/reply_mig_hack.awk | 25 ++++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 69e5c4828c8..093686f6fa9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2015-04-20 Thomas Schwinge + + * reply_mig_hack.awk: Don't bother to declare an intermediate + function pointer variable. + 2015-04-17 Doug Evans * solib-svr4.c (svr4_exec_displacement): Rename outer "displacement" diff --git a/gdb/reply_mig_hack.awk b/gdb/reply_mig_hack.awk index 2c2a30a50d4..7eab5042f4c 100644 --- a/gdb/reply_mig_hack.awk +++ b/gdb/reply_mig_hack.awk @@ -60,7 +60,7 @@ parse_phase == 3 && /}/ { print; next; } -parse_phase == 3 { +parse_phase == 3 && num_args == 0 { # The type field for an argument. arg_type_code_name[num_args] = $2; sub (/;$/, "", arg_type_code_name[num_args]) # Get rid of the semi-colon @@ -68,11 +68,22 @@ parse_phase == 3 { print; next; } +parse_phase == 3 && num_args == 1 { + # We've got more than one argument (but we don't care what it is). + num_args++; + print; next; +} + +parse_phase == 3 { + # We've know everything we need; now just wait for the end of the Request + # struct. + print; next; +} + parse_phase == 4 { # The value field for an argument. arg_name[num_args] = $2; sub (/;$/, "", arg_name[num_args]) # Get rid of the semi-colon - arg_type[num_args] = $1; num_args++; parse_phase = 3; print; next; @@ -109,15 +120,11 @@ parse_phase == 5 && /^#if[ \t]TypeCheck/ { print "\t && In0P->" arg_name[0] " != 0)"; print "\t /* Error return, only the error code argument is passed. */"; print "\t {"; - # 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?). + # Force the function user_function_name into a type that only takes the first + # two arguments. # 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). - printf ("\t kern_return_t (*sfun)(mach_port_t"); - for (i = 0; i < num_args; i++) - printf (", %s", arg_type[i]); - printf (") = %s;\n", user_function_name); - print "\t OutP->RetCode = (*(kern_return_t (*)(mach_port_t, kern_return_t))sfun) (In0P->Head.msgh_request_port, In0P->" arg_name[0] ");"; + print "\t OutP->RetCode = (*(kern_return_t (*)(mach_port_t, kern_return_t)) " user_function_name ") (In0P->Head.msgh_request_port, In0P->" arg_name[0] ");"; print "\t return;"; print "\t }"; print ""; -- 2.30.2