diff options
author | Chen Gang <gang.chen.5i5j@gmail.com> | 2015-04-24 18:40:43 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2015-04-24 12:40:43 -0600 |
commit | 6f96dcebb22a03fd4df64a18c13c5bbc1cee8a76 (patch) | |
tree | 675662af6869b55dc0390c5afbd97195c8fd12b1 /gcc/genrecog.c | |
parent | 6d7d9f0eaecc3896149504cc44de789e6cbb2366 (diff) | |
download | gcc-6f96dcebb22a03fd4df64a18c13c5bbc1cee8a76.zip gcc-6f96dcebb22a03fd4df64a18c13c5bbc1cee8a76.tar.gz gcc-6f96dcebb22a03fd4df64a18c13c5bbc1cee8a76.tar.bz2 |
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.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/gcc/genrecog.c b/gcc/genrecog.c index 81a0e79..9367d74 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 -- |