Browse Source

* config/tc-i386.c (i386_displacement): Call as_bad for bad GOTOFF

expressions rather than triggering an assert.
dberlin-typesystem-branch
Alan Modra 26 years ago
parent
commit
636c26b044
  1. 5
      gas/ChangeLog
  2. 36
      gas/config/tc-i386.c

5
gas/ChangeLog

@ -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.

36
gas/config/tc-i386.c

@ -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. */

Loading…
Cancel
Save