1 /* Check that a program that requires large-GOT support builds and
2    executes without error.  This program defines a very large number
3    of leaf functions; compiled with -fPIC, they all require GOT
4    entries, which will overflow the range addressible by 16-bit -fpic
5    offsets by about a factor of 2.  */
6 
7 /* { dg-options "-fPIC" } */
8 /* { dg-do run { target nios2-*-linux-gnu } } */
9 
10 extern void abort (void);
11 
12 static int n = 0;
13 
14 void
doit(int m)15 doit (int m)
16 {
17   if (m != n)
18     abort ();
19   n++;
20 }
21 
22 #define X(N) \
23   void f_##N (void) { doit (0x##N); }
24 
25 #define F(N) f_##N ();
26 
27 #define A(N) \
28   X(N##0) X(N##1) X(N##2) X(N##3) X(N##4) X(N##5) X(N##6) X(N##7) \
29   X(N##8) X(N##9) X(N##a) X(N##b) X(N##c) X(N##d) X(N##e) X(N##f) \
30   void f_##N (void) { \
31     F(N##0) F(N##1) F(N##2) F(N##3) F(N##4) F(N##5) F(N##6) F(N##7) \
32     F(N##8) F(N##9) F(N##a) F(N##b) F(N##c) F(N##d) F(N##e) F(N##f) \
33     }
34 
35 #define B(N) \
36   A(N##0) A(N##1) A(N##2) A(N##3) A(N##4) A(N##5) A(N##6) A(N##7) \
37   A(N##8) A(N##9) A(N##a) A(N##b) A(N##c) A(N##d) A(N##e) A(N##f) \
38   void f_##N (void) { \
39     F(N##0) F(N##1) F(N##2) F(N##3) F(N##4) F(N##5) F(N##6) F(N##7) \
40     F(N##8) F(N##9) F(N##a) F(N##b) F(N##c) F(N##d) F(N##e) F(N##f) \
41     }
42 
43 #define C(N) \
44   B(N##0) B(N##1) B(N##2) B(N##3) B(N##4) B(N##5) B(N##6) B(N##7) \
45   B(N##8) B(N##9) B(N##a) B(N##b) B(N##c) B(N##d) B(N##e) B(N##f) \
46   void f_##N (void) { \
47     F(N##0) F(N##1) F(N##2) F(N##3) F(N##4) F(N##5) F(N##6) F(N##7) \
48     F(N##8) F(N##9) F(N##a) F(N##b) F(N##c) F(N##d) F(N##e) F(N##f) \
49     }
50 
51 #define D(N) \
52   C(N##0) C(N##1) C(N##2) C(N##3) C(N##4) C(N##5) C(N##6) C(N##7) \
53   void f_##N (void) { \
54     F(N##0) F(N##1) F(N##2) F(N##3) F(N##4) F(N##5) F(N##6) F(N##7) \
55     }
56 
57 /* This defines 16x16x16x8 leaf functions, requiring something over
58    128K of GOT space overall.  */
59 D(0)
60 
61 int
main(void)62 main (void)
63 {
64   f_0 ();
65   if (n != 16*16*16*8)
66     abort ();
67   return 0;
68 }
69