aboutsummaryrefslogtreecommitdiff
path: root/gas/config
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2007-08-17 14:12:43 +0000
committerAlan Modra <amodra@gmail.com>2007-08-17 14:12:43 +0000
commit3992d3b7e252d9e75fe1ea0264b2761fe3e85d24 (patch)
treeff5efeb94593a0e19e4be96a677fd4d5b9a6735f /gas/config
parent442996eee847bcffea6e25c4519b30c36bfe09ef (diff)
downloadgdb-3992d3b7e252d9e75fe1ea0264b2761fe3e85d24.zip
gdb-3992d3b7e252d9e75fe1ea0264b2761fe3e85d24.tar.gz
gdb-3992d3b7e252d9e75fe1ea0264b2761fe3e85d24.tar.bz2
PR gas/4079
* config/tc-i386.c (x86_cons): Complain about invalid @got etc. expressions. (i386_immediate): Detect and complain about more cases of invalid immediate expressions. Return failure rather than converting them to zero. (i386_displacement): Likewise.
Diffstat (limited to 'gas/config')
-rw-r--r--gas/config/tc-i386.c75
1 files changed, 43 insertions, 32 deletions
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 13e7d7a..0ef4142 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -4575,6 +4575,17 @@ x86_cons (expressionS *exp, int size)
+ (input_line_pointer - gotfree_input_line)
+ adjust);
free (gotfree_input_line);
+ if (exp->X_op == O_constant
+ || exp->X_op == O_absent
+ || exp->X_op == O_illegal
+ || exp->X_op == O_register
+ || exp->X_op == O_big)
+ {
+ char c = *input_line_pointer;
+ *input_line_pointer = 0;
+ as_bad (_("missing or invalid expression `%s'"), save);
+ *input_line_pointer = c;
+ }
}
}
else
@@ -4651,15 +4662,16 @@ i386_immediate (char *imm_start)
if (gotfree_input_line)
free (gotfree_input_line);
- if (exp->X_op == O_absent || exp->X_op == O_big)
+ if (exp->X_op == O_absent
+ || exp->X_op == O_illegal
+ || exp->X_op == O_big
+ || (gotfree_input_line
+ && (exp->X_op == O_constant
+ || exp->X_op == O_register)))
{
- /* Missing or bad expr becomes absolute 0. */
- as_bad (_("missing or invalid immediate expression `%s' taken as 0"),
+ as_bad (_("missing or invalid immediate expression `%s'"),
imm_start);
- exp->X_op = O_constant;
- exp->X_add_number = 0;
- exp->X_add_symbol = (symbolS *) 0;
- exp->X_op_symbol = (symbolS *) 0;
+ return 0;
}
else if (exp->X_op == O_constant)
{
@@ -4758,6 +4770,7 @@ i386_displacement (char *disp_start, char *disp_end)
char *gotfree_input_line;
int bigdisp, override;
unsigned int types = Disp;
+ int ret;
if (i.disp_operands == MAX_MEMORY_OPERANDS)
{
@@ -4866,10 +4879,10 @@ i386_displacement (char *disp_start, char *disp_end)
#if GCC_ASM_O_HACK
RESTORE_END_STRING (disp_end + 1);
#endif
- RESTORE_END_STRING (disp_end);
input_line_pointer = save_input_line_pointer;
if (gotfree_input_line)
free (gotfree_input_line);
+ ret = 1;
/* We do this to make sure that the section symbol is in
the symbol table. We will ultimately change the relocation
@@ -4879,13 +4892,7 @@ i386_displacement (char *disp_start, char *disp_end)
|| i.reloc[this_operand] == BFD_RELOC_X86_64_GOTOFF64)
{
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;
- }
+ goto inv_disp;
if (S_IS_LOCAL (exp->X_add_symbol)
&& S_GET_SEGMENT (exp->X_add_symbol) != undefined_section)
@@ -4900,36 +4907,40 @@ i386_displacement (char *disp_start, char *disp_end)
i.reloc[this_operand] = BFD_RELOC_32;
}
- if (exp->X_op == O_absent || exp->X_op == O_big)
+ else if (exp->X_op == O_absent
+ || exp->X_op == O_illegal
+ || exp->X_op == O_big
+ || (gotfree_input_line
+ && (exp->X_op == O_constant
+ || exp->X_op == O_register)))
{
- /* Missing or bad expr becomes absolute 0. */
- as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
+ inv_disp:
+ as_bad (_("missing or invalid displacement expression `%s'"),
disp_start);
- exp->X_op = O_constant;
- exp->X_add_number = 0;
- exp->X_add_symbol = (symbolS *) 0;
- exp->X_op_symbol = (symbolS *) 0;
+ ret = 0;
}
#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
- if (exp->X_op != O_constant
- && OUTPUT_FLAVOR == bfd_target_aout_flavour
- && exp_seg != absolute_section
- && exp_seg != text_section
- && exp_seg != data_section
- && exp_seg != bss_section
- && exp_seg != undefined_section
- && !bfd_is_com_section (exp_seg))
+ else if (exp->X_op != O_constant
+ && OUTPUT_FLAVOR == bfd_target_aout_flavour
+ && exp_seg != absolute_section
+ && exp_seg != text_section
+ && exp_seg != data_section
+ && exp_seg != bss_section
+ && exp_seg != undefined_section
+ && !bfd_is_com_section (exp_seg))
{
as_bad (_("unimplemented segment %s in operand"), exp_seg->name);
- return 0;
+ ret = 0;
}
#endif
+ RESTORE_END_STRING (disp_end);
+
if (!(i.types[this_operand] & ~Disp))
i.types[this_operand] &= types;
- return 1;
+ return ret;
}
/* Make sure the memory operand we've been dealt is valid.