From f9c799143067c3197dc925f7fd916206d075a25d Mon Sep 17 00:00:00 2001 From: xleroy Date: Wed, 6 Nov 2013 10:39:43 +0000 Subject: Revised treatment of _Alignas, for better compatibility with GCC and Clang, and to avoid wasting global variable space by inflating their sizeof needlessly. git-svn-id: https://yquem.inria.fr/compcert/svn/compcert/trunk@2362 fca1b0fc-160b-0410-b1d3-a4f43f01ea2e --- test/regression/Makefile | 2 +- test/regression/Results/alignas | 9 ++++ test/regression/alignas.c | 95 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 test/regression/Results/alignas create mode 100644 test/regression/alignas.c (limited to 'test') diff --git a/test/regression/Makefile b/test/regression/Makefile index a37f901..8dc7678 100644 --- a/test/regression/Makefile +++ b/test/regression/Makefile @@ -17,7 +17,7 @@ TESTS=int32 int64 floats floats-basics \ TESTS_COMP=attribs1 bitfields1 bitfields2 bitfields3 bitfields4 \ bitfields5 bitfields6 bitfields7 bitfields8 \ - builtins-$(ARCH) packedstruct1 packedstruct2 + builtins-$(ARCH) packedstruct1 packedstruct2 alignas # Can run, both in compiled mode and in interpreter mode, # but produce processor-dependent results, so no reference output in Results diff --git a/test/regression/Results/alignas b/test/regression/Results/alignas new file mode 100644 index 0000000..1fc87a4 --- /dev/null +++ b/test/regression/Results/alignas @@ -0,0 +1,9 @@ +a: size = 4, alignment = 16, address mod 16 = 0 +b: size = 12, alignment = 16, address mod 16 = 0 +bb: size = 12, alignment = 16, address mod 16 = 0 +c: size = 32, alignment = 16, address mod 16 = 0 +d: size = 32, alignment = 32, address mod 32 = 0 +e: size = 16, alignment = 16, address mod 16 = 0 +f: size = 32, alignment = 32, address mod 32 = 0 +g: size = 96, alignment = 16, address mod 16 = 0 +h: size = 192, alignment = 64, address mod 64 = 0 diff --git a/test/regression/alignas.c b/test/regression/alignas.c new file mode 100644 index 0000000..4e887d3 --- /dev/null +++ b/test/regression/alignas.c @@ -0,0 +1,95 @@ +/* _Alignas and its interactions with sizeof */ + +#include + +#if __STDC_VERSION__ < 201100 && defined(__GNUC__) +#define _Alignas(x) __attribute__((aligned(x))) +#define _Alignof(x) __alignof__(x) +#endif + +/* Base type */ +int _Alignas(16) a; +char filler1; + +/* Array */ +_Alignas(16) int b[3]; + +typedef int int3[3]; +_Alignas(16) int3 bb; + +#if 0 +typedef _Alignas(16) int int16; +int16 bbb[3]; +#endif + +char filler2; + +/* Struct */ +struct s { + char y; + int _Alignas(16) x; +}; + +struct s c; +char filler3; + +struct s _Alignas(32) d; +char filler4; + +/* Union */ +union u { + int _Alignas(16) x; + char y; +}; + +union u e; +char filler5; + +union u _Alignas(32) f; +char filler6; + +/* Arrays of structs */ + +struct s g[3]; +char filler7; + +struct _Alignas(64) ss { + char y; + int _Alignas(16) x; +}; + +struct ss h[3]; +char filler8; + +/* Test harness */ + +int main() +{ + printf("a: size = %u, alignment = %u, address mod 16 = %u\n", + (unsigned) sizeof(a), (unsigned) _Alignof(a), ((unsigned) &a) & 0xF); + printf("b: size = %u, alignment = %u, address mod 16 = %u\n", + (unsigned) sizeof(b), (unsigned) _Alignof(b), ((unsigned) &b) & 0xF); + printf("bb: size = %u, alignment = %u, address mod 16 = %u\n", + (unsigned) sizeof(bb), (unsigned) _Alignof(bb), ((unsigned) &bb) & 0xF); +#if 0 + printf("bbb: size = %u, alignment = %u, address mod 16 = %u\n", + (unsigned) sizeof(bbb), (unsigned) _Alignof(bbb), ((unsigned) &bbb) & 0xF); +#endif + printf("c: size = %u, alignment = %u, address mod 16 = %u\n", + (unsigned) sizeof(c), (unsigned) _Alignof(c), ((unsigned) &c) & 0xF); + printf("d: size = %u, alignment = %u, address mod 32 = %u\n", + (unsigned) sizeof(d), (unsigned) _Alignof(d), ((unsigned) &d) & 0x1F); + printf("e: size = %u, alignment = %u, address mod 16 = %u\n", + (unsigned) sizeof(e), (unsigned) _Alignof(e), ((unsigned) &e) & 0xF); + printf("f: size = %u, alignment = %u, address mod 32 = %u\n", + (unsigned) sizeof(f), (unsigned) _Alignof(f), ((unsigned) &f) & 0x1F); + printf("g: size = %u, alignment = %u, address mod 16 = %u\n", + (unsigned) sizeof(g), (unsigned) _Alignof(g), ((unsigned) &g) & 0xF); + printf("h: size = %u, alignment = %u, address mod 64 = %u\n", + (unsigned) sizeof(h), (unsigned) _Alignof(h), ((unsigned) &h) & 0x3F); + return 0; +} + + + + -- cgit v1.2.3