From 6f96dcebb22a03fd4df64a18c13c5bbc1cee8a76 Mon Sep 17 00:00:00 2001 From: Chen Gang Date: Fri, 24 Apr 2015 18:40:43 +0000 Subject: [PATCH] genrecog.c (validate_pattern): Check matching constraint refers to a lower numbered operand. * genrecog.c (validate_pattern): Check matching constraint refers to a lower numbered operand. From-SVN: r222418 --- gcc/ChangeLog | 5 +++++ gcc/genrecog.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 025289e21e1..1995751b2c1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-04-24 Chen Gang + + * genrecog.c (validate_pattern): Check matching constraint refers + to a lower numbered operand. + 2015-04-24 Michael Meissner PR target/65849 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 -- -- 2.30.2