diff options
Diffstat (limited to 'gcc/genrecog.c')
-rw-r--r-- | gcc/genrecog.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/gcc/genrecog.c b/gcc/genrecog.c index 81a0e797362..9367d74bb3f 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -503,7 +503,8 @@ validate_pattern (rtx pattern, rtx insn, rtx set, int set_code) if (code == MATCH_OPERAND) { - const char constraints0 = XSTR (pattern, 2)[0]; + const char *constraints = XSTR (pattern, 2); + const char constraints0 = constraints[0]; if (!constraints_supported_in_insn_p (insn)) { @@ -537,6 +538,33 @@ validate_pattern (rtx pattern, rtx insn, rtx set, int set_code) "operand %d missing output reload", XINT (pattern, 0)); } + + /* For matching constraint in MATCH_OPERAND, the digit must be a + smaller number than the number of the operand that uses it in the + constraint. */ + while (1) + { + while (constraints[0] + && (constraints[0] == ' ' || constraints[0] == ',')) + constraints++; + if (!constraints[0]) + break; + + if (constraints[0] >= '0' && constraints[0] <= '9') + { + int val; + + sscanf (constraints, "%d", &val); + if (val >= XINT (pattern, 0)) + error_with_line (pattern_lineno, + "constraint digit %d is not smaller than" + " operand %d", + val, XINT (pattern, 0)); + } + + while (constraints[0] && constraints[0] != ',') + constraints++; + } } /* Allowing non-lvalues in destinations -- particularly CONST_INT -- |