1 // REQUIRES: xcore-registered-target
2 // RUN: %clang_cc1 -triple xcore-unknown-unknown -fno-signed-char -fno-common -emit-llvm -o - %s | FileCheck %s
4 // CHECK: target triple = "xcore-unknown-unknown"
6 // In the tests below, some types are not supported by the ABI (_Complex,
7 // variable length arrays) and will thus emit no meta data.
8 // The 38 tests that do emit typestrings are gathered into '!xcore.typestrings'
9 // Please see 'Tools Development Guide' section 2.16.2 for format details:
10 // <https://www.xmos.com/download/public/Tools-Development-Guide%28X9114A%29.pdf>
12 // CHECK: !xcore.typestrings = !{
13 // CHECK: !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}},
14 // CHECK: !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}},
15 // CHECK: !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}},
16 // CHECK: !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}},
17 // CHECK: !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}},
18 // CHECK: !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}},
19 // CHECK: !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}},
20 // CHECK: !{{[0-9]+}}, !{{[0-9]+}}, !{{[0-9]+}}
21 // CHECK-NOT: , !{{[0-9]+}}
26 // CHECK: !{{[0-9]+}} = !{void (i1, i8, i8, i8, i16, i16, i16, i32, i32, i32,
27 // CHECK: i32, i32, i32, i64, i64, i64, float, double, double)*
28 // CHECK: @builtinType, !"f{0}(b,uc,uc,sc,ss,us,ss,si,ui,si,sl,
29 // CHECK: ul,sl,sll,ull,sll,ft,d,ld)"}
30 void builtinType(_Bool B, char C, unsigned char UC, signed char SC, short S,
31 unsigned short US, signed short SS, int I, unsigned int UI,
32 signed int SI, long L, unsigned long UL, signed long SL,
33 long long LL, unsigned long long ULL, signed long long SLL,
34 float F, double D, long double LD) {}
35 double _Complex Complex; // not supported
38 // test FunctionType & Qualifiers
39 // CHECK: !{{[0-9]+}} = !{void ()* @gI, !"f{0}()"}
40 // CHECK: !{{[0-9]+}} = !{void (...)* @eI, !"f{0}()"}
41 // CHECK: !{{[0-9]+}} = !{void ()* @gV, !"f{0}(0)"}
42 // CHECK: !{{[0-9]+}} = !{void ()* @eV, !"f{0}(0)"}
43 // CHECK: !{{[0-9]+}} = !{void (i32, ...)* @gVA, !"f{0}(si,va)"}
44 // CHECK: !{{[0-9]+}} = !{void (i32, ...)* @eVA, !"f{0}(si,va)"}
45 // CHECK: !{{[0-9]+}} = !{i32* (i32*)* @gQ, !"f{crv:p(cv:si)}(p(cv:si))"}
46 // CHECK: !{{[0-9]+}} = !{i32* (i32*)* @eQ, !"f{crv:p(cv:si)}(p(cv:si))"}
51 extern void eVA(int, ...);
52 void gVA(int i, ...) {eVA(i);}
53 extern const volatile int* volatile restrict const
54 eQ(const volatile int * volatile restrict const);
55 const volatile int* volatile restrict const
56 gQ(const volatile int * volatile restrict const i) {return eQ(i);}
60 // CHECK: !{{[0-9]+}} = !{i32* (i32*, i32* (i32*)*)*
61 // CHECK: @pointerType, !"f{p(si)}(p(si),p(f{p(si)}(p(si))))"}
62 // CHECK: !{{[0-9]+}} = !{i32** @EP, !"p(si)"}
63 // CHECK: !{{[0-9]+}} = !{i32** @GP, !"p(si)"}
66 int* pointerType(int *I, int * (*FP)(int *)) {
71 // CHECK: !{{[0-9]+}} = !{[2 x i32]* (i32*, i32*, [2 x i32]*, [2 x i32]*, i32*)*
72 // CHECK: @arrayType, !"f{p(a(2:si))}(p(si),p(cv:si),p(a(2:si)),
73 // CHECK: p(a(2:si)),p(si))"}
74 // CHECK: !{{[0-9]+}} = !{[0 x i32]* @EA1, !"a(*:cv:si)"}
75 // CHECK: !{{[0-9]+}} = !{[2 x i32]* @EA2, !"a(2:si)"}
76 // CHECK: !{{[0-9]+}} = !{[0 x [2 x i32]]* @EA3, !"a(*:a(2:si))"}
77 // CHECK: !{{[0-9]+}} = !{[3 x [2 x i32]]* @EA4, !"a(3:a(2:si))"}
78 // CHECK: !{{[0-9]+}} = !{[2 x i32]* @GA1, !"a(2:cv:si)"}
79 // CHECK: !{{[0-9]+}} = !{void ([2 x i32]*)* @arrayTypeVariable1,
80 // CHECK: !"f{0}(p(a(2:si)))"}
81 // CHECK: !{{[0-9]+}} = !{void (void ([2 x i32]*)*)* @arrayTypeVariable2,
82 // CHECK: !"f{0}(p(f{0}(p(a(2:si)))))"}
83 // CHECK: !{{[0-9]+}} = !{[3 x [2 x i32]]* @GA2, !"a(3:a(2:si))"}
85 extern const volatile int EA1[];
89 const volatile int GA1[2];
90 extern void arrayTypeVariable1(int[*][2]);
91 extern void arrayTypeVariable2( void(*fp)(int[*][2]) );
92 extern void arrayTypeVariable3(int[3][*]); // not supported
93 extern void arrayTypeVariable4( void(*fp)(int[3][*]) ); // not supported
94 typedef int RetType[2];
95 RetType* arrayType(int A1[], int const volatile A2[2], int A3[][2],
96 int A4[3][2], int A5[const volatile restrict static 2]) {
97 if (A1) EA2[0] = EA1[0];
101 if (A5) EA2[0] = GA1[0];
102 arrayTypeVariable1(EA4);
103 arrayTypeVariable2(arrayTypeVariable1);
104 arrayTypeVariable3(EA4);
105 arrayTypeVariable4(arrayTypeVariable3);
110 // test StructureType
111 // CHECK: !{{[0-9]+}} = !{void (%struct.S1*)* @structureType1,
112 // CHECK: !"f{0}(s(S1){m(ps2){p(s(S2){m(ps3){p(s(S3){m(s1){s(S1){}}})}})}})"}
113 // CHECK: !{{[0-9]+}} = !{void (%struct.S2*)* @structureType2,
114 // CHECK: !"f{0}(s(S2){m(ps3){p(s(S3){m(s1){s(S1){m(ps2){p(s(S2){})}}}})}})"}
115 // CHECK: !{{[0-9]+}} = !{void (%struct.S3*)* @structureType3,
116 // CHECK: !"f{0}(s(S3){m(s1){s(S1){m(ps2){p(s(S2){m(ps3){p(s(S3){})}})}}}})"}
117 // CHECK: !{{[0-9]+}} = !{void (%struct.S4*)* @structureType4,
118 // CHECK: !"f{0}(s(S4){m(s1){s(S1){m(ps2){p(s(S2){m(ps3){p(s(S3){m(s1){s(S1){}}})}})}}}})"}
119 // CHECK: !{{[0-9]+}} = !{%struct.anon* @StructAnon, !"s(){m(A){si}}"}
120 // CHECK: !{{[0-9]+}} = !{i32 (%struct.SB*)* @structureTypeB,
121 // CHECK: !"f{si}(s(SB){m(){b(4:si)},m(){b(2:si)},m(N4){b(4:si)},
122 // CHECK: m(N2){b(2:si)},m(){b(4:ui)},m(){b(4:si)},m(){b(4:c:si)},
123 // CHECK: m(){b(4:c:si)},m(){b(4:cv:si)}})"}
125 struct S1{struct S2 *ps2;};
127 struct S2{struct S3 *ps3;};
128 struct S3{struct S1 s1;};
129 struct S4{struct S1 s1;};
130 void structureType1(struct S1 s1){}
131 void structureType2(struct S2 s2){}
132 void structureType3(struct S3 s3){}
133 void structureType4(struct S4 s4){}
134 struct {int A;} StructAnon = {1};
135 struct SB{int:4; int:2; int N4:4; int N2:2; unsigned int:4; signed int:4;
136 const int:4; int const :4; volatile const int:4;};
137 int structureTypeB(struct SB sb){return StructAnon.A;}
141 // CHECK: !{{[0-9]+}} = !{void (%union.U1*)* @unionType1,
142 // CHECK: !"f{0}(u(U1){m(pu2){p(u(U2){m(pu3){p(u(U3){m(u1){u(U1){}}})}})}})"}
143 // CHECK: !{{[0-9]+}} = !{void (%union.U2*)* @unionType2,
144 // CHECK: !"f{0}(u(U2){m(pu3){p(u(U3){m(u1){u(U1){m(pu2){p(u(U2){})}}}})}})"}
145 // CHECK: !{{[0-9]+}} = !{void (%union.U3*)* @unionType3,
146 // CHECK: !"f{0}(u(U3){m(u1){u(U1){m(pu2){p(u(U2){m(pu3){p(u(U3){})}})}}}})"}
147 // CHECK: !{{[0-9]+}} = !{void (%union.U4*)* @unionType4,
148 // CHECK: !"f{0}(u(U4){m(u1){u(U1){m(pu2){p(u(U2){m(pu3){p(u(U3){m(u1){u(U1){}}})}})}}}})"}
149 // CHECK: !{{[0-9]+}} = !{%union.anon* @UnionAnon, !"u(){m(A){si}}"}
150 // CHECK: !{{[0-9]+}} = !{i32 (%union.UB*)* @unionTypeB,
151 // CHECK: !"f{si}(u(UB){m(N2){b(2:si)},m(N4){b(4:si)},m(){b(2:si)},
152 // CHECK: m(){b(4:c:si)},m(){b(4:c:si)},m(){b(4:cv:si)},m(){b(4:si)},
153 // CHECK: m(){b(4:si)},m(){b(4:ui)}})"}
155 union U1{union U2 *pu2;};
157 union U2{union U3 *pu3;};
158 union U3{union U1 u1;};
159 union U4{union U1 u1;};
160 void unionType1(union U1 u1) {}
161 void unionType2(union U2 u2) {}
162 void unionType3(union U3 u3) {}
163 void unionType4(union U4 u4) {}
164 union UB{int:4; int:2; int N4:4; int N2:2; unsigned int:4; signed int:4;
165 const int:4; int const :4; volatile const int:4;};
166 union {int A;} UnionAnon = {1};
167 int unionTypeB(union UB ub) {return UnionAnon.A;}
171 // CHECK: !{{[0-9]+}} = !{i32* @EnumAnon, !"e(){m(EA){3}}"}
172 // CHECK: !{{[0-9]+}} = !{i32 (i32)* @enumType,
173 // CHECK: !"f{si}(e(E){m(A){7},m(B){6},m(C){5},m(D){0}})"}
174 enum E {D, C=5, B, A};
175 enum {EA=3} EnumAnon = EA;
176 int enumType(enum E e) {return EnumAnon;}
179 // CHECK: !{{[0-9]+}} = !{i32 ()* @testReDecl, !"f{si}()"}
180 // CHECK: !{{[0-9]+}} = !{[10 x i32]* @After, !"a(10:si)"}
181 // CHECK: !{{[0-9]+}} = !{[10 x i32]* @Before, !"a(10:si)"}
183 extern int Before[10];
184 int testReDecl() {return After[0] + Before[0];}