1// TLS variable cannot be aligned to more than 32 bytes on PS4. 2 3// RUN: %clang_cc1 -triple x86_64-scei-ps4 -fsyntax-only -verify %s 4 5 6// A non-aligned type. 7struct non_aligned_struct { 8 int some_data[16]; // 64 bytes of stuff, non aligned. 9}; 10 11// An aligned type. 12struct __attribute__(( aligned(64) )) aligned_struct { 13 int some_data[12]; // 48 bytes of stuff, aligned to 64. 14}; 15 16// A type with an aligned field. 17struct struct_with_aligned_field { 18 int some_aligned_data[12] __attribute__(( aligned(64) )); // 48 bytes of stuff, aligned to 64. 19}; 20 21// A typedef of the aligned struct. 22typedef aligned_struct another_aligned_struct; 23 24// A typedef to redefine a non-aligned struct as aligned. 25typedef __attribute__(( aligned(64) )) non_aligned_struct yet_another_aligned_struct; 26 27// Non aligned variable doesn't cause an error. 28__thread non_aligned_struct foo; 29 30// Variable aligned because of its type should cause an error. 31__thread aligned_struct bar; // expected-error{{alignment (64) of thread-local variable}} 32 33// Variable explicitly aligned in the declaration should cause an error. 34__thread non_aligned_struct bar2 __attribute__(( aligned(64) )); // expected-error{{alignment (64) of thread-local variable}} 35 36// Variable aligned because of one of its fields should cause an error. 37__thread struct_with_aligned_field bar3; // expected-error{{alignment (64) of thread-local variable}} 38 39// Variable aligned because of typedef, first case. 40__thread another_aligned_struct bar4; // expected-error{{alignment (64) of thread-local variable}} 41 42// Variable aligned because of typedef, second case. 43__thread yet_another_aligned_struct bar5; // expected-error{{alignment (64) of thread-local variable}} 44 45int baz () 46{ 47 return foo.some_data[0] + bar.some_data[1] + bar2.some_data[2] + 48 bar3.some_aligned_data[3] + bar4.some_data[4] + 49 bar5.some_data[5]; 50} 51 52 53// Verify alignment check where a dependent type is involved. 54// The check is (correctly) not performed on "t", but the check still is 55// performed on the structure as a whole once it has been instantiated. 56 57template<class T> struct templated_tls { 58 static __thread T t; 59 T other_t __attribute__(( aligned(64) )); 60}; 61__thread templated_tls<int> blah; // expected-error{{alignment (64) of thread-local variable}} 62 63int blag() { 64 return blah.other_t * 2; 65} 66 67 68// Verify alignment check where the alignment is a template parameter. 69// The check is only performed during instantiation. 70template <int N> 71struct S { 72 static int __thread __attribute__((aligned(N))) x; // expected-error{{alignment (64) of thread-local variable}} 73}; 74 75S<64> s_instance; // expected-note{{in instantiation of template class 'S<64>' requested here}} 76