|
Message-ID: <20140608145924.GA19121@brightrain.aerifal.cx> Date: Sun, 8 Jun 2014 10:59:24 -0400 From: Rich Felker <dalias@...c.org> To: musl@...ts.openwall.com Subject: Revisiting max_align_t and stdalign.h 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 <stdalign.h> #include <stdio.h> 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
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.