1 /* Check that the GOT pointer is being initialized correctly to allow
2    access to the full 64K maximum GOT size for -fpic, rather than only 32K
3    (which would happen if the GOT pointer points to the base of the GOT,
4    as the GOT16 and CALL16 relocations are signed).  */
5 
6 /* { dg-options "-fpic" } */
7 /* { dg-do run { target nios2-*-linux-gnu } } */
8 
9 extern void abort (void);
10 
11 static int n = 0;
12 
13 void
doit(int m)14 doit (int m)
15 {
16   if (m != n)
17     abort ();
18   n++;
19 }
20 
21 #define X(N) \
22   void f_##N (void) { doit (0x##N); }
23 
24 #define F(N) f_##N ();
25 
26 #define A(N) \
27   X(N##0) X(N##1) X(N##2) X(N##3) X(N##4) X(N##5) X(N##6) X(N##7) \
28   X(N##8) X(N##9) X(N##a) X(N##b) X(N##c) X(N##d) X(N##e) X(N##f) \
29   void f_##N (void) { \
30     F(N##0) F(N##1) F(N##2) F(N##3) F(N##4) F(N##5) F(N##6) F(N##7) \
31     F(N##8) F(N##9) F(N##a) F(N##b) F(N##c) F(N##d) F(N##e) F(N##f) \
32     }
33 
34 #define B(N) \
35   A(N##0) A(N##1) A(N##2) A(N##3) A(N##4) A(N##5) A(N##6) A(N##7) \
36   A(N##8) A(N##9) A(N##a) A(N##b) A(N##c) A(N##d) A(N##e) A(N##f) \
37   void f_##N (void) { \
38     F(N##0) F(N##1) F(N##2) F(N##3) F(N##4) F(N##5) F(N##6) F(N##7) \
39     F(N##8) F(N##9) F(N##a) F(N##b) F(N##c) F(N##d) F(N##e) F(N##f) \
40     }
41 
42 #define C(N) \
43   B(N##0) B(N##1) B(N##2) B(N##3) B(N##4) B(N##5) B(N##6) B(N##7) \
44   B(N##8) B(N##9) B(N##a) B(N##b) B(N##c) B(N##d) B(N##e) B(N##f) \
45   void f_##N (void) { \
46     F(N##0) F(N##1) F(N##2) F(N##3) F(N##4) F(N##5) F(N##6) F(N##7) \
47     F(N##8) F(N##9) F(N##a) F(N##b) F(N##c) F(N##d) F(N##e) F(N##f) \
48     }
49 
50 #define D(N) \
51   C(N##0) C(N##1) C(N##2) \
52   void f_##N (void) { \
53     F(N##0) F(N##1) F(N##2) \
54     }
55 
56 /* This defines 16x16x16x3 leaf functions, requiring something over
57    48K of GOT space overall.  */
58 D(0)
59 
60 int
main(void)61 main (void)
62 {
63   f_0 ();
64   if (n != 16*16*16*3)
65     abort ();
66   return 0;
67 }
68