work around locale problems for case insensitivity
This commit is contained in:
parent
6478892d2e
commit
f3a55c17eb
@ -1,8 +1,16 @@
|
|||||||
2001-09-24 Christian Groessler <cpg@aladdin.de>
|
2001-10-09 Bruno Haible <haible@clisp.cons.org>
|
||||||
|
|
||||||
* z8k-dis.c (unparse_intstr): Fixed formatting. Change
|
* cgen-asm.in (*_cgen_build_insn_regex): Generate a case sensitive
|
||||||
disassembly of indirect register memory accesses to be same
|
regular expression. Fix some formatting problems.
|
||||||
format the assembler accepts.
|
* fr30-asm.c: Regenerate.
|
||||||
|
* openrisc-asm.c: Regenerate.
|
||||||
|
* m32r-asm.c: Regenerate.
|
||||||
|
|
||||||
|
2001-10-09 Christian Groessler <cpg@aladdin.de>
|
||||||
|
|
||||||
|
* z8k-dis.c (unparse_instr): Fixed formatting. Change disassembly
|
||||||
|
of indirect register memory accesses to be same format the
|
||||||
|
assembler accepts.
|
||||||
|
|
||||||
2001-10-09 Nick Clifton <nickc@cambridge.redhat.com>
|
2001-10-09 Nick Clifton <nickc@cambridge.redhat.com>
|
||||||
|
|
||||||
|
@ -74,25 +74,42 @@ char *
|
|||||||
|
|
||||||
syn = CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc));
|
syn = CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc));
|
||||||
|
|
||||||
/* Mnemonics come first in the syntax string */
|
/* Mnemonics come first in the syntax string. */
|
||||||
if (! CGEN_SYNTAX_MNEMONIC_P (* syn)) return "missing mnemonic in syntax string";
|
if (! CGEN_SYNTAX_MNEMONIC_P (* syn))
|
||||||
|
return _("missing mnemonic in syntax string");
|
||||||
++syn;
|
++syn;
|
||||||
|
|
||||||
/* copy the literal mnemonic out of the insn */
|
/* Generate a case sensitive regular expression that emulates case
|
||||||
memset (rx, 0, CGEN_MAX_RX_ELEMENTS);
|
insensitive matching in the "C" locale. We cannot generate a case
|
||||||
mnem_len = strlen(mnem);
|
insensitive regular expression because in Turkish locales, 'i' and 'I'
|
||||||
memcpy (rx, mnem, mnem_len);
|
are not equal modulo case conversion. */
|
||||||
rx += mnem_len;
|
|
||||||
|
|
||||||
/* copy any remaining literals from the syntax string into the rx */
|
/* Copy the literal mnemonic out of the insn. */
|
||||||
for(; * syn != 0 && rx < rxbuf + (CGEN_MAX_RX_ELEMENTS - 9); ++syn, ++rx)
|
for (; *mnem; mnem++)
|
||||||
|
{
|
||||||
|
char c = *mnem;
|
||||||
|
|
||||||
|
if (ISALPHA (c))
|
||||||
|
{
|
||||||
|
*rx++ = '[';
|
||||||
|
*rx++ = TOLOWER (c);
|
||||||
|
*rx++ = TOUPPER (c);
|
||||||
|
*rx++ = ']';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*rx++ = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy any remaining literals from the syntax string into the rx. */
|
||||||
|
for(; * syn != 0 && rx <= rxbuf + (CGEN_MAX_RX_ELEMENTS - 7 - 4); ++syn)
|
||||||
{
|
{
|
||||||
if (CGEN_SYNTAX_CHAR_P (* syn))
|
if (CGEN_SYNTAX_CHAR_P (* syn))
|
||||||
{
|
{
|
||||||
char tmp = CGEN_SYNTAX_CHAR (* syn);
|
char c = CGEN_SYNTAX_CHAR (* syn);
|
||||||
switch (tmp)
|
|
||||||
|
switch (c)
|
||||||
{
|
{
|
||||||
/* escape any regex metacharacters in the syntax */
|
/* Escape any regex metacharacters in the syntax. */
|
||||||
case '.': case '[': case '\\':
|
case '.': case '[': case '\\':
|
||||||
case '*': case '^': case '$':
|
case '*': case '^': case '$':
|
||||||
|
|
||||||
@ -101,40 +118,54 @@ char *
|
|||||||
case '(': case ')': case '*':
|
case '(': case ')': case '*':
|
||||||
case '|': case '+': case ']':
|
case '|': case '+': case ']':
|
||||||
#endif
|
#endif
|
||||||
|
*rx++ = '\\';
|
||||||
|
*rx++ = c;
|
||||||
|
break;
|
||||||
|
|
||||||
* rx++ = '\\';
|
default:
|
||||||
|
if (ISALPHA (c))
|
||||||
|
{
|
||||||
|
*rx++ = '[';
|
||||||
|
*rx++ = TOLOWER (c);
|
||||||
|
*rx++ = TOUPPER (c);
|
||||||
|
*rx++ = ']';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*rx++ = c;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* insert syntax char into rx */
|
|
||||||
* rx = tmp;
|
/* Insert syntax char into rx. */
|
||||||
|
*rx++ = c;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* replace non-syntax fields with globs */
|
/* Replace non-syntax fields with globs. */
|
||||||
* rx = '.';
|
*rx++ = '.';
|
||||||
* ++rx = '*';
|
*rx++ = '*';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* trailing whitespace ok */
|
/* Trailing whitespace ok. */
|
||||||
* rx++ = '[';
|
* rx++ = '[';
|
||||||
* rx++ = ' ';
|
* rx++ = ' ';
|
||||||
* rx++ = '\t';
|
* rx++ = '\t';
|
||||||
* rx++ = ']';
|
* rx++ = ']';
|
||||||
* rx++ = '*';
|
* rx++ = '*';
|
||||||
|
|
||||||
/* but anchor it after that */
|
/* But anchor it after that. */
|
||||||
* rx++ = '$';
|
* rx++ = '$';
|
||||||
* rx = '\0';
|
* rx = '\0';
|
||||||
|
|
||||||
CGEN_INSN_RX (insn) = xmalloc (sizeof (regex_t));
|
CGEN_INSN_RX (insn) = xmalloc (sizeof (regex_t));
|
||||||
reg_err = regcomp ((regex_t *) CGEN_INSN_RX (insn), rxbuf, REG_NOSUB|REG_ICASE);
|
reg_err = regcomp ((regex_t *) CGEN_INSN_RX (insn), rxbuf, REG_NOSUB);
|
||||||
|
|
||||||
if (reg_err == 0)
|
if (reg_err == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
static char msg[80];
|
static char msg[80];
|
||||||
|
|
||||||
regerror (reg_err, (regex_t *) CGEN_INSN_RX (insn), msg, 80);
|
regerror (reg_err, (regex_t *) CGEN_INSN_RX (insn), msg, 80);
|
||||||
regfree ((regex_t *) CGEN_INSN_RX (insn));
|
regfree ((regex_t *) CGEN_INSN_RX (insn));
|
||||||
free (CGEN_INSN_RX (insn));
|
free (CGEN_INSN_RX (insn));
|
||||||
@ -155,8 +186,7 @@ char *
|
|||||||
but that can be handled there. Not handling backtracking here may get
|
but that can be handled there. Not handling backtracking here may get
|
||||||
expensive in the case of the m68k. Deal with later.
|
expensive in the case of the m68k. Deal with later.
|
||||||
|
|
||||||
Returns NULL for success, an error message for failure.
|
Returns NULL for success, an error message for failure. */
|
||||||
*/
|
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
parse_insn_normal (cd, insn, strp, fields)
|
parse_insn_normal (cd, insn, strp, fields)
|
||||||
@ -230,6 +260,7 @@ parse_insn_normal (cd, insn, strp, fields)
|
|||||||
{
|
{
|
||||||
/* Syntax char didn't match. Can't be this insn. */
|
/* Syntax char didn't match. Can't be this insn. */
|
||||||
static char msg [80];
|
static char msg [80];
|
||||||
|
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
sprintf (msg, _("syntax error (expected char `%c', found `%c')"),
|
sprintf (msg, _("syntax error (expected char `%c', found `%c')"),
|
||||||
CGEN_SYNTAX_CHAR(*syn), *str);
|
CGEN_SYNTAX_CHAR(*syn), *str);
|
||||||
@ -239,6 +270,7 @@ parse_insn_normal (cd, insn, strp, fields)
|
|||||||
{
|
{
|
||||||
/* Ran out of input. */
|
/* Ran out of input. */
|
||||||
static char msg [80];
|
static char msg [80];
|
||||||
|
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
sprintf (msg, _("syntax error (expected char `%c', found end of instruction)"),
|
sprintf (msg, _("syntax error (expected char `%c', found end of instruction)"),
|
||||||
CGEN_SYNTAX_CHAR(*syn));
|
CGEN_SYNTAX_CHAR(*syn));
|
||||||
@ -321,7 +353,6 @@ const CGEN_INSN *
|
|||||||
ilist = CGEN_ASM_LOOKUP_INSN (cd, str);
|
ilist = CGEN_ASM_LOOKUP_INSN (cd, str);
|
||||||
|
|
||||||
/* Keep looking until we find a match. */
|
/* Keep looking until we find a match. */
|
||||||
|
|
||||||
start = str;
|
start = str;
|
||||||
for ( ; ilist != NULL ; ilist = CGEN_ASM_NEXT_INSN (ilist))
|
for ( ; ilist != NULL ; ilist = CGEN_ASM_NEXT_INSN (ilist))
|
||||||
{
|
{
|
||||||
@ -329,12 +360,12 @@ const CGEN_INSN *
|
|||||||
recognized_mnemonic = 1;
|
recognized_mnemonic = 1;
|
||||||
|
|
||||||
#ifdef CGEN_VALIDATE_INSN_SUPPORTED
|
#ifdef CGEN_VALIDATE_INSN_SUPPORTED
|
||||||
/* not usually needed as unsupported opcodes shouldn't be in the hash lists */
|
/* Not usually needed as unsupported opcodes
|
||||||
|
shouldn't be in the hash lists. */
|
||||||
/* Is this insn supported by the selected cpu? */
|
/* Is this insn supported by the selected cpu? */
|
||||||
if (! @arch@_cgen_insn_supported (cd, insn))
|
if (! @arch@_cgen_insn_supported (cd, insn))
|
||||||
continue;
|
continue;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If the RELAX attribute is set, this is an insn that shouldn't be
|
/* If the RELAX attribute is set, this is an insn that shouldn't be
|
||||||
chosen immediately. Instead, it is used during assembler/linker
|
chosen immediately. Instead, it is used during assembler/linker
|
||||||
relaxation if possible. */
|
relaxation if possible. */
|
||||||
@ -343,7 +374,7 @@ const CGEN_INSN *
|
|||||||
|
|
||||||
str = start;
|
str = start;
|
||||||
|
|
||||||
/* skip this insn if str doesn't look right lexically */
|
/* Skip this insn if str doesn't look right lexically. */
|
||||||
if (CGEN_INSN_RX (insn) != NULL &&
|
if (CGEN_INSN_RX (insn) != NULL &&
|
||||||
regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
|
regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
|
||||||
continue;
|
continue;
|
||||||
@ -355,7 +386,7 @@ const CGEN_INSN *
|
|||||||
if (parse_errmsg != NULL)
|
if (parse_errmsg != NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* ??? 0 is passed for `pc' */
|
/* ??? 0 is passed for `pc'. */
|
||||||
insert_errmsg = CGEN_INSERT_FN (cd, insn) (cd, insn, fields, buf,
|
insert_errmsg = CGEN_INSERT_FN (cd, insn) (cd, insn, fields, buf,
|
||||||
(bfd_vma) 0);
|
(bfd_vma) 0);
|
||||||
if (insert_errmsg != NULL)
|
if (insert_errmsg != NULL)
|
||||||
@ -372,10 +403,11 @@ const CGEN_INSN *
|
|||||||
const char *tmp_errmsg;
|
const char *tmp_errmsg;
|
||||||
|
|
||||||
/* If requesting verbose error messages, use insert_errmsg.
|
/* If requesting verbose error messages, use insert_errmsg.
|
||||||
Failing that, use parse_errmsg */
|
Failing that, use parse_errmsg. */
|
||||||
tmp_errmsg = (insert_errmsg ? insert_errmsg :
|
tmp_errmsg = (insert_errmsg ? insert_errmsg :
|
||||||
parse_errmsg ? parse_errmsg :
|
parse_errmsg ? parse_errmsg :
|
||||||
recognized_mnemonic ? _("unrecognized form of instruction") :
|
recognized_mnemonic ?
|
||||||
|
_("unrecognized form of instruction") :
|
||||||
_("unrecognized instruction"));
|
_("unrecognized instruction"));
|
||||||
|
|
||||||
if (strlen (start) > 50)
|
if (strlen (start) > 50)
|
||||||
|
@ -371,25 +371,42 @@ fr30_cgen_build_insn_regex (insn)
|
|||||||
|
|
||||||
syn = CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc));
|
syn = CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc));
|
||||||
|
|
||||||
/* Mnemonics come first in the syntax string */
|
/* Mnemonics come first in the syntax string. */
|
||||||
if (! CGEN_SYNTAX_MNEMONIC_P (* syn)) return "missing mnemonic in syntax string";
|
if (! CGEN_SYNTAX_MNEMONIC_P (* syn))
|
||||||
|
return _("missing mnemonic in syntax string");
|
||||||
++syn;
|
++syn;
|
||||||
|
|
||||||
/* copy the literal mnemonic out of the insn */
|
/* Generate a case sensitive regular expression that emulates case
|
||||||
memset (rx, 0, CGEN_MAX_RX_ELEMENTS);
|
insensitive matching in the "C" locale. We cannot generate a case
|
||||||
mnem_len = strlen(mnem);
|
insensitive regular expression because in Turkish locales, 'i' and 'I'
|
||||||
memcpy (rx, mnem, mnem_len);
|
are not equal modulo case conversion. */
|
||||||
rx += mnem_len;
|
|
||||||
|
|
||||||
/* copy any remaining literals from the syntax string into the rx */
|
/* Copy the literal mnemonic out of the insn. */
|
||||||
for(; * syn != 0 && rx < rxbuf + (CGEN_MAX_RX_ELEMENTS - 9); ++syn, ++rx)
|
for (; *mnem; mnem++)
|
||||||
|
{
|
||||||
|
char c = *mnem;
|
||||||
|
|
||||||
|
if (ISALPHA (c))
|
||||||
|
{
|
||||||
|
*rx++ = '[';
|
||||||
|
*rx++ = TOLOWER (c);
|
||||||
|
*rx++ = TOUPPER (c);
|
||||||
|
*rx++ = ']';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*rx++ = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy any remaining literals from the syntax string into the rx. */
|
||||||
|
for(; * syn != 0 && rx <= rxbuf + (CGEN_MAX_RX_ELEMENTS - 7 - 4); ++syn)
|
||||||
{
|
{
|
||||||
if (CGEN_SYNTAX_CHAR_P (* syn))
|
if (CGEN_SYNTAX_CHAR_P (* syn))
|
||||||
{
|
{
|
||||||
char tmp = CGEN_SYNTAX_CHAR (* syn);
|
char c = CGEN_SYNTAX_CHAR (* syn);
|
||||||
switch (tmp)
|
|
||||||
|
switch (c)
|
||||||
{
|
{
|
||||||
/* escape any regex metacharacters in the syntax */
|
/* Escape any regex metacharacters in the syntax. */
|
||||||
case '.': case '[': case '\\':
|
case '.': case '[': case '\\':
|
||||||
case '*': case '^': case '$':
|
case '*': case '^': case '$':
|
||||||
|
|
||||||
@ -398,40 +415,54 @@ fr30_cgen_build_insn_regex (insn)
|
|||||||
case '(': case ')': case '*':
|
case '(': case ')': case '*':
|
||||||
case '|': case '+': case ']':
|
case '|': case '+': case ']':
|
||||||
#endif
|
#endif
|
||||||
|
*rx++ = '\\';
|
||||||
|
*rx++ = c;
|
||||||
|
break;
|
||||||
|
|
||||||
* rx++ = '\\';
|
default:
|
||||||
|
if (ISALPHA (c))
|
||||||
|
{
|
||||||
|
*rx++ = '[';
|
||||||
|
*rx++ = TOLOWER (c);
|
||||||
|
*rx++ = TOUPPER (c);
|
||||||
|
*rx++ = ']';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*rx++ = c;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* insert syntax char into rx */
|
|
||||||
* rx = tmp;
|
/* Insert syntax char into rx. */
|
||||||
|
*rx++ = c;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* replace non-syntax fields with globs */
|
/* Replace non-syntax fields with globs. */
|
||||||
* rx = '.';
|
*rx++ = '.';
|
||||||
* ++rx = '*';
|
*rx++ = '*';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* trailing whitespace ok */
|
/* Trailing whitespace ok. */
|
||||||
* rx++ = '[';
|
* rx++ = '[';
|
||||||
* rx++ = ' ';
|
* rx++ = ' ';
|
||||||
* rx++ = '\t';
|
* rx++ = '\t';
|
||||||
* rx++ = ']';
|
* rx++ = ']';
|
||||||
* rx++ = '*';
|
* rx++ = '*';
|
||||||
|
|
||||||
/* but anchor it after that */
|
/* But anchor it after that. */
|
||||||
* rx++ = '$';
|
* rx++ = '$';
|
||||||
* rx = '\0';
|
* rx = '\0';
|
||||||
|
|
||||||
CGEN_INSN_RX (insn) = xmalloc (sizeof (regex_t));
|
CGEN_INSN_RX (insn) = xmalloc (sizeof (regex_t));
|
||||||
reg_err = regcomp ((regex_t *) CGEN_INSN_RX (insn), rxbuf, REG_NOSUB|REG_ICASE);
|
reg_err = regcomp ((regex_t *) CGEN_INSN_RX (insn), rxbuf, REG_NOSUB);
|
||||||
|
|
||||||
if (reg_err == 0)
|
if (reg_err == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
static char msg[80];
|
static char msg[80];
|
||||||
|
|
||||||
regerror (reg_err, (regex_t *) CGEN_INSN_RX (insn), msg, 80);
|
regerror (reg_err, (regex_t *) CGEN_INSN_RX (insn), msg, 80);
|
||||||
regfree ((regex_t *) CGEN_INSN_RX (insn));
|
regfree ((regex_t *) CGEN_INSN_RX (insn));
|
||||||
free (CGEN_INSN_RX (insn));
|
free (CGEN_INSN_RX (insn));
|
||||||
@ -452,8 +483,7 @@ fr30_cgen_build_insn_regex (insn)
|
|||||||
but that can be handled there. Not handling backtracking here may get
|
but that can be handled there. Not handling backtracking here may get
|
||||||
expensive in the case of the m68k. Deal with later.
|
expensive in the case of the m68k. Deal with later.
|
||||||
|
|
||||||
Returns NULL for success, an error message for failure.
|
Returns NULL for success, an error message for failure. */
|
||||||
*/
|
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
parse_insn_normal (cd, insn, strp, fields)
|
parse_insn_normal (cd, insn, strp, fields)
|
||||||
@ -527,6 +557,7 @@ parse_insn_normal (cd, insn, strp, fields)
|
|||||||
{
|
{
|
||||||
/* Syntax char didn't match. Can't be this insn. */
|
/* Syntax char didn't match. Can't be this insn. */
|
||||||
static char msg [80];
|
static char msg [80];
|
||||||
|
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
sprintf (msg, _("syntax error (expected char `%c', found `%c')"),
|
sprintf (msg, _("syntax error (expected char `%c', found `%c')"),
|
||||||
CGEN_SYNTAX_CHAR(*syn), *str);
|
CGEN_SYNTAX_CHAR(*syn), *str);
|
||||||
@ -536,6 +567,7 @@ parse_insn_normal (cd, insn, strp, fields)
|
|||||||
{
|
{
|
||||||
/* Ran out of input. */
|
/* Ran out of input. */
|
||||||
static char msg [80];
|
static char msg [80];
|
||||||
|
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
sprintf (msg, _("syntax error (expected char `%c', found end of instruction)"),
|
sprintf (msg, _("syntax error (expected char `%c', found end of instruction)"),
|
||||||
CGEN_SYNTAX_CHAR(*syn));
|
CGEN_SYNTAX_CHAR(*syn));
|
||||||
@ -618,7 +650,6 @@ fr30_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
ilist = CGEN_ASM_LOOKUP_INSN (cd, str);
|
ilist = CGEN_ASM_LOOKUP_INSN (cd, str);
|
||||||
|
|
||||||
/* Keep looking until we find a match. */
|
/* Keep looking until we find a match. */
|
||||||
|
|
||||||
start = str;
|
start = str;
|
||||||
for ( ; ilist != NULL ; ilist = CGEN_ASM_NEXT_INSN (ilist))
|
for ( ; ilist != NULL ; ilist = CGEN_ASM_NEXT_INSN (ilist))
|
||||||
{
|
{
|
||||||
@ -626,12 +657,12 @@ fr30_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
recognized_mnemonic = 1;
|
recognized_mnemonic = 1;
|
||||||
|
|
||||||
#ifdef CGEN_VALIDATE_INSN_SUPPORTED
|
#ifdef CGEN_VALIDATE_INSN_SUPPORTED
|
||||||
/* not usually needed as unsupported opcodes shouldn't be in the hash lists */
|
/* Not usually needed as unsupported opcodes
|
||||||
|
shouldn't be in the hash lists. */
|
||||||
/* Is this insn supported by the selected cpu? */
|
/* Is this insn supported by the selected cpu? */
|
||||||
if (! fr30_cgen_insn_supported (cd, insn))
|
if (! fr30_cgen_insn_supported (cd, insn))
|
||||||
continue;
|
continue;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If the RELAX attribute is set, this is an insn that shouldn't be
|
/* If the RELAX attribute is set, this is an insn that shouldn't be
|
||||||
chosen immediately. Instead, it is used during assembler/linker
|
chosen immediately. Instead, it is used during assembler/linker
|
||||||
relaxation if possible. */
|
relaxation if possible. */
|
||||||
@ -640,7 +671,7 @@ fr30_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
|
|
||||||
str = start;
|
str = start;
|
||||||
|
|
||||||
/* skip this insn if str doesn't look right lexically */
|
/* Skip this insn if str doesn't look right lexically. */
|
||||||
if (CGEN_INSN_RX (insn) != NULL &&
|
if (CGEN_INSN_RX (insn) != NULL &&
|
||||||
regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
|
regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
|
||||||
continue;
|
continue;
|
||||||
@ -652,7 +683,7 @@ fr30_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
if (parse_errmsg != NULL)
|
if (parse_errmsg != NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* ??? 0 is passed for `pc' */
|
/* ??? 0 is passed for `pc'. */
|
||||||
insert_errmsg = CGEN_INSERT_FN (cd, insn) (cd, insn, fields, buf,
|
insert_errmsg = CGEN_INSERT_FN (cd, insn) (cd, insn, fields, buf,
|
||||||
(bfd_vma) 0);
|
(bfd_vma) 0);
|
||||||
if (insert_errmsg != NULL)
|
if (insert_errmsg != NULL)
|
||||||
@ -669,10 +700,11 @@ fr30_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
const char *tmp_errmsg;
|
const char *tmp_errmsg;
|
||||||
|
|
||||||
/* If requesting verbose error messages, use insert_errmsg.
|
/* If requesting verbose error messages, use insert_errmsg.
|
||||||
Failing that, use parse_errmsg */
|
Failing that, use parse_errmsg. */
|
||||||
tmp_errmsg = (insert_errmsg ? insert_errmsg :
|
tmp_errmsg = (insert_errmsg ? insert_errmsg :
|
||||||
parse_errmsg ? parse_errmsg :
|
parse_errmsg ? parse_errmsg :
|
||||||
recognized_mnemonic ? _("unrecognized form of instruction") :
|
recognized_mnemonic ?
|
||||||
|
_("unrecognized form of instruction") :
|
||||||
_("unrecognized instruction"));
|
_("unrecognized instruction"));
|
||||||
|
|
||||||
if (strlen (start) > 50)
|
if (strlen (start) > 50)
|
||||||
|
@ -373,25 +373,42 @@ m32r_cgen_build_insn_regex (insn)
|
|||||||
|
|
||||||
syn = CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc));
|
syn = CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc));
|
||||||
|
|
||||||
/* Mnemonics come first in the syntax string */
|
/* Mnemonics come first in the syntax string. */
|
||||||
if (! CGEN_SYNTAX_MNEMONIC_P (* syn)) return "missing mnemonic in syntax string";
|
if (! CGEN_SYNTAX_MNEMONIC_P (* syn))
|
||||||
|
return _("missing mnemonic in syntax string");
|
||||||
++syn;
|
++syn;
|
||||||
|
|
||||||
/* copy the literal mnemonic out of the insn */
|
/* Generate a case sensitive regular expression that emulates case
|
||||||
memset (rx, 0, CGEN_MAX_RX_ELEMENTS);
|
insensitive matching in the "C" locale. We cannot generate a case
|
||||||
mnem_len = strlen(mnem);
|
insensitive regular expression because in Turkish locales, 'i' and 'I'
|
||||||
memcpy (rx, mnem, mnem_len);
|
are not equal modulo case conversion. */
|
||||||
rx += mnem_len;
|
|
||||||
|
|
||||||
/* copy any remaining literals from the syntax string into the rx */
|
/* Copy the literal mnemonic out of the insn. */
|
||||||
for(; * syn != 0 && rx < rxbuf + (CGEN_MAX_RX_ELEMENTS - 9); ++syn, ++rx)
|
for (; *mnem; mnem++)
|
||||||
|
{
|
||||||
|
char c = *mnem;
|
||||||
|
|
||||||
|
if (ISALPHA (c))
|
||||||
|
{
|
||||||
|
*rx++ = '[';
|
||||||
|
*rx++ = TOLOWER (c);
|
||||||
|
*rx++ = TOUPPER (c);
|
||||||
|
*rx++ = ']';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*rx++ = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy any remaining literals from the syntax string into the rx. */
|
||||||
|
for(; * syn != 0 && rx <= rxbuf + (CGEN_MAX_RX_ELEMENTS - 7 - 4); ++syn)
|
||||||
{
|
{
|
||||||
if (CGEN_SYNTAX_CHAR_P (* syn))
|
if (CGEN_SYNTAX_CHAR_P (* syn))
|
||||||
{
|
{
|
||||||
char tmp = CGEN_SYNTAX_CHAR (* syn);
|
char c = CGEN_SYNTAX_CHAR (* syn);
|
||||||
switch (tmp)
|
|
||||||
|
switch (c)
|
||||||
{
|
{
|
||||||
/* escape any regex metacharacters in the syntax */
|
/* Escape any regex metacharacters in the syntax. */
|
||||||
case '.': case '[': case '\\':
|
case '.': case '[': case '\\':
|
||||||
case '*': case '^': case '$':
|
case '*': case '^': case '$':
|
||||||
|
|
||||||
@ -400,40 +417,54 @@ m32r_cgen_build_insn_regex (insn)
|
|||||||
case '(': case ')': case '*':
|
case '(': case ')': case '*':
|
||||||
case '|': case '+': case ']':
|
case '|': case '+': case ']':
|
||||||
#endif
|
#endif
|
||||||
|
*rx++ = '\\';
|
||||||
|
*rx++ = c;
|
||||||
|
break;
|
||||||
|
|
||||||
* rx++ = '\\';
|
default:
|
||||||
|
if (ISALPHA (c))
|
||||||
|
{
|
||||||
|
*rx++ = '[';
|
||||||
|
*rx++ = TOLOWER (c);
|
||||||
|
*rx++ = TOUPPER (c);
|
||||||
|
*rx++ = ']';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*rx++ = c;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* insert syntax char into rx */
|
|
||||||
* rx = tmp;
|
/* Insert syntax char into rx. */
|
||||||
|
*rx++ = c;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* replace non-syntax fields with globs */
|
/* Replace non-syntax fields with globs. */
|
||||||
* rx = '.';
|
*rx++ = '.';
|
||||||
* ++rx = '*';
|
*rx++ = '*';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* trailing whitespace ok */
|
/* Trailing whitespace ok. */
|
||||||
* rx++ = '[';
|
* rx++ = '[';
|
||||||
* rx++ = ' ';
|
* rx++ = ' ';
|
||||||
* rx++ = '\t';
|
* rx++ = '\t';
|
||||||
* rx++ = ']';
|
* rx++ = ']';
|
||||||
* rx++ = '*';
|
* rx++ = '*';
|
||||||
|
|
||||||
/* but anchor it after that */
|
/* But anchor it after that. */
|
||||||
* rx++ = '$';
|
* rx++ = '$';
|
||||||
* rx = '\0';
|
* rx = '\0';
|
||||||
|
|
||||||
CGEN_INSN_RX (insn) = xmalloc (sizeof (regex_t));
|
CGEN_INSN_RX (insn) = xmalloc (sizeof (regex_t));
|
||||||
reg_err = regcomp ((regex_t *) CGEN_INSN_RX (insn), rxbuf, REG_NOSUB|REG_ICASE);
|
reg_err = regcomp ((regex_t *) CGEN_INSN_RX (insn), rxbuf, REG_NOSUB);
|
||||||
|
|
||||||
if (reg_err == 0)
|
if (reg_err == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
static char msg[80];
|
static char msg[80];
|
||||||
|
|
||||||
regerror (reg_err, (regex_t *) CGEN_INSN_RX (insn), msg, 80);
|
regerror (reg_err, (regex_t *) CGEN_INSN_RX (insn), msg, 80);
|
||||||
regfree ((regex_t *) CGEN_INSN_RX (insn));
|
regfree ((regex_t *) CGEN_INSN_RX (insn));
|
||||||
free (CGEN_INSN_RX (insn));
|
free (CGEN_INSN_RX (insn));
|
||||||
@ -454,8 +485,7 @@ m32r_cgen_build_insn_regex (insn)
|
|||||||
but that can be handled there. Not handling backtracking here may get
|
but that can be handled there. Not handling backtracking here may get
|
||||||
expensive in the case of the m68k. Deal with later.
|
expensive in the case of the m68k. Deal with later.
|
||||||
|
|
||||||
Returns NULL for success, an error message for failure.
|
Returns NULL for success, an error message for failure. */
|
||||||
*/
|
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
parse_insn_normal (cd, insn, strp, fields)
|
parse_insn_normal (cd, insn, strp, fields)
|
||||||
@ -529,6 +559,7 @@ parse_insn_normal (cd, insn, strp, fields)
|
|||||||
{
|
{
|
||||||
/* Syntax char didn't match. Can't be this insn. */
|
/* Syntax char didn't match. Can't be this insn. */
|
||||||
static char msg [80];
|
static char msg [80];
|
||||||
|
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
sprintf (msg, _("syntax error (expected char `%c', found `%c')"),
|
sprintf (msg, _("syntax error (expected char `%c', found `%c')"),
|
||||||
CGEN_SYNTAX_CHAR(*syn), *str);
|
CGEN_SYNTAX_CHAR(*syn), *str);
|
||||||
@ -538,6 +569,7 @@ parse_insn_normal (cd, insn, strp, fields)
|
|||||||
{
|
{
|
||||||
/* Ran out of input. */
|
/* Ran out of input. */
|
||||||
static char msg [80];
|
static char msg [80];
|
||||||
|
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
sprintf (msg, _("syntax error (expected char `%c', found end of instruction)"),
|
sprintf (msg, _("syntax error (expected char `%c', found end of instruction)"),
|
||||||
CGEN_SYNTAX_CHAR(*syn));
|
CGEN_SYNTAX_CHAR(*syn));
|
||||||
@ -620,7 +652,6 @@ m32r_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
ilist = CGEN_ASM_LOOKUP_INSN (cd, str);
|
ilist = CGEN_ASM_LOOKUP_INSN (cd, str);
|
||||||
|
|
||||||
/* Keep looking until we find a match. */
|
/* Keep looking until we find a match. */
|
||||||
|
|
||||||
start = str;
|
start = str;
|
||||||
for ( ; ilist != NULL ; ilist = CGEN_ASM_NEXT_INSN (ilist))
|
for ( ; ilist != NULL ; ilist = CGEN_ASM_NEXT_INSN (ilist))
|
||||||
{
|
{
|
||||||
@ -628,12 +659,12 @@ m32r_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
recognized_mnemonic = 1;
|
recognized_mnemonic = 1;
|
||||||
|
|
||||||
#ifdef CGEN_VALIDATE_INSN_SUPPORTED
|
#ifdef CGEN_VALIDATE_INSN_SUPPORTED
|
||||||
/* not usually needed as unsupported opcodes shouldn't be in the hash lists */
|
/* Not usually needed as unsupported opcodes
|
||||||
|
shouldn't be in the hash lists. */
|
||||||
/* Is this insn supported by the selected cpu? */
|
/* Is this insn supported by the selected cpu? */
|
||||||
if (! m32r_cgen_insn_supported (cd, insn))
|
if (! m32r_cgen_insn_supported (cd, insn))
|
||||||
continue;
|
continue;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If the RELAX attribute is set, this is an insn that shouldn't be
|
/* If the RELAX attribute is set, this is an insn that shouldn't be
|
||||||
chosen immediately. Instead, it is used during assembler/linker
|
chosen immediately. Instead, it is used during assembler/linker
|
||||||
relaxation if possible. */
|
relaxation if possible. */
|
||||||
@ -642,7 +673,7 @@ m32r_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
|
|
||||||
str = start;
|
str = start;
|
||||||
|
|
||||||
/* skip this insn if str doesn't look right lexically */
|
/* Skip this insn if str doesn't look right lexically. */
|
||||||
if (CGEN_INSN_RX (insn) != NULL &&
|
if (CGEN_INSN_RX (insn) != NULL &&
|
||||||
regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
|
regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
|
||||||
continue;
|
continue;
|
||||||
@ -654,7 +685,7 @@ m32r_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
if (parse_errmsg != NULL)
|
if (parse_errmsg != NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* ??? 0 is passed for `pc' */
|
/* ??? 0 is passed for `pc'. */
|
||||||
insert_errmsg = CGEN_INSERT_FN (cd, insn) (cd, insn, fields, buf,
|
insert_errmsg = CGEN_INSERT_FN (cd, insn) (cd, insn, fields, buf,
|
||||||
(bfd_vma) 0);
|
(bfd_vma) 0);
|
||||||
if (insert_errmsg != NULL)
|
if (insert_errmsg != NULL)
|
||||||
@ -671,10 +702,11 @@ m32r_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
const char *tmp_errmsg;
|
const char *tmp_errmsg;
|
||||||
|
|
||||||
/* If requesting verbose error messages, use insert_errmsg.
|
/* If requesting verbose error messages, use insert_errmsg.
|
||||||
Failing that, use parse_errmsg */
|
Failing that, use parse_errmsg. */
|
||||||
tmp_errmsg = (insert_errmsg ? insert_errmsg :
|
tmp_errmsg = (insert_errmsg ? insert_errmsg :
|
||||||
parse_errmsg ? parse_errmsg :
|
parse_errmsg ? parse_errmsg :
|
||||||
recognized_mnemonic ? _("unrecognized form of instruction") :
|
recognized_mnemonic ?
|
||||||
|
_("unrecognized form of instruction") :
|
||||||
_("unrecognized instruction"));
|
_("unrecognized instruction"));
|
||||||
|
|
||||||
if (strlen (start) > 50)
|
if (strlen (start) > 50)
|
||||||
|
@ -292,25 +292,42 @@ openrisc_cgen_build_insn_regex (insn)
|
|||||||
|
|
||||||
syn = CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc));
|
syn = CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc));
|
||||||
|
|
||||||
/* Mnemonics come first in the syntax string */
|
/* Mnemonics come first in the syntax string. */
|
||||||
if (! CGEN_SYNTAX_MNEMONIC_P (* syn)) return "missing mnemonic in syntax string";
|
if (! CGEN_SYNTAX_MNEMONIC_P (* syn))
|
||||||
|
return _("missing mnemonic in syntax string");
|
||||||
++syn;
|
++syn;
|
||||||
|
|
||||||
/* copy the literal mnemonic out of the insn */
|
/* Generate a case sensitive regular expression that emulates case
|
||||||
memset (rx, 0, CGEN_MAX_RX_ELEMENTS);
|
insensitive matching in the "C" locale. We cannot generate a case
|
||||||
mnem_len = strlen(mnem);
|
insensitive regular expression because in Turkish locales, 'i' and 'I'
|
||||||
memcpy (rx, mnem, mnem_len);
|
are not equal modulo case conversion. */
|
||||||
rx += mnem_len;
|
|
||||||
|
|
||||||
/* copy any remaining literals from the syntax string into the rx */
|
/* Copy the literal mnemonic out of the insn. */
|
||||||
for(; * syn != 0 && rx < rxbuf + (CGEN_MAX_RX_ELEMENTS - 9); ++syn, ++rx)
|
for (; *mnem; mnem++)
|
||||||
|
{
|
||||||
|
char c = *mnem;
|
||||||
|
|
||||||
|
if (ISALPHA (c))
|
||||||
|
{
|
||||||
|
*rx++ = '[';
|
||||||
|
*rx++ = TOLOWER (c);
|
||||||
|
*rx++ = TOUPPER (c);
|
||||||
|
*rx++ = ']';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*rx++ = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy any remaining literals from the syntax string into the rx. */
|
||||||
|
for(; * syn != 0 && rx <= rxbuf + (CGEN_MAX_RX_ELEMENTS - 7 - 4); ++syn)
|
||||||
{
|
{
|
||||||
if (CGEN_SYNTAX_CHAR_P (* syn))
|
if (CGEN_SYNTAX_CHAR_P (* syn))
|
||||||
{
|
{
|
||||||
char tmp = CGEN_SYNTAX_CHAR (* syn);
|
char c = CGEN_SYNTAX_CHAR (* syn);
|
||||||
switch (tmp)
|
|
||||||
|
switch (c)
|
||||||
{
|
{
|
||||||
/* escape any regex metacharacters in the syntax */
|
/* Escape any regex metacharacters in the syntax. */
|
||||||
case '.': case '[': case '\\':
|
case '.': case '[': case '\\':
|
||||||
case '*': case '^': case '$':
|
case '*': case '^': case '$':
|
||||||
|
|
||||||
@ -319,40 +336,54 @@ openrisc_cgen_build_insn_regex (insn)
|
|||||||
case '(': case ')': case '*':
|
case '(': case ')': case '*':
|
||||||
case '|': case '+': case ']':
|
case '|': case '+': case ']':
|
||||||
#endif
|
#endif
|
||||||
|
*rx++ = '\\';
|
||||||
|
*rx++ = c;
|
||||||
|
break;
|
||||||
|
|
||||||
* rx++ = '\\';
|
default:
|
||||||
|
if (ISALPHA (c))
|
||||||
|
{
|
||||||
|
*rx++ = '[';
|
||||||
|
*rx++ = TOLOWER (c);
|
||||||
|
*rx++ = TOUPPER (c);
|
||||||
|
*rx++ = ']';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*rx++ = c;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* insert syntax char into rx */
|
|
||||||
* rx = tmp;
|
/* Insert syntax char into rx. */
|
||||||
|
*rx++ = c;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* replace non-syntax fields with globs */
|
/* Replace non-syntax fields with globs. */
|
||||||
* rx = '.';
|
*rx++ = '.';
|
||||||
* ++rx = '*';
|
*rx++ = '*';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* trailing whitespace ok */
|
/* Trailing whitespace ok. */
|
||||||
* rx++ = '[';
|
* rx++ = '[';
|
||||||
* rx++ = ' ';
|
* rx++ = ' ';
|
||||||
* rx++ = '\t';
|
* rx++ = '\t';
|
||||||
* rx++ = ']';
|
* rx++ = ']';
|
||||||
* rx++ = '*';
|
* rx++ = '*';
|
||||||
|
|
||||||
/* but anchor it after that */
|
/* But anchor it after that. */
|
||||||
* rx++ = '$';
|
* rx++ = '$';
|
||||||
* rx = '\0';
|
* rx = '\0';
|
||||||
|
|
||||||
CGEN_INSN_RX (insn) = xmalloc (sizeof (regex_t));
|
CGEN_INSN_RX (insn) = xmalloc (sizeof (regex_t));
|
||||||
reg_err = regcomp ((regex_t *) CGEN_INSN_RX (insn), rxbuf, REG_NOSUB|REG_ICASE);
|
reg_err = regcomp ((regex_t *) CGEN_INSN_RX (insn), rxbuf, REG_NOSUB);
|
||||||
|
|
||||||
if (reg_err == 0)
|
if (reg_err == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
static char msg[80];
|
static char msg[80];
|
||||||
|
|
||||||
regerror (reg_err, (regex_t *) CGEN_INSN_RX (insn), msg, 80);
|
regerror (reg_err, (regex_t *) CGEN_INSN_RX (insn), msg, 80);
|
||||||
regfree ((regex_t *) CGEN_INSN_RX (insn));
|
regfree ((regex_t *) CGEN_INSN_RX (insn));
|
||||||
free (CGEN_INSN_RX (insn));
|
free (CGEN_INSN_RX (insn));
|
||||||
@ -373,8 +404,7 @@ openrisc_cgen_build_insn_regex (insn)
|
|||||||
but that can be handled there. Not handling backtracking here may get
|
but that can be handled there. Not handling backtracking here may get
|
||||||
expensive in the case of the m68k. Deal with later.
|
expensive in the case of the m68k. Deal with later.
|
||||||
|
|
||||||
Returns NULL for success, an error message for failure.
|
Returns NULL for success, an error message for failure. */
|
||||||
*/
|
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
parse_insn_normal (cd, insn, strp, fields)
|
parse_insn_normal (cd, insn, strp, fields)
|
||||||
@ -448,6 +478,7 @@ parse_insn_normal (cd, insn, strp, fields)
|
|||||||
{
|
{
|
||||||
/* Syntax char didn't match. Can't be this insn. */
|
/* Syntax char didn't match. Can't be this insn. */
|
||||||
static char msg [80];
|
static char msg [80];
|
||||||
|
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
sprintf (msg, _("syntax error (expected char `%c', found `%c')"),
|
sprintf (msg, _("syntax error (expected char `%c', found `%c')"),
|
||||||
CGEN_SYNTAX_CHAR(*syn), *str);
|
CGEN_SYNTAX_CHAR(*syn), *str);
|
||||||
@ -457,6 +488,7 @@ parse_insn_normal (cd, insn, strp, fields)
|
|||||||
{
|
{
|
||||||
/* Ran out of input. */
|
/* Ran out of input. */
|
||||||
static char msg [80];
|
static char msg [80];
|
||||||
|
|
||||||
/* xgettext:c-format */
|
/* xgettext:c-format */
|
||||||
sprintf (msg, _("syntax error (expected char `%c', found end of instruction)"),
|
sprintf (msg, _("syntax error (expected char `%c', found end of instruction)"),
|
||||||
CGEN_SYNTAX_CHAR(*syn));
|
CGEN_SYNTAX_CHAR(*syn));
|
||||||
@ -539,7 +571,6 @@ openrisc_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
ilist = CGEN_ASM_LOOKUP_INSN (cd, str);
|
ilist = CGEN_ASM_LOOKUP_INSN (cd, str);
|
||||||
|
|
||||||
/* Keep looking until we find a match. */
|
/* Keep looking until we find a match. */
|
||||||
|
|
||||||
start = str;
|
start = str;
|
||||||
for ( ; ilist != NULL ; ilist = CGEN_ASM_NEXT_INSN (ilist))
|
for ( ; ilist != NULL ; ilist = CGEN_ASM_NEXT_INSN (ilist))
|
||||||
{
|
{
|
||||||
@ -547,12 +578,12 @@ openrisc_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
recognized_mnemonic = 1;
|
recognized_mnemonic = 1;
|
||||||
|
|
||||||
#ifdef CGEN_VALIDATE_INSN_SUPPORTED
|
#ifdef CGEN_VALIDATE_INSN_SUPPORTED
|
||||||
/* not usually needed as unsupported opcodes shouldn't be in the hash lists */
|
/* Not usually needed as unsupported opcodes
|
||||||
|
shouldn't be in the hash lists. */
|
||||||
/* Is this insn supported by the selected cpu? */
|
/* Is this insn supported by the selected cpu? */
|
||||||
if (! openrisc_cgen_insn_supported (cd, insn))
|
if (! openrisc_cgen_insn_supported (cd, insn))
|
||||||
continue;
|
continue;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If the RELAX attribute is set, this is an insn that shouldn't be
|
/* If the RELAX attribute is set, this is an insn that shouldn't be
|
||||||
chosen immediately. Instead, it is used during assembler/linker
|
chosen immediately. Instead, it is used during assembler/linker
|
||||||
relaxation if possible. */
|
relaxation if possible. */
|
||||||
@ -561,7 +592,7 @@ openrisc_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
|
|
||||||
str = start;
|
str = start;
|
||||||
|
|
||||||
/* skip this insn if str doesn't look right lexically */
|
/* Skip this insn if str doesn't look right lexically. */
|
||||||
if (CGEN_INSN_RX (insn) != NULL &&
|
if (CGEN_INSN_RX (insn) != NULL &&
|
||||||
regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
|
regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
|
||||||
continue;
|
continue;
|
||||||
@ -573,7 +604,7 @@ openrisc_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
if (parse_errmsg != NULL)
|
if (parse_errmsg != NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* ??? 0 is passed for `pc' */
|
/* ??? 0 is passed for `pc'. */
|
||||||
insert_errmsg = CGEN_INSERT_FN (cd, insn) (cd, insn, fields, buf,
|
insert_errmsg = CGEN_INSERT_FN (cd, insn) (cd, insn, fields, buf,
|
||||||
(bfd_vma) 0);
|
(bfd_vma) 0);
|
||||||
if (insert_errmsg != NULL)
|
if (insert_errmsg != NULL)
|
||||||
@ -590,10 +621,11 @@ openrisc_cgen_assemble_insn (cd, str, fields, buf, errmsg)
|
|||||||
const char *tmp_errmsg;
|
const char *tmp_errmsg;
|
||||||
|
|
||||||
/* If requesting verbose error messages, use insert_errmsg.
|
/* If requesting verbose error messages, use insert_errmsg.
|
||||||
Failing that, use parse_errmsg */
|
Failing that, use parse_errmsg. */
|
||||||
tmp_errmsg = (insert_errmsg ? insert_errmsg :
|
tmp_errmsg = (insert_errmsg ? insert_errmsg :
|
||||||
parse_errmsg ? parse_errmsg :
|
parse_errmsg ? parse_errmsg :
|
||||||
recognized_mnemonic ? _("unrecognized form of instruction") :
|
recognized_mnemonic ?
|
||||||
|
_("unrecognized form of instruction") :
|
||||||
_("unrecognized instruction"));
|
_("unrecognized instruction"));
|
||||||
|
|
||||||
if (strlen (start) > 50)
|
if (strlen (start) > 50)
|
||||||
|
Loading…
Reference in New Issue
Block a user