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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
/* { dg-do compile } */
/* { dg-options "-Wall" } */
/* On Alpha EV4, dead code elimination and cfg simplification conspired
to leave the register containing 'C' marked live, though all references
to the variable had been removed. */
struct operand_data
{
struct operand_data *next;
int index;
const char *predicate;
const char *constraint;
int mode;
unsigned char n_alternatives;
char address_p;
char strict_low;
char eliminable;
char seen;
};
struct data
{
struct data *next;
const char *name;
const char *template;
int code_number;
int index_number;
int lineno;
int n_operands;
int n_dups;
int n_alternatives;
int operand_number;
int output_format;
struct operand_data operand[40];
};
extern void message_with_line (int, const char *, ...)
__attribute__ ((__format__ (__printf__, 2, 3)));
extern int have_error;
extern char *strchr (__const char *__s, int __c) __attribute__ ((__pure__));
void
validate_insn_alternatives (d)
struct data *d;
{
int n = 0, start;
for (start = 0; start < d->n_operands; start++)
if (d->operand[start].n_alternatives > 0)
{
int len, i;
const char *p;
char c; /* { dg-bogus "used uninitialized" "uninitialized variable warning" } */
int which_alternative = 0;
int alternative_count_unsure = 0;
for (p = d->operand[start].constraint; (c = *p); p += len)
{
len = 1;
if (len < 1 || (len > 1 && strchr (",#*+=&%!0123456789", c)))
{
message_with_line (d->lineno,
"invalid length %d for char '%c' in alternative %d of operand %d",
len, c, which_alternative, start);
len = 1;
have_error = 1;
}
if (c == ',')
{
which_alternative++;
continue;
}
for (i = 1; i < len; i++)
if (p[i] == '\0')
{
message_with_line (d->lineno,
"NUL in alternative %d of operand %d",
which_alternative, start);
alternative_count_unsure = 1;
break;
}
else if (strchr (",#*", p[i]))
{
message_with_line (d->lineno,
"'%c' in alternative %d of operand %d",
p[i], which_alternative, start);
alternative_count_unsure = 1;
}
}
if (alternative_count_unsure)
have_error = 1;
else if (n == 0)
n = d->operand[start].n_alternatives;
else if (n != d->operand[start].n_alternatives)
{
message_with_line (d->lineno,
"wrong number of alternatives in operand %d",
start);
have_error = 1;
}
}
d->n_alternatives = n;
}
|