Date: Thu, 27 Aug 2015 13:41:09 -0400 From: Alexander Kabaev <kabaev@gmail.com> To: Pedro Giffuni <pfg@freebsd.org> Cc: "src-committers@freebsd.org" <src-committers@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "svn-src-head@freebsd.org" <svn-src-head@freebsd.org> Subject: Re: svn commit: r287206 - head/sys/sys Message-ID: <CAALb-ZXvc5dFB1Hfxmfs9PdcKZZ7=fQ9DZptk2Qz_3Hw%2BwHH_w@mail.gmail.com> In-Reply-To: <55DF3519.1000106@FreeBSD.org> References: <201508271400.t7RE0Nbc071389@repo.freebsd.org> <55DF3519.1000106@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Aug 27, 2015 at 12:04 PM, Pedro Giffuni <pfg@freebsd.org> wrote: > Hello kan; > > On 08/27/15 09:00, Alexander Kabaev wrote: > >> Author: kan >> Date: Thu Aug 27 14:00:23 2015 >> New Revision: 287206 >> URL: https://svnweb.freebsd.org/changeset/base/287206 >> >> Log: >> Repair sys/cdefs.h enough to be usable with GCC 5.x >> >> The __alloc_size and __alloc_align need to be defined to >> nothingness for lint, but the existing check is deficient >> and allows attributes with working __has_attrubute() to >> slip through. >> >> > AFAICT GCC hasn't added __has_attribute(), but if they did recently > that is great news. > > Actually I do not know if they did and I do not think it even matters that much. The existing conditional is not working for lint and I had to shuffle it under bigger '#ifdef lint' protection. Nor is the condition even well formed enough to work with any recent GCC and using __has_attribute in naked form is a mistake: % cat t.c #if __has_attribute(alloc_size) # error Has attribute #endif % mips-portbld-freebsd11.0-gcc --version mips-portbld-freebsd11.0-gcc (FreeBSD Ports Collection for mips) 5.2.0 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % mips-portbld-freebsd11.0-gcc -E t.c # 1 "t.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "t.c" t.c:2:3: error: #error Has attribute # error Has attribute ^ % gcc48 --version gcc48 (FreeBSD Ports Collection) 4.8.5 Copyright (C) 2015 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % gcc48 -E t.c # 1 "t.c" # 1 "<built-in>" # 1 "<command-line>" # 1 "t.c" t.c:1:20: error: missing binary operator before token "(" #if __has_attribute(alloc_size) > Modified: >> head/sys/sys/cdefs.h >> >> .. > > > #if !__GNUC_PREREQ__(2, 95) >> @@ -371,24 +382,12 @@ >> #define __returns_twice >> #endif >> >> -#if __has_attribute(alloc_size) || __GNUC_PREREQ__(4, 3) >> -#define __alloc_size(x) __attribute__((__alloc_size__(x))) >> -#else >> -#define __alloc_size(x) >> -#endif >> - >> > > This surely got through in GCC's case through the __GNUC_PREREQ__. > Of course gcc 4.2 has neither attribute but clang has alloc_size > so I wonder why it hasn't affected the lint builds. > > Just curiosity, the change is OK but it will be getting ugly if we > have to add all the new attributes in the !lint section. > > Regards, > > Pedro. > clang in tree does not have the slightest idea about the alloc_size attribute, and that is why it worked, as demonstrated by the test below: % cc --version FreeBSD clang version 3.6.1 (tags/RELEASE_361/final 237755) 20150525 Target: x86_64-unknown-freebsd11.0 Thread model: posix % cc -E t.c # 1 "t.c" # 1 "<built-in>" 1 # 1 "<built-in>" 3 # 311 "<built-in>" 3 # 1 "<command line>" 1 # 1 "<built-in>" 2 # 1 "t.c" 2 The original change to cdefs.h appears to be plain wrong. -- Alexander Kabaev
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAALb-ZXvc5dFB1Hfxmfs9PdcKZZ7=fQ9DZptk2Qz_3Hw%2BwHH_w>