aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-i386-intel.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2010-04-24 17:41:04 +0000
committerH.J. Lu <hjl.tools@gmail.com>2010-04-24 17:41:04 +0000
commit253036079bf570cff18d8e627c769795e1c6c286 (patch)
tree49db160da99a3e077cf5a387ac2f7647359af258 /gas/config/tc-i386-intel.c
parentbd288ea21b2dbb853d166fddd980bf9d03bdb009 (diff)
downloadgdb-253036079bf570cff18d8e627c769795e1c6c286.zip
gdb-253036079bf570cff18d8e627c769795e1c6c286.tar.gz
gdb-253036079bf570cff18d8e627c769795e1c6c286.tar.bz2
Restore "call|jmp [xtrn]" in x86 assembler.
gas/ 2010-04-24 H.J. Lu <hongjiu.lu@intel.com> PR gas/11535 * config/tc-i386-intel.c (intel_state): Add is_indirect. (i386_intel_operand): Initialize intel_state.is_indirect. Check intel_state.is_indirect for "call|jmp [symbol]". gas/testsuite/ 2010-04-24 H.J. Lu <hongjiu.lu@intel.com> PR gas/11535 * gas/i386/intelok.s: Add tests for "call|jmp [xtrn]". * gas/i386/intelok.d: Updated.
Diffstat (limited to 'gas/config/tc-i386-intel.c')
-rw-r--r--gas/config/tc-i386-intel.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c
index ea1e6e0..1636344 100644
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -23,6 +23,7 @@ static struct
{
operatorT op_modifier; /* Operand modifier. */
int is_mem; /* 1 if operand is memory reference. */
+ int is_indirect; /* 1 if operand is indirect reference. */
int has_offset; /* 1 if operand has offset. */
unsigned int in_offset; /* >=1 if processing operand of offset. */
unsigned int in_bracket; /* >=1 if processing operand in brackets. */
@@ -491,6 +492,7 @@ i386_intel_operand (char *operand_string, int got_a_float)
/* Initialize state structure. */
intel_state.op_modifier = O_absent;
intel_state.is_mem = 0;
+ intel_state.is_indirect = 0;
intel_state.has_offset = 0;
intel_state.base = NULL;
intel_state.index = NULL;
@@ -528,7 +530,10 @@ i386_intel_operand (char *operand_string, int got_a_float)
else if (!intel_state.has_offset
&& input_line_pointer > buf
&& *(input_line_pointer - 1) == ']')
- intel_state.is_mem |= 1;
+ {
+ intel_state.is_mem |= 1;
+ intel_state.is_indirect = 1;
+ }
input_line_pointer = saved_input_line_pointer;
free (buf);
@@ -674,7 +679,11 @@ i386_intel_operand (char *operand_string, int got_a_float)
{
intel_state.is_mem = 1;
if (intel_state.op_modifier == O_absent)
- break;
+ {
+ if (intel_state.is_indirect == 1)
+ i.types[this_operand].bitfield.jumpabsolute = 1;
+ break;
+ }
as_bad (_("cannot infer the segment part of the operand"));
return 0;
}