Commit | Line | Data |
---|---|---|
3c247606 ILT |
1 | /* First C source file for actual execution test. */ |
2 | ||
3 | /* The main point of this test is to make sure that the code and data | |
4 | are truly position independent. We statically initialize several | |
5 | global variables, and make sure that they are correctly adjusted at | |
6 | runtime. */ | |
7 | ||
8 | int i = 1; | |
9 | int j = 0; | |
10 | extern int k; | |
11 | int l; | |
12 | char small_buf[] = "aaaa"; | |
13 | char *small_pointer = small_buf; | |
14 | char big_buf[] = "aaaaaaaaaaaaaaaa"; | |
15 | char *big_pointer = big_buf; | |
16 | ||
17 | extern int bar (); | |
18 | int (*pbar) () = bar; | |
19 | ||
20 | static int | |
21 | foo2 (arg) | |
22 | int arg; | |
23 | { | |
24 | l = arg; | |
25 | return i + j; | |
26 | } | |
27 | ||
28 | int (*pfoo2) () = foo2; | |
29 | ||
30 | int | |
31 | chkstr (z, c) | |
32 | char *z; | |
33 | int c; | |
34 | { | |
35 | /* Switch statements need extra effort to be position independent, | |
36 | so we run one here, even though most of the cases will never be | |
37 | taken. */ | |
38 | switch (c) | |
39 | { | |
40 | case 1: | |
41 | case 2: | |
42 | case 3: | |
43 | return i - 1; | |
44 | case 4: | |
45 | break; | |
46 | case 5: | |
47 | case 6: | |
48 | case 7: | |
49 | case 8: | |
50 | case 9: | |
51 | return i * j; | |
52 | case 10: | |
53 | case 11: | |
54 | case 12: | |
55 | case 13: | |
56 | case 14: | |
57 | case 15: | |
58 | return j; | |
59 | case 16: | |
60 | break; | |
61 | default: | |
62 | return 0; | |
63 | } | |
64 | ||
65 | while (c-- != 0) | |
66 | if (*z++ != 'a') | |
67 | return 0; | |
68 | ||
69 | return *z == '\0'; | |
70 | } | |
71 | ||
72 | /* This function is called by the assembler startup routine. It tries | |
73 | to test that everything was correctly initialized. It returns 0 on | |
74 | success, something else on failure. */ | |
75 | ||
76 | int | |
77 | foo () | |
78 | { | |
79 | if (i != 1) | |
80 | return 1; | |
81 | if (j != 0) | |
82 | return 2; | |
83 | if (! chkstr (small_buf, 4)) | |
84 | return 3; | |
85 | if (! chkstr (small_pointer, 4)) | |
86 | return 4; | |
87 | if (! chkstr (big_buf, 16)) | |
88 | return 5; | |
89 | if (! chkstr (big_pointer, 16)) | |
90 | return 6; | |
91 | ||
92 | if (l != 0) | |
93 | return 7; | |
94 | if (foo2 (1) != 1) | |
95 | return 8; | |
96 | if (l != 1) | |
97 | return 9; | |
98 | if ((*pfoo2) (2) != 1) | |
99 | return 10; | |
100 | if (l != 2) | |
101 | return 11; | |
102 | ||
103 | if (bar (1) != 0) | |
104 | return 12; | |
105 | if (bar (-1) != 1) | |
106 | return 13; | |
107 | if ((*pbar) (0xa5a5a5a5) != -1) | |
108 | return 14; | |
109 | if (k != 0xa5a5a5a5) | |
110 | return 15; | |
111 | if ((*pbar) (0) != 0xa5a5a5a5) | |
112 | return 16; | |
113 | if (k != 0) | |
114 | return 17; | |
115 | ||
116 | return 0; | |
117 | } |