svn commit: r268137 - head/sys/sys

Oliver Pinter oliver.pinter at hardenedbsd.org
Sun Jun 21 11:49:29 UTC 2015


On 6/21/15, Bruce Evans <brde at optusnet.com.au> wrote:
> On Sat, 20 Jun 2015, Pedro Giffuni wrote:
>
>> On 06/19/15 12:23, Bruce Evans wrote:
>>> On Fri, 19 Jun 2015, Dimitry Andric wrote:
>>>
>>>> On 19 Jun 2015, at 17:02, Pedro Giffuni <pfg at freebsd.org> wrote:
>>>>>
>>>>>> On 19/06/2015 05:16 a.m., David Chisnall wrote:
>>>>>>> I only just caught this (having seen the fallout from NetBSD doing
>>>>>>> the
>>>>>>> same thing in a shipping release and the pain that it’s caused):
>>>>>>> __weak is a reserved keyword in Objective-C, please pick another name
>>>>>>>
>>>>>>> for this.  This in cdefs.h makes it impossible to include any FreeBSD
>>>>>>>
>>>>>>> standard headers in Objective-C programs (of which we have a couple
>>>>>>> of
>>>>>>> hundred in ports) if they use any of the modern Objective-C language
>>>>>>>
>>>>>>> modes.
>>>> ...
>>>>> Closely related to this, we are redefining _Noreturn, which is a
>>>>> reserved
>>>>> keyword in C11.
>>>>
>>>> No, sys/cdefs.h has:
>>>>
>>>>   254  /*
>>>>   255   * Keywords added in C11.
>>>>   256   */
>>>>   257
>>>>   258  #if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L ||
>>>> defined(lint)
>>>> [...]
>>>>   284  #if defined(__cplusplus) && __cplusplus >= 201103L
>>>>   285  #define _Noreturn               [[noreturn]]
>>>>   286  #else
>>>>   287  #define _Noreturn               __dead2
>>>>   288  #endif
>>>> [...]
>>>>   320  #endif /* __STDC_VERSION__ || __STDC_VERSION__ < 201112L */
>>>>
>>>> So the whole block redefining all the _Xxx identifiers is skipped for
>>>> C11 and higher.
>>>
>>> I probably pointed this out incorrectly to Pedro.
>>>
>>> All uses of _Noreturn are still broken, and also ugly.  __dead2 is the
>>> gcc-2 compatible version of the gcc-1 compatible macro __dead.  It is
>>> syntactically different from __dead and _Noreturn.  It must be placed
>>> after the function parameter list instead of in the function type
>>> declarator because old versions of gcc only accept attributes there.
>>> __dead and presumably _Noreturn must be placed in the function type
>>> declarator.  This is incompatible, and also uglier.
>>>
>> I was thinking that _Noreturn can be fixed for older compilers
>> less disruptively.
>>
>> I haven't tested the attached patch the idea is to resurrect
>> __dead and use it for _Noreturn.
>>
>>> Correct version with ugly declarations:
>>>
>>> __dead void
>>>     foo(void) __dead2;
>>>
>>
>> With the patch we would use:
>>
>> __Noreturn void
>>   foo(void) _dead2;
>>
>> Which is still ugly but C11-ish.
>
> That asks for the same problems as defining __weak.
>
> Why not just don't use _Noreturn?  It is an unimprovement on the gcc
> attribute.  The attribute works at the beginning or end, while Noreturn
> only works at the end.  I checked this:
>
> pts/23:bde at freefall:~/s> cc -O -S a.c -std=c11
> a.c:3:26: error: '_Noreturn' keyword must precede function declarator
> _Noreturn void bar(void) _Noreturn;
>                           ^
>
> I also checked if __dead2 works at the beginning in gcc-2.95.4.  It
> does, but other headers are broken, so the support for gcc-2.95.4 in
> sys/cdefs.h is almost useless:
>
> pts/23:bde at freefall:~/s> gcc295 -O -S a.c
> In file included from /usr/include/machine/_types.h:6,
>                   from /usr/include/sys/_types.h:33,
>                   from /usr/include/x86/endian.h:37,
>                   from /usr/include/machine/endian.h:6,
>                   from /usr/include/sys/types.h:44,
>                   from a.c:1:
> /usr/include/x86/_types.h:161: syntax error before `__gnuc_va_list'
> /usr/include/x86/_types.h:161: warning: data definition has no type or
> storage c
> lass
>
> Here is the broken part of x86/_types.h:
>
> %%%
> #ifdef __GNUCLIKE_BUILTIN_VARARGS
> typedef __builtin_va_list	__va_list;	/* internally known to gcc */
> #elif defined(lint)
> typedef char *			__va_list;	/* pretend */
> #endif
> #if defined(__GNUC_VA_LIST_COMPATIBILITY) && !defined(__GNUC_VA_LIST) \
>      && !defined(__NO_GNUC_VA_LIST)
> #define __GNUC_VA_LIST
> meta: next is line 161:
> typedef __va_list		__gnuc_va_list; /* compatibility w/GNU headers*/
> #endif
> %%%
>
> Despite (rather, because of) mounds of ifdefs to support old gcc, it
> doesn't
> actually work.
>
> <stdarg.h> is honestly broken.  It knows that it depends on the gcc feature
> __GNUCLIKE_BUILTIN_STDARG, and aborts with an #error when it is not
> available.
> All of the _GNUCLIKE_BUILTIN_* macros for variadic args are controlled by
> sys/cdefs.h.  They are defined when the compiler is either gcc newer than
> gcc-2.95 or is icc.

Btw, is there anyone, who tries to compile the _recent_ head or
10-STABLE with gcc-4.x>= ?

>
> Bruce


More information about the svn-src-head mailing list