* cgen assembler fixes; approved by original author <devans>
authorFrank Ch. Eigler <fche@redhat.com>
Sat, 24 Jun 2000 15:10:45 +0000 (15:10 +0000)
committerFrank Ch. Eigler <fche@redhat.com>
Sat, 24 Jun 2000 15:10:45 +0000 (15:10 +0000)
2000-06-24  Frank Ch. Eigler  <fche@redhat.com>

* cgen.c (expr_jmp_buf_p): New validity flag for expr_jmp_buf.
(gas_cgen_parse_operand): Set it around expression() call.
(gas_cgen_md_operand): Test for it before longjmp().

gas/ChangeLog
gas/cgen.c

index 4d3d4a27eb07975b9a1560d9bf7c3e30d8789120..379302cd886ee9fe4e78bb401d4eaa1decdd6139 100644 (file)
@@ -1,3 +1,9 @@
+2000-06-24  Frank Ch. Eigler  <fche@redhat.com>
+       * cgen.c (expr_jmp_buf_p): New validity flag for expr_jmp_buf.
+       (gas_cgen_parse_operand): Set it around expression() call.
+       (gas_cgen_md_operand): Test for it before longjmp().
+
 2000-06-24  Kazu Hirata  <kazu@hxi.com>
 
        * config/tc-h8500.c: Remove all uses of DEFUN.
index e15e1b65346b77707a916b4af9e28a5a1e021a7a..1f4ea0baeb8410c7988effe6a8d5d95a115ec8d4 100644 (file)
@@ -232,6 +232,7 @@ gas_cgen_record_fixup_exp (frag, where, insn, length, operand, opinfo, exp)
 
 /* Used for communication between the next two procedures.  */
 static jmp_buf expr_jmp_buf;
+static int expr_jmp_buf_p;
 
 /* Callback for cgen interface.  Parse the expression at *STRP.
    The result is an error message or NULL for success (in which case
@@ -279,12 +280,15 @@ gas_cgen_parse_operand (cd, want, strP, opindex, opinfo, resultP, valueP)
      This is done via gas_cgen_md_operand.  */
   if (setjmp (expr_jmp_buf) != 0)
     {
+      expr_jmp_buf_p = 0;
       input_line_pointer = (char *) hold;
       * resultP_1 = CGEN_PARSE_OPERAND_RESULT_ERROR;
       return "illegal operand";
     }
 
+  expr_jmp_buf_p = 1;
   expression (& exp);
+  expr_jmp_buf_p = 0;
 
   * strP = input_line_pointer;
   input_line_pointer = hold;
@@ -328,7 +332,9 @@ void
 gas_cgen_md_operand (expressionP)
      expressionS * expressionP;
 {
-  longjmp (expr_jmp_buf, 1);
+  /* Don't longjmp if we're not called from within cgen_parse_operand().  */
+  if (expr_jmp_buf_p)
+    longjmp (expr_jmp_buf, 1);
 }
 
 /* Finish assembling instruction INSN.