1 /* { dg-options "-fPIE -mpic-data-text-rel -save-temps" } */
2 /* { dg-do run } */
3 
4 #define TEST_VAR(var,val) (var) = (val); if( (var) != (val)) return 0;
5 
6 int foo(unsigned int i);
7 extern void abort(void);
8 extern void exit(int);
9 
10 unsigned char data[8];
11 long bigData[7];
12 long var;
13 typedef struct {int a; short b; long c[1000][1000]; long long d[3][3]; char e; } myDef;
14 myDef def;
15 const char* myString;
16 
17 /* { dg-final { scan-assembler "mfs\tr20,rpc" } } */
18 /* { dg-final { scan-assembler "addik\tr20,r20,8@TXTPCREL" } } */
19 /* { dg-final { scan-assembler ",r20,\[^\n]*var\[^\n]*@TXTREL" } } */
20 /* { dg-final { scan-assembler-not ",r0,\[^\n]*var" } } */
21 /* { dg-final { scan-assembler ",r20,\[^\n]*bigData\[^\n]*@TXTREL" } } */
22 /* { dg-final { scan-assembler-not ",r0,\[^\n]*bigData" } } */
23 /* { dg-final { scan-assembler ",r20,\[^\n]*def\[^\n]*@TXTREL" } } */
24 /* { dg-final { scan-assembler-not ",r0,\[^\n]*def" } } */
25 /* { dg-final { scan-assembler ",r20,\[^\n]*data\[^\n]*@TXTREL" } } */
26 /* { dg-final { scan-assembler-not ",r0,\[^\n]*data" } } */
27 /* { dg-final { scan-assembler ",r20,\[^\n]*L\[^\n]*@TXTREL" } } */
28 /* { dg-final { scan-assembler-not ",r0,\[^\n]*L" } } */
29 
30 
31 
foo2()32 void foo2() {
33 	var++;
34 }
35 
foo(unsigned int i)36 int foo (unsigned int i) {
37 
38 	TEST_VAR(var,123)
39 	TEST_VAR(data[i],77)
40 	TEST_VAR(data[2],88)
41 	TEST_VAR(def.a,897)
42 	TEST_VAR(bigData[i],78)
43 	TEST_VAR(bigData[2],777)
44 	TEST_VAR(def.b,12333);
45 	TEST_VAR(def.c[i][i],5);
46 	TEST_VAR(def.c[0][1],7);
47 	TEST_VAR(def.d[1][2],123);
48 	TEST_VAR(def.e,7);
49 	TEST_VAR(bigData[i+1],bigData[i*2]);
50 
51 	foo2();
52 
53 	myString = "Hello";
54 
55 	switch(i){
56 
57 	case 1: var += 2; break;
58 	case 2: var += 3; break;
59 	case 3: var += 5; break;
60 	case 4: var += 7; break;
61 	case 5: var += 8; break;
62 	default: var = 0;
63 
64 	}
65 
66 	return 1;
67 
68 }
69 
main()70 int main() {
71 
72 	int result = foo(3);
73 	if(result != 1 || var != 129) {
74 		abort();
75 	}
76 
77 	exit(0);
78 
79 }
80 
81 /* { dg-options "-fPIE -mpic-data-is-text-relative -save-temps" } */
82 /* { dg-do run } */
83 
84 #define TEST_VAR(var,val) (var) = (val); if( (var) != (val)) return 0;
85 
86 int foo(unsigned int i);
87 extern void abort(void);
88 extern void exit(int);
89 
90 unsigned char data[8];
91 long bigData[7];
92 long var;
93 typedef struct {int a; short b; long c[1000][1000]; long long d[3][3]; char e; } myDef;
94 myDef def;
95 const char* myString;
96 
97 /* { dg-final { scan-assembler "mfs\tr20,rpc" } } */
98 /* { dg-final { scan-assembler "addik\tr20,r20,8@TXTPCREL" } } */
99 /* { dg-final { scan-assembler ",r20,\[^\n]*var\[^\n]*@TXTREL" } } */
100 /* { dg-final { scan-assembler-not ",r0,\[^\n]*var" } } */
101 /* { dg-final { scan-assembler ",r20,\[^\n]*bigData\[^\n]*@TXTREL" } } */
102 /* { dg-final { scan-assembler-not ",r0,\[^\n]*bigData" } } */
103 /* { dg-final { scan-assembler ",r20,\[^\n]*def\[^\n]*@TXTREL" } } */
104 /* { dg-final { scan-assembler-not ",r0,\[^\n]*def" } } */
105 /* { dg-final { scan-assembler ",r20,\[^\n]*data\[^\n]*@TXTREL" } } */
106 /* { dg-final { scan-assembler-not ",r0,\[^\n]*data" } } */
107 /* { dg-final { scan-assembler ",r20,\[^\n]*L\[^\n]*@TXTREL" } } */
108 /* { dg-final { scan-assembler-not ",r0,\[^\n]*L" } } */
109 
110 
111 
foo2()112 void foo2() {
113 	var++;
114 }
115 
foo(unsigned int i)116 int foo (unsigned int i) {
117 
118 	TEST_VAR(var,123)
119 	TEST_VAR(data[i],77)
120 	TEST_VAR(data[2],88)
121 	TEST_VAR(def.a,897)
122 	TEST_VAR(bigData[i],78)
123 	TEST_VAR(bigData[2],777)
124 	TEST_VAR(def.b,12333);
125 	TEST_VAR(def.c[i][i],5);
126 	TEST_VAR(def.c[0][1],7);
127 	TEST_VAR(def.d[1][2],123);
128 	TEST_VAR(def.e,7);
129 	TEST_VAR(bigData[i+1],bigData[i*2]);
130 
131 	foo2();
132 
133 	myString = "Hello";
134 
135 	switch(i){
136 
137 	case 1: var += 2; break;
138 	case 2: var += 3; break;
139 	case 3: var += 5; break;
140 	case 4: var += 7; break;
141 	case 5: var += 8; break;
142 	default: var = 0;
143 
144 	}
145 
146 	return 1;
147 
148 }
149 
main()150 int main() {
151 
152 	int result = foo(3);
153 	if(result != 1 || var != 129) {
154 		abort();
155 	}
156 
157 	exit(0);
158 
159 }
160 
161