diff options
author | David Edelsohn <dje.gcc@gmail.com> | 1997-04-10 23:40:30 +0000 |
---|---|---|
committer | David Edelsohn <dje.gcc@gmail.com> | 1997-04-10 23:40:30 +0000 |
commit | f3f00e9486bea45381acd8d156117351c22513dd (patch) | |
tree | 3a75b5c1c0ad3db24c09b476c2fcb072f7a37c7c /gas/cgen.c | |
parent | a394e3262fa7a03f9ca4e198044de683999457f0 (diff) | |
download | gdb-f3f00e9486bea45381acd8d156117351c22513dd.zip gdb-f3f00e9486bea45381acd8d156117351c22513dd.tar.gz gdb-f3f00e9486bea45381acd8d156117351c22513dd.tar.bz2 |
* cgen.c (cgen_parse_operand): Renamed from cgen_asm_parse_operand.
New argument `want'. Update enum cgen_parse_operand_result values.
Initialize if CGEN_PARSE_OPERAND_INIT.
* config/tc-m32r.c (md_begin): Set cgen_parse_operand_fn.
(md_assemble): Call cgen_asm_init_parse.
Update call to m32r_cgen_assemble_insn, call as_bad if assembly failed.
Diffstat (limited to 'gas/cgen.c')
-rw-r--r-- | gas/cgen.c | 32 |
1 files changed, 24 insertions, 8 deletions
@@ -61,6 +61,9 @@ struct fixup static struct fixup fixups[MAX_FIXUPS]; static int num_fixups; +/* Prepare to parse an instruction. + ??? May wish to make this static and delete calls in md_assemble. */ + void cgen_asm_init_parse () { @@ -161,50 +164,63 @@ cgen_record_fixup_exp (frag, where, insn, length, operand, opinfo, exp) /* Callback for cgen interface. Parse the expression at *STRP. The result is an error message or NULL for success (in which case *STRP is advanced past the parsed text). - An enum cgen_asm_result is stored in RESULTP. + WANT is an indication of what the caller is looking for. + If WANT == CGEN_ASM_PARSE_INIT the caller is beginning to try to match + a table entry with the insn, reset the queued fixups counter. + An enum cgen_parse_operand_result is stored in RESULTP. + OPINDEX is the operand's table entry index. OPINFO is something the caller chooses to help in reloc determination. The resulting value is stored in VALUEP. */ const char * -cgen_asm_parse_operand (strP, opindex, opinfo, resultP, valueP) +cgen_parse_operand (want, strP, opindex, opinfo, resultP, valueP) + enum cgen_parse_operand_type want; const char **strP; int opindex; int opinfo; - enum cgen_asm_result *resultP; + enum cgen_parse_operand_result *resultP; bfd_vma *valueP; { char *hold; const char *errmsg = NULL; expressionS exp; + if (want == CGEN_PARSE_OPERAND_INIT) + { + cgen_asm_init_parse (); + return NULL; + } + hold = input_line_pointer; input_line_pointer = (char *) *strP; expression (&exp); *strP = input_line_pointer; input_line_pointer = hold; + /* FIXME: Need to check `want'. */ + switch (exp.X_op) { case O_illegal : errmsg = "illegal operand"; - *resultP = CGEN_ASM_ERROR; + *resultP = CGEN_PARSE_OPERAND_RESULT_ERROR; break; case O_absent : errmsg = "missing operand"; - *resultP = CGEN_ASM_ERROR; + *resultP = CGEN_PARSE_OPERAND_RESULT_ERROR; break; case O_constant : *valueP = exp.X_add_number; - *resultP = CGEN_ASM_NUMBER; + *resultP = CGEN_PARSE_OPERAND_RESULT_NUMBER; break; case O_register : *valueP = exp.X_add_number; - *resultP = CGEN_ASM_REGISTER; + *resultP = CGEN_PARSE_OPERAND_RESULT_REGISTER; break; default : cgen_queue_fixup (opindex, opinfo, &exp); *valueP = 0; - *resultP = CGEN_ASM_QUEUED; + *resultP = CGEN_PARSE_OPERAND_RESULT_QUEUED; break; } |