fixincludes: vxworks: remove unnecessary parentheses in ioctl wrapper macro

The rationale for the fixinclude ioctl macro wrapper is, as far as I can
tell (https://gcc.gnu.org/ml/gcc-patches/2012-09/msg01619.html)

  Fix 2: Add hack for ioctl() on VxWorks.

  ioctl() is supposed to be variadic, but VxWorks only has a three
  argument version with the third argument of type int.  This messes up
  when the third argument is not implicitly convertible to int.  This
  adds a macro which wraps around ioctl() and explicitly casts the third
  argument to an int.  This way, the most common use case of ioctl (with
  a const char * for the third argument) will compile in C++, where
  pointers must be explicitly casted to int.

However, we have existing C++ code that calls the ioctl function via

  ::ioctl(foo, bar, baz)

and obviously this breaks when it gets expanded to

  ::(ioctl)(foo, bar, (int)(baz))

Since the GNU C preprocessor already prevents recursive expansion of
function-like macros, the parentheses around ioctl are unnecessary.

Incidentally, there is also a macro sioIoctl() in the vxworks sioLib.h
header that expands to

  ((pSioChan)->pDrvFuncs->ioctl (pSioChan, cmd, arg))

which also breaks when that gets further expanded to

  ((pSioChan)->pDrvFuncs->(ioctl) (pSioChan, cmd, (int)(arg)))

This patch partly fixes that issue as well, but the third argument to
the pDrvFuncs->ioctl method should be void*, so the cast to (int) is
slightly annoying. Internally, we've simply patched the sioIoctl macro:

  (((pSioChan)->pDrvFuncs->ioctl) (pSioChan, cmd, arg))

From-SVN: r264056
This commit is contained in:
Rasmus Villemoes 2018-09-03 15:26:45 +02:00 committed by Rasmus Villemoes
parent c98c243078
commit c7a8f93d7b
3 changed files with 10 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2018-09-03 Rasmus Villemoes <rv@rasmusvillemoes.dk>
* inclhack.def (vxworks_ioctl_macro): Remove parentheses from
expansion of ioctl macro.
* fixincl.x: Regenerate.
2018-07-23 David Edelsohn <dje.gcc@gmail.com>
* inclhack.def (aix_unistd): New.

View File

@ -2,11 +2,11 @@
*
* DO NOT EDIT THIS FILE (fixincl.x)
*
* It has been AutoGen-ed July 23, 2018 at 07:27:34 PM by AutoGen 5.18
* It has been AutoGen-ed September 3, 2018 at 03:24:05 PM by AutoGen 5.18.7
* From the definitions inclhack.def
* and the template file fixincl
*/
/* DO NOT SVN-MERGE THIS FILE, EITHER Mon Jul 23 19:27:34 UTC 2018
/* DO NOT SVN-MERGE THIS FILE, EITHER Mon Sep 3 15:24:05 CEST 2018
*
* You must regenerate it. Use the ./genfixes script.
*
@ -9737,7 +9737,7 @@ tSCC* apzVxworks_Ioctl_MacroMachs[] = {
static const char* apzVxworks_Ioctl_MacroPatch[] = {
"format",
"%0\n\
#define ioctl(fd, func, arg) (ioctl)(fd, func, (int)(arg))\n",
#define ioctl(fd, func, arg) ioctl(fd, func, (int)(arg))\n",
"extern[\t ]+int[\t ]+ioctl[\t ]*\\([\t ,[:alnum:]]*\\);",
(char*)NULL };

View File

@ -4916,7 +4916,7 @@ fix = {
c_fix = format;
c_fix_arg = "%0\n"
"#define ioctl(fd, func, arg) (ioctl)(fd, func, (int)(arg))\n";
"#define ioctl(fd, func, arg) ioctl(fd, func, (int)(arg))\n";
c_fix_arg = "extern[\t ]+int[\t ]+ioctl[\t ]*\\([\t ,[:alnum:]]*\\);";
test_text = "extern int ioctl ( int asdf1234, int jkl , int qwerty ) ;";