From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/5206 Path: news.gmane.org!not-for-mail From: Rich Felker Newsgroups: gmane.linux.lib.musl.general Subject: Revisiting max_align_t and stdalign.h Date: Sun, 8 Jun 2014 10:59:24 -0400 Message-ID: <20140608145924.GA19121@brightrain.aerifal.cx> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1402239585 2733 80.91.229.3 (8 Jun 2014 14:59:45 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 8 Jun 2014 14:59:45 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-5211-gllmg-musl=m.gmane.org@lists.openwall.com Sun Jun 08 16:59:38 2014 Return-path: Envelope-to: gllmg-musl@plane.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1WteZO-0000ft-FD for gllmg-musl@plane.gmane.org; Sun, 08 Jun 2014 16:59:38 +0200 Original-Received: (qmail 15748 invoked by uid 550); 8 Jun 2014 14:59:37 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 15737 invoked from network); 8 Jun 2014 14:59:36 -0000 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Original-Sender: Rich Felker Xref: news.gmane.org gmane.linux.lib.musl.general:5206 Archived-At: I was looking back at the max_align_t issue and there seems to be a lot more to resolve: gcc is badly broken in regards to everything related to stdalign.h. This test program on i386: #include #include int main() { long long x; printf("%d %d\n", (int)_Alignof(x), (int)_Alignof(long long)); } prints 8 8 on most gcc versions, and what's worse, its behavior depends on -std; adding -std=c11 and using gcc 4.9.0 changes it to printing 8 4. The correct result of course would be 4 4. I had in mind the following patch for stdalign.h: diff --git a/include/stdalign.h b/include/stdalign.h index b6e50ae..3f00466 100644 --- a/include/stdalign.h +++ b/include/stdalign.h @@ -4,7 +4,7 @@ /* this whole header only works in C11 or with compiler extensions */ #if __STDC_VERSION__ < 201112L && defined( __GNUC__) #define _Alignas(t) __attribute__((__aligned__(t))) -#define _Alignof(t) __alignof__(t) +#define _Alignof(t) (sizeof(struct {char __x; __typeof__(t) __y;}) - sizeof(t)) #endif #define alignas _Alignas but it doesn't really help since _Alignof is broken even with -std=c11. I suspect _Alignas is similarly broken. The only "solution" I see is adopting stdc-predef.h and putting #defines for _Alignof and _Alignas in there for all __GNUC__ compilers earlier than the first version of gcc that gets fixed. I've wanted to add stdc-predef.h for a while anyway to define things like __STDC_ISO_10646__ but since it's only auto-included for gcc 4.8 and later, we should either patch earlier gcc's to add it or just throw "-include stdc-predef.h" into the specfile (of course this is outside the scope of musl itself). Rich