summaryrefslogtreecommitdiff
path: root/gcc/genrecog.c
diff options
context:
space:
mode:
authorChen Gang <gang.chen.5i5j@gmail.com>2015-04-24 18:40:43 +0000
committerJeff Law <law@gcc.gnu.org>2015-04-24 12:40:43 -0600
commit6f96dcebb22a03fd4df64a18c13c5bbc1cee8a76 (patch)
tree675662af6869b55dc0390c5afbd97195c8fd12b1 /gcc/genrecog.c
parent6d7d9f0eaecc3896149504cc44de789e6cbb2366 (diff)
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
Diffstat (limited to 'gcc/genrecog.c')
-rw-r--r--gcc/genrecog.c30
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 --