Home | History | Annotate | Download | only in Sema
      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.
      7 struct non_aligned_struct {
      8     int some_data[16]; // 64 bytes of stuff, non aligned.
      9 };
     10 
     11 // An aligned type.
     12 struct __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.
     17 struct  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.
     22 typedef aligned_struct another_aligned_struct;
     23 
     24 // A typedef to redefine a non-aligned struct as aligned.
     25 typedef __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 
     45 int 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 
     57 template<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 
     63 int 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.
     70 template <int N>
     71 struct S {
     72   static int __thread __attribute__((aligned(N))) x; // expected-error{{alignment (64) of thread-local variable}}
     73 };
     74 
     75 S<64> s_instance; // expected-note{{in instantiation of template class 'S<64>' requested here}}
     76