978fd0cb53
Make blkarg.c an expected failure. Fix driver.c to use exit()/abort(). From-SVN: r25002
76 lines
1.9 KiB
C
76 lines
1.9 KiB
C
/* Must define:
|
|
int expect_error;
|
|
void test ();
|
|
void setup () NOCHECK; */
|
|
|
|
#include "driver.h"
|
|
|
|
/* Test permissions of BLKmode arguments constructed purely on the
|
|
stack.
|
|
|
|
Maybe we can't guarantee that we'll always wind up with stack args,
|
|
but if we don't, they're in registers, and permissions should just
|
|
always yield success. So while this test may not be effective on
|
|
all platforms, failure probably does indicate a real bug.
|
|
|
|
Note that because of the implementation, we do want to test BLKmode
|
|
arguments that live purely on the stack and are constructed there.
|
|
We want to test other situations of function arguments, of course,
|
|
but don't assume this case would be covered by using one monster
|
|
argument that is read from memory (including using constructor
|
|
syntax but constant values), or may live partially in registers. */
|
|
|
|
int expect_error = 0;
|
|
|
|
/* Must be BLKmode. Using only two fields gets TImode on Alpha. */
|
|
struct S
|
|
{
|
|
unsigned long long ll;
|
|
long xx;
|
|
long yy;
|
|
};
|
|
|
|
unsigned long long x = 0x12345689ULL;
|
|
#define I2 42
|
|
|
|
static int first_time = 1;
|
|
|
|
/* Leading ten arguments force struct S onto the stack on both Alpha and MIPS. */
|
|
int
|
|
foo (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10,
|
|
struct S s)
|
|
{
|
|
if (a1 != 1 || a2 != 2 || a3 != 3 || a4 != 4 || a5 != 5 || a6 != 6 || a7 != 7
|
|
|| a8 != 8 || a9 !=9 || a10 != 10)
|
|
abort ();
|
|
|
|
if (first_time)
|
|
{
|
|
if (s.ll != x || s.xx != I2 || s.yy != 0)
|
|
abort ();
|
|
|
|
first_time = 0;
|
|
}
|
|
else
|
|
{
|
|
if (s.ll != 0 || s.xx != 0 || s.yy != 0)
|
|
abort ();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
test ()
|
|
{
|
|
foo (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, (struct S) { x, I2 });
|
|
foo (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, (struct S) { 0 });
|
|
}
|
|
|
|
void
|
|
setup () /* NOCHECK */
|
|
{
|
|
mark_region (&x, sizeof (x), ACCESS_RO);
|
|
mark_region (&first_time, sizeof (first_time), ACCESS_RW);
|
|
}
|