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)15doit (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)62main (void) 63 { 64 f_0 (); 65 if (n != 16*16*16*8) 66 abort (); 67 return 0; 68 } 69