annotate gcc/testsuite/gcc.dg/attr-aligned.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* PR c/87795 - Excessive alignment permitted for functions and labels
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 { dg-do compile }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 { dg-options "-Wno-pedantic" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 /* The maximum alignment GCC can handle. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 #define ALIGN_MAX_HARD 0x10000000
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 /* Hardcode a few known values for testing the tight bounds. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 #if __hpux__ && __hppa__ && __LP64__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 /* Maximum alignment for functions and objects with static storage
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 duration that's expected to be accepted. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 # define ALIGN_MAX_STATIC 0x1000
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 /* Excessive alignment for functions and objects with static storage
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 duration that's expected to trigger an error. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #elif __MACH__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 # define ALIGN_MAX_STATIC 0x8000
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 #elif pdp11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 # define ALIGN_MAX_STATIC 2
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 /* Work around a pdp11 ICE (see PR target/87821). */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 # define ALIGN_MAX_AUTO (ALIGN_MAX_HARD >> 14)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 #elif __powerpc64__ || __x86_64__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 /* Is this processor- or operating-system specific? */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 # define ALIGN_MAX_STATIC ALIGN_MAX_HARD
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 #else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 /* Guaranteed to be accepted regardless of the target. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 # define ALIGN_MAX_STATIC __BIGGEST_ALIGNMENT__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 /* Guaranteed to be rejected regardless of the target. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 # define ALIGN_TOO_BIG_OFILE (ALIGN_MAX_HARD << 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 /* Maximum alignment for auto objects that's expected to be accepted. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 #ifndef ALIGN_MAX_AUTO
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 # define ALIGN_MAX_AUTO ALIGN_MAX_HARD
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 #ifndef ALIGN_TOO_BIG_OFILE
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 # define ALIGN_TOO_BIG_OFILE (ALIGN_MAX_STATIC << 1)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 #define ALIGN(N) __attribute__ ((aligned (N)))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 /* Verify that types can be defined maximally overaligned using
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 attribute aligned. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 typedef ALIGN (ALIGN_MAX_HARD) char CharAlignedMaxHard;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 typedef ALIGN (ALIGN_MAX_AUTO) char CharAlignedMaxAuto;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 typedef ALIGN (ALIGN_MAX_STATIC) char CharAlignedMaxStatic;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 #if ALIGN_TOO_BIG_OFILE < ALIGN_MAX_HARD
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 /* Also verify that an alignment greater than MAX_OFILE_ALIGNMENT
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 is accepted unless the constant is as large as GCC's maximum
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 supported alignment in any context. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 typedef ALIGN (ALIGN_TOO_BIG_OFILE) char CharAlignedTooBig;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 CharAlignedMaxStatic t_max;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 /* Verify that globals can be defined maximally overaligned using
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 attribute aligned. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 ALIGN (ALIGN_MAX_STATIC) static const char aligned_sc_max = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 ALIGN (ALIGN_MAX_STATIC) const char aligned_c_max = aligned_sc_max;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 ALIGN (ALIGN_MAX_STATIC) char aligned_v_max;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 ALIGN (ALIGN_MAX_STATIC) void aligned_f_max (void);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 _Static_assert (__alignof__ (aligned_sc_max) == ALIGN_MAX_STATIC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 _Static_assert (__alignof__ (aligned_c_max) == ALIGN_MAX_STATIC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 _Static_assert (__alignof__ (aligned_v_max) == ALIGN_MAX_STATIC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 _Static_assert (__alignof__ (aligned_f_max) == ALIGN_MAX_STATIC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 /* Verify that globals can be defined maximally overaligned using
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 _Alignas. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 _Alignas (ALIGN_MAX_STATIC) static const char alignas_sc_max = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 _Alignas (ALIGN_MAX_STATIC) const char alignas_c_max = alignas_sc_max;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 _Alignas (ALIGN_MAX_STATIC) char alignas_v_max;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 _Static_assert (__alignof__ (alignas_sc_max) == ALIGN_MAX_STATIC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 _Static_assert (__alignof__ (alignas_c_max) == ALIGN_MAX_STATIC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 _Static_assert (__alignof__ (alignas_v_max) == ALIGN_MAX_STATIC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 /* Verify that auto and static local variables can be defined maximally
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 overaligned. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 int accept_local_attribute_aligned (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 #if ALIGN_TOO_BIG_OFILE < ALIGN_MAX_HARD
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 /* Same as above. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 typedef ALIGN (ALIGN_TOO_BIG_OFILE) char LocalCharAlignedTooBig;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 LocalCharAlignedTooBig aligned_lt_too_big = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 (void)&aligned_lt_too_big;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 static CharAlignedMaxStatic aligned_st_max;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 _Static_assert (_Alignof (aligned_st_max) == ALIGN_MAX_STATIC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 CharAlignedMaxAuto aligned_t_max;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 _Static_assert (_Alignof (aligned_t_max) == ALIGN_MAX_AUTO);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 ALIGN (ALIGN_MAX_STATIC) char aligned_s_max;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 _Static_assert (_Alignof (aligned_s_max) == ALIGN_MAX_STATIC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 ALIGN (ALIGN_MAX_AUTO) char aligned_l_max;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 _Static_assert (_Alignof (aligned_l_max) == ALIGN_MAX_AUTO);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 return aligned_st_max++ + aligned_t_max++ + aligned_s_max++ + aligned_l_max++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 int accept_local_alignas (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 _Alignas (ALIGN_MAX_STATIC) char alignas_s_max;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 _Static_assert (_Alignof (alignas_s_max) == ALIGN_MAX_STATIC);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 _Alignas (ALIGN_MAX_AUTO) char alignas_l_max;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 _Static_assert (_Alignof (alignas_l_max) == ALIGN_MAX_AUTO);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 return alignas_s_max++ + alignas_l_max++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 /* Verify that auto and static local variables are subject to the object
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 file alignment limit. The "object file" part may not be mentioned if
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 the object file maximum is the same as GCC's internal maximum. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 int reject_local_align (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 /* Ironically, the errors below are on different lines for each
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 of the two declarations if the aligned attribute is on a line
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 of its own. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 ALIGN (ALIGN_TOO_BIG_OFILE) static char aligned_sl_max; /* { dg-error "requested alignment .\[0-9\]+. exceeds\( object file\)* maximum \[0-9\]+" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 _Alignas (ALIGN_TOO_BIG_OFILE) static char alignas_sl_max; /* { dg-error "alignment" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 return aligned_sl_max++ + alignas_sl_max++;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 /* Verify that global variables are subject to the object file
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 alignment limit. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 ALIGN (ALIGN_TOO_BIG_OFILE) char a_max_x_2; /* { dg-error "requested alignment .\[0-9\]+. exceeds\( object file\)* maximum \[0-9\]+" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 _Alignas (ALIGN_TOO_BIG_OFILE) char a_max_x_2; /* { dg-error "alignment" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 ALIGN (ALIGN_TOO_BIG_OFILE) void f_max_x_2 (void); /* { dg-error "requested alignment .\[0-9\]+. exceeds\( object file\)* maximum \[0-9\]+" } */