summaryrefslogtreecommitdiff
path: root/support/regression/tests/bug-2320.c
blob: 5a4a916b2f12514c2ef71b232bf62573abf1117a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
   bug-2320.c z80 codegen / regalloc interaction issue overwriting register h
 */

#include <testfwk.h>

#pragma disable_warning 85
#pragma disable_warning 283

void as(char *c1, const char *c2, unsigned int i)
{
	ASSERT(0);
}

extern void p(char *c,...)
{
	ASSERT(0);
}

#define a(x) ((x) == 0 ? as(#x, __FILE__, __LINE__):(void)0)

#define BACKING_STORAGE_SIZE 8192
char *buffer;
#define buffer_size (BACKING_STORAGE_SIZE-2)
unsigned buffer_p, buffer_len;
char *buffer_gap;

void buffer_invariants()
{
	a(buffer_len <= buffer_size);
	a(buffer_p <= buffer_len);

	if (buffer_gap != buffer + buffer_size - buffer_len + buffer_p) {
		p("%04x + %04x - %04x + %04x = %04x, not %04x\n",
		  buffer, buffer_size, buffer_len, buffer_p,
		  buffer + buffer_size - buffer_len + buffer_p,
		  buffer_gap);
		a(buffer_gap == buffer + buffer_size - buffer_len + buffer_p);
	}
}

void testBug(void)
{
	buffer = (unsigned char __xdata *)(0xa5a5);
	buffer_len = 1;
	buffer_p = 0;
	buffer_gap = buffer + buffer_size - buffer_len + buffer_p;
	buffer_invariants();
}