* config/tc-i386.c (i386_displacement): Call as_bad for bad GOTOFF
authorAlan Modra <amodra@gmail.com>
Thu, 3 May 2001 01:08:44 +0000 (01:08 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 3 May 2001 01:08:44 +0000 (01:08 +0000)
expressions rather than triggering an assert.

gas/ChangeLog
gas/config/tc-i386.c

index 0469acb..209bd80 100644 (file)
@@ -1,3 +1,8 @@
+2001-05-03  Alan Modra  <amodra@one.net.au>
+
+       * config/tc-i386.c (i386_displacement): Call as_bad for bad GOTOFF
+       expressions rather than triggering an assert.
+
 2001-05-02  Johan Rydberg  <jrydberg@opencores.org>
 
         * config/tc-openrisc.c: New file.
index 69dd6c0..57b9b0f 100644 (file)
@@ -3466,6 +3466,19 @@ i386_displacement (disp_start, disp_end)
 
   exp_seg = expression (exp);
 
+  SKIP_WHITESPACE ();
+  if (*input_line_pointer)
+    as_bad (_("junk `%s' after expression"), input_line_pointer);
+#if GCC_ASM_O_HACK
+  RESTORE_END_STRING (disp_end + 1);
+#endif
+  RESTORE_END_STRING (disp_end);
+  input_line_pointer = save_input_line_pointer;
+#ifndef LEX_AT
+  if (gotfree_input_line)
+    free (gotfree_input_line);
+#endif
+
 #ifdef BFD_ASSEMBLER
   /* We do this to make sure that the section symbol is in
      the symbol table.  We will ultimately change the relocation
@@ -3473,10 +3486,18 @@ i386_displacement (disp_start, disp_end)
   if (i.reloc[this_operand] == BFD_RELOC_386_GOTOFF
       || i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
     {
+      if (exp->X_op != O_symbol)
+       {
+         as_bad (_("bad expression used with @%s"),
+                 (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL
+                  ? "GOTPCREL"
+                  : "GOTOFF"));
+         return 0;
+       }
+
       if (S_IS_LOCAL (exp->X_add_symbol)
          && S_GET_SEGMENT (exp->X_add_symbol) != undefined_section)
        section_symbol (S_GET_SEGMENT (exp->X_add_symbol));
-      assert (exp->X_op == O_symbol);
       exp->X_op = O_subtract;
       exp->X_op_symbol = GOT_symbol;
       if (i.reloc[this_operand] == BFD_RELOC_X86_64_GOTPCREL)
@@ -3486,19 +3507,6 @@ i386_displacement (disp_start, disp_end)
     }
 #endif
 
-  SKIP_WHITESPACE ();
-  if (*input_line_pointer)
-    as_bad (_("junk `%s' after expression"), input_line_pointer);
-#if GCC_ASM_O_HACK
-  RESTORE_END_STRING (disp_end + 1);
-#endif
-  RESTORE_END_STRING (disp_end);
-  input_line_pointer = save_input_line_pointer;
-#ifndef LEX_AT
-  if (gotfree_input_line)
-    free (gotfree_input_line);
-#endif
-
   if (exp->X_op == O_absent || exp->X_op == O_big)
     {
       /* Missing or bad expr becomes absolute 0.  */