summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2013-11-06 10:39:43 +0000
committerGravatar xleroy <xleroy@fca1b0fc-160b-0410-b1d3-a4f43f01ea2e>2013-11-06 10:39:43 +0000
commitf9c799143067c3197dc925f7fd916206d075a25d (patch)
treea7ecd744efdd58fe38cb7ef2a2e8a77c196797b8 /test
parent61b43d3e1be5e8aad11cb3036fdb1872f0f363c3 (diff)
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
Diffstat (limited to 'test')
-rw-r--r--test/regression/Makefile2
-rw-r--r--test/regression/Results/alignas9
-rw-r--r--test/regression/alignas.c95
3 files changed, 105 insertions, 1 deletions
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 <stdio.h>
+
+#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;
+}
+
+
+
+