aboutsummaryrefslogtreecommitdiff
path: root/opcodes
diff options
context:
space:
mode:
Diffstat (limited to 'opcodes')
-rw-r--r--opcodes/ChangeLog10
-rw-r--r--opcodes/cgen-asm.c15
-rw-r--r--opcodes/m32r-asm.c23
3 files changed, 37 insertions, 11 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 2575bae..e9357fe 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,13 @@
+Thu Apr 10 14:44:56 1997 Doug Evans <dje@canuck.cygnus.com>
+
+ * cgen-asm.c (cgen_asm_parse_operand_fn): New global.
+ (cgen_parse_{{,un}signed_integer,address}): Update call to
+ cgen_asm_parse_operand_fn.
+ * m32r-asm.c (parse_insn_normal): Delete call to cgen_asm_init_parse.
+ (m32r_cgen_assemble_insn): New operand `errmsg'.
+ Delete call to as_bad, return error message to caller.
+ (m32r_cgen_asm_hash_keywords): #if 0 out.
+
Wed Apr 9 12:05:25 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* m68k-dis.c (print_insn_arg) [case 'd']: Print as address register,
diff --git a/opcodes/cgen-asm.c b/opcodes/cgen-asm.c
index bbc45da..14c830ad 100644
--- a/opcodes/cgen-asm.c
+++ b/opcodes/cgen-asm.c
@@ -31,6 +31,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "bfd.h"
#include "opcode/cgen.h"
+/* Operand parsing callback. */
+const char * (*cgen_asm_parse_operand_fn)
+ PARAMS ((const char **, int, int, enum cgen_asm_result *, bfd_vma *));
+
/* This is not published as part of the public interface so we don't
declare this in cgen.h. */
extern CGEN_OPCODE_DATA *cgen_current_opcode_data;
@@ -176,8 +180,8 @@ cgen_parse_signed_integer (strp, opindex, min, max, valuep)
enum cgen_asm_result result;
const char *errmsg;
- errmsg = cgen_asm_parse_operand (strp, opindex, BFD_RELOC_NONE,
- &result, &value);
+ errmsg = (*cgen_asm_parse_operand_fn) (strp, opindex, BFD_RELOC_NONE,
+ &result, &value);
/* FIXME: Examine `result'. */
if (!errmsg)
{
@@ -201,8 +205,8 @@ cgen_parse_unsigned_integer (strp, opindex, min, max, valuep)
enum cgen_asm_result result;
const char *errmsg;
- errmsg = cgen_asm_parse_operand (strp, opindex, BFD_RELOC_NONE,
- &result, &value);
+ errmsg = (*cgen_asm_parse_operand_fn) (strp, opindex, BFD_RELOC_NONE,
+ &result, &value);
/* FIXME: Examine `result'. */
if (!errmsg)
{
@@ -226,7 +230,8 @@ cgen_parse_address (strp, opindex, opinfo, valuep)
enum cgen_asm_result result;
const char *errmsg;
- errmsg = cgen_asm_parse_operand (strp, opindex, opinfo, &result, &value);
+ errmsg = (*cgen_asm_parse_operand_fn) (strp, opindex, opinfo,
+ &result, &value);
/* FIXME: Examine `result'. */
if (!errmsg)
{
diff --git a/opcodes/m32r-asm.c b/opcodes/m32r-asm.c
index 068b30f..824366c 100644
--- a/opcodes/m32r-asm.c
+++ b/opcodes/m32r-asm.c
@@ -551,7 +551,6 @@ parse_insn_normal (insn, strp, fields)
#endif
CGEN_INIT_PARSE ();
- cgen_asm_init_parse ();
#ifdef CGEN_MNEMONIC_OPERANDS
past_opcode_p = 0;
#endif
@@ -678,10 +677,11 @@ insert_insn_normal (insn, fields, buffer)
printed). */
const struct cgen_insn *
-m32r_cgen_assemble_insn (str, fields, buf)
+m32r_cgen_assemble_insn (str, fields, buf, errmsg)
const char *str;
struct cgen_fields *fields;
cgen_insn_t *buf;
+ char **errmsg;
{
const char *start;
CGEN_INSN_LIST *ilist;
@@ -740,13 +740,22 @@ m32r_cgen_assemble_insn (str, fields, buf)
/* Try the next entry. */
}
- /* FIXME: Define this as a callback, or pass back string? */
- as_bad ("bad instruction `%s'", start);
- return NULL;
+ /* FIXME: We can return a better error message than this.
+ Need to track why it failed and pick the right one. */
+ {
+ static char errbuf[100];
+ sprintf (errbuf, "bad instruction `%.50s%s'",
+ start, strlen (start) > 50 ? "..." : "");
+ *errmsg = errbuf;
+ return NULL;
+ }
}
+#if 0 /* This calls back to GAS which we can't do without care. */
+
/* Record each member of OPVALS in the assembler's symbol table.
- FIXME: Not currently used. */
+ This lets GAS parse registers for us.
+ ??? Interesting idea but not currently used. */
void
m32r_cgen_asm_hash_keywords (opvals)
@@ -764,3 +773,5 @@ m32r_cgen_asm_hash_keywords (opvals)
cgen_asm_record_register (ke->name, ke->value);
}
}
+
+#endif /* 0 */