Upload Tizen:Base source
[external/binutils.git] / ld / testsuite / ld-elfvsb / sh1.c
1 #ifndef NULL
2 #define NULL ((void *) 0)
3 #endif
4
5 /* This is part of the shared library ld test.  This file becomes part
6    of a shared library.  */
7
8 /* This variable is supplied by the main program.  */
9 #ifndef XCOFF_TEST
10 extern int mainvar;
11 #endif
12
13 /* This variable is defined in the shared library, and overridden by
14    the main program.  */
15 #ifndef XCOFF_TEST
16 #ifdef SHARED
17 /* SHARED is defined if we are compiling with -fpic/-fPIC.  */
18 int overriddenvar = -1;
19 #else
20 /* Without -fpic, newer versions of gcc assume that we are not
21    compiling for a shared library, and thus that overriddenvar is
22    local.  */
23 extern int overriddenvar;
24 #endif
25 #endif
26
27 /* This variable is defined in the shared library.  */
28 int shlibvar1 = 3;
29
30 /* This variable is defined by another object in the shared library.  */
31 extern int shlibvar2;
32
33 /* These functions return the values of the above variables as seen in
34    the shared library.  */
35
36 #ifndef XCOFF_TEST
37 int
38 shlib_mainvar ()
39 {
40   return mainvar;
41 }
42 #endif
43
44 #ifndef XCOFF_TEST
45 int
46 shlib_overriddenvar ()
47 {
48   return overriddenvar;
49 }
50 #endif
51
52 int
53 shlib_shlibvar1 ()
54 {
55   return shlibvar1;
56 }
57
58 int
59 shlib_shlibvar2 ()
60 {
61   return shlibvar2;
62 }
63
64 /* This function calls a function defined by another object in the
65    shared library.  */
66
67 extern int shlib_shlibcalled ();
68
69 int
70 shlib_shlibcall ()
71 {
72   return shlib_shlibcalled ();
73 }
74
75 #ifndef XCOFF_TEST
76 /* This function calls a function defined in this object in the shared
77    library.  The main program will override the called function.  */
78
79 extern int shlib_overriddencall2 ();
80
81 int
82 shlib_shlibcall2 ()
83 {
84   return shlib_overriddencall2 ();
85 }
86
87 #ifdef SHARED
88 int
89 shlib_overriddencall2 ()
90 {
91   return 7;
92 }
93 #endif
94 #endif
95
96 /* This function calls a function defined by the main program.  */
97
98 #ifndef XCOFF_TEST
99 extern int main_called ();
100
101 int
102 shlib_maincall ()
103 {
104   return main_called ();
105 }
106 #endif
107
108 /* This function is passed a function pointer to shlib_mainvar.  It
109    confirms that the pointer compares equally.  */
110
111 int 
112 shlib_checkfunptr1 (p)
113      int (*p) ();
114 {
115   return p == shlib_shlibvar1;
116 }
117
118 /* This function is passed a function pointer to main_called.  It
119    confirms that the pointer compares equally.  */
120
121 #ifndef XCOFF_TEST
122 int
123 shlib_checkfunptr2 (p)
124      int (*p) ();
125 {
126   return p == main_called;
127 }
128 #endif
129
130 /* This function returns a pointer to shlib_mainvar.  */
131
132 int
133 (*shlib_getfunptr1 ()) ()
134 {
135   return shlib_shlibvar1;
136 }
137
138 /* This function returns a pointer to main_called.  */
139
140 #ifndef XCOFF_TEST
141 int
142 (*shlib_getfunptr2 ()) ()
143 {
144   return main_called;
145 }
146 #endif
147
148 /* This function makes sure that constant data and local functions
149    work.  */
150
151 #ifndef __STDC__
152 #define const
153 #endif
154
155 static int i = 6;
156 static const char *str = "Hello, world\n";
157
158 int
159 shlib_check ()
160 {
161   const char *s1, *s2;
162
163   if (i != 6)
164     return 0;
165
166   /* To isolate the test, don't rely on any external functions, such
167      as strcmp.  */
168   s1 = "Hello, world\n";
169   s2 = str;
170   while (*s1 != '\0')
171     if (*s1++ != *s2++)
172       return 0;
173   if (*s2 != '\0')
174     return 0;
175
176   if (shlib_shlibvar1 () != 3)
177     return 0;
178
179   return 1;
180 }
181
182 #ifdef HIDDEN_WEAK_TEST
183 #define HIDDEN_UNDEF_TEST
184 #define WEAK_TEST
185 #endif
186
187 #ifdef PROTECTED_WEAK_TEST
188 #define PROTECTED_UNDEF_TEST
189 #define WEAK_TEST
190 #endif
191
192 #if defined (HIDDEN_UNDEF_TEST) || defined (PROTECTED_UNDEF_TEST)
193 #ifdef WEAK_TEST
194 #pragma weak visibility
195 #endif
196 extern int visibility ();
197 #else
198 int
199 visibility ()
200 {
201   return 2;
202 }
203 #endif
204
205 #ifdef HIDDEN_NORMAL_TEST
206 asm (".hidden visibility_normal");
207
208 int
209 visibility_normal ()
210 {
211   return 2;
212 }
213 #endif
214
215 int
216 visibility_checkfunptr ()
217 {
218 #ifdef WEAK_TEST
219   return 1;
220 #else
221 #ifdef HIDDEN_NORMAL_TEST
222   int (*v) () = visibility_normal;
223 #else
224   int (*v) () = visibility;
225 #endif
226   return (*v) () == 2;
227 #endif
228 }
229
230 int
231 visibility_check ()
232 {
233 #ifdef WEAK_TEST
234   if (&visibility)
235     return visibility () == 1;
236   else
237     return 1;
238 #else
239 #ifdef HIDDEN_NORMAL_TEST
240   return visibility_normal () == 2;
241 #else
242   return visibility () == 2;
243 #endif
244 #endif
245 }
246
247 void *
248 visibility_funptr ()
249 {
250 #ifdef WEAK_TEST
251   if (&visibility == NULL)
252     return NULL;
253   else
254 #endif
255     return visibility;
256 }
257
258 #if defined (HIDDEN_UNDEF_TEST) || defined (PROTECTED_UNDEF_TEST)
259 #ifdef WEAK_TEST
260 #pragma weak visibility_var
261 #endif
262 extern int visibility_var;
263 #else
264 int visibility_var = 2;
265 #endif
266
267 #ifdef HIDDEN_NORMAL_TEST
268 asm (".hidden visibility_var_normal");
269
270 int visibility_var_normal = 2;
271 #endif
272
273 int
274 visibility_checkvarptr ()
275 {
276 #ifdef WEAK_TEST
277   if (&visibility_var)
278     return visibility_var == 1;
279   else
280     return 1;
281 #else
282 #ifdef HIDDEN_NORMAL_TEST
283   int *v = &visibility_var_normal;
284 #else
285   int *v = &visibility_var;
286 #endif
287   return *v == 2;
288 #endif
289 }
290
291 int
292 visibility_checkvar ()
293 {
294 #ifdef WEAK_TEST
295   return 1;
296 #else
297 #ifdef HIDDEN_NORMAL_TEST
298   return visibility_var_normal == 2;
299 #else
300   return visibility_var == 2;
301 #endif
302 #endif
303 }
304
305 void *
306 visibility_varptr ()
307 {
308 #ifdef WEAK_TEST
309   if (&visibility_var == NULL)
310     return NULL;
311   else
312 #endif
313     return &visibility_var;
314 }
315
316 int
317 visibility_varval ()
318 {
319 #ifdef WEAK_TEST
320   if (&visibility_var == NULL)
321     return 0;
322   else
323 #endif
324     return visibility_var;
325 }
326
327 #if defined (HIDDEN_TEST) || defined (HIDDEN_UNDEF_TEST)
328 asm (".hidden visibility");
329 asm (".hidden visibility_var");
330 #else
331 #if defined (PROTECTED_TEST) || defined (PROTECTED_UNDEF_TEST) || defined (PROTECTED_WEAK_TEST)
332 asm (".protected visibility");
333 asm (".protected visibility_var");
334 #endif
335 #endif
336
337 #ifdef HIDDEN_NORMAL_TEST
338 int shlib_visibility_com;
339 asm (".hidden shlib_visibility_com");
340
341 int
342 shlib_visibility_checkcom ()
343 {
344   return shlib_visibility_com == 0;
345 }
346
347 int
348 shlib_visibility_checkweak ()
349 {
350   return 1;
351 }
352 #elif defined (HIDDEN_WEAK_TEST)
353 #pragma weak shlib_visibility_undef_var_weak
354 extern int shlib_visibility_undef_var_weak;
355 asm (".hidden shlib_visibility_undef_var_weak");
356
357 #pragma weak shlib_visibility_undef_func_weak
358 extern int shlib_visibility_undef_func_weak ();
359 asm (".hidden shlib_visibility_undef_func_weak");
360
361 #pragma weak shlib_visibility_var_weak
362 extern int shlib_visibility_var_weak;
363 asm (".hidden shlib_visibility_var_weak");
364
365 #pragma weak shlib_visibility_func_weak
366 extern int shlib_visibility_func_weak ();
367 asm (".hidden shlib_visibility_func_weak");
368
369 int
370 shlib_visibility_checkcom ()
371 {
372   return 1;
373 }
374
375 int
376 shlib_visibility_checkweak ()
377 {
378   return &shlib_visibility_undef_var_weak == NULL
379          && &shlib_visibility_undef_func_weak == NULL
380          && &shlib_visibility_func_weak == NULL
381          && &shlib_visibility_var_weak == NULL;
382 }
383 #else
384 int
385 shlib_visibility_checkcom ()
386 {
387   return 1;
388 }
389
390 int
391 shlib_visibility_checkweak ()
392 {
393   return 1;
394 }
395 #endif
396
397 #ifdef PROTECTED_TEST
398 #ifdef SHARED
399 int shared_data = 100;
400 #else
401 extern int shared_data;
402 #endif
403  
404 int *
405 shared_data_p ()
406 {
407   return &shared_data;
408 }
409  
410 int
411 shared_func ()
412 {
413   return 100;
414 }
415  
416 void *
417 shared_func_p ()
418 {
419   return shared_func;
420 }
421 #endif