118 lines
2.0 KiB
C
118 lines
2.0 KiB
C
|
/* First C source file for actual execution test. */
|
||
|
|
||
|
/* The main point of this test is to make sure that the code and data
|
||
|
are truly position independent. We statically initialize several
|
||
|
global variables, and make sure that they are correctly adjusted at
|
||
|
runtime. */
|
||
|
|
||
|
int i = 1;
|
||
|
int j = 0;
|
||
|
extern int k;
|
||
|
int l;
|
||
|
char small_buf[] = "aaaa";
|
||
|
char *small_pointer = small_buf;
|
||
|
char big_buf[] = "aaaaaaaaaaaaaaaa";
|
||
|
char *big_pointer = big_buf;
|
||
|
|
||
|
extern int bar ();
|
||
|
int (*pbar) () = bar;
|
||
|
|
||
|
static int
|
||
|
foo2 (arg)
|
||
|
int arg;
|
||
|
{
|
||
|
l = arg;
|
||
|
return i + j;
|
||
|
}
|
||
|
|
||
|
int (*pfoo2) () = foo2;
|
||
|
|
||
|
int
|
||
|
chkstr (z, c)
|
||
|
char *z;
|
||
|
int c;
|
||
|
{
|
||
|
/* Switch statements need extra effort to be position independent,
|
||
|
so we run one here, even though most of the cases will never be
|
||
|
taken. */
|
||
|
switch (c)
|
||
|
{
|
||
|
case 1:
|
||
|
case 2:
|
||
|
case 3:
|
||
|
return i - 1;
|
||
|
case 4:
|
||
|
break;
|
||
|
case 5:
|
||
|
case 6:
|
||
|
case 7:
|
||
|
case 8:
|
||
|
case 9:
|
||
|
return i * j;
|
||
|
case 10:
|
||
|
case 11:
|
||
|
case 12:
|
||
|
case 13:
|
||
|
case 14:
|
||
|
case 15:
|
||
|
return j;
|
||
|
case 16:
|
||
|
break;
|
||
|
default:
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
while (c-- != 0)
|
||
|
if (*z++ != 'a')
|
||
|
return 0;
|
||
|
|
||
|
return *z == '\0';
|
||
|
}
|
||
|
|
||
|
/* This function is called by the assembler startup routine. It tries
|
||
|
to test that everything was correctly initialized. It returns 0 on
|
||
|
success, something else on failure. */
|
||
|
|
||
|
int
|
||
|
foo ()
|
||
|
{
|
||
|
if (i != 1)
|
||
|
return 1;
|
||
|
if (j != 0)
|
||
|
return 2;
|
||
|
if (! chkstr (small_buf, 4))
|
||
|
return 3;
|
||
|
if (! chkstr (small_pointer, 4))
|
||
|
return 4;
|
||
|
if (! chkstr (big_buf, 16))
|
||
|
return 5;
|
||
|
if (! chkstr (big_pointer, 16))
|
||
|
return 6;
|
||
|
|
||
|
if (l != 0)
|
||
|
return 7;
|
||
|
if (foo2 (1) != 1)
|
||
|
return 8;
|
||
|
if (l != 1)
|
||
|
return 9;
|
||
|
if ((*pfoo2) (2) != 1)
|
||
|
return 10;
|
||
|
if (l != 2)
|
||
|
return 11;
|
||
|
|
||
|
if (bar (1) != 0)
|
||
|
return 12;
|
||
|
if (bar (-1) != 1)
|
||
|
return 13;
|
||
|
if ((*pbar) (0xa5a5a5a5) != -1)
|
||
|
return 14;
|
||
|
if (k != 0xa5a5a5a5)
|
||
|
return 15;
|
||
|
if ((*pbar) (0) != 0xa5a5a5a5)
|
||
|
return 16;
|
||
|
if (k != 0)
|
||
|
return 17;
|
||
|
|
||
|
return 0;
|
||
|
}
|