diff options
author | Alan Modra <amodra@gmail.com> | 2007-08-17 14:12:43 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2007-08-17 14:12:43 +0000 |
commit | 3992d3b7e252d9e75fe1ea0264b2761fe3e85d24 (patch) | |
tree | ff5efeb94593a0e19e4be96a677fd4d5b9a6735f /gas/config | |
parent | 442996eee847bcffea6e25c4519b30c36bfe09ef (diff) | |
download | gdb-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.c | 75 |
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. |