From 6e40a45f0ef68ef427d225054ae6372708828ed6 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sat, 24 Apr 2010 17:41:03 +0000 Subject: [PATCH] Restore "call|jmp [xtrn]" in x86 assembler. gas/ 2010-04-24 H.J. Lu 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 PR gas/11535 * gas/i386/intelok.s: Add tests for "call|jmp [xtrn]". * gas/i386/intelok.d: Updated. --- gas/ChangeLog | 7 +++++++ gas/config/tc-i386-intel.c | 13 +++++++++++-- gas/testsuite/ChangeLog | 6 ++++++ gas/testsuite/gas/i386/intelok.d | 2 ++ gas/testsuite/gas/i386/intelok.s | 2 ++ 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 6fb61e9d0..1638bc74e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2010-04-24 H.J. Lu + + 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]". + 2010-04-22 Nick Clifton * po/gas.pot: Updated by the Translation project. diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c index ea1e6e04e..163634405 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; } diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 111a118e5..8e3df9ef9 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-04-24 H.J. Lu + + PR gas/11535 + * gas/i386/intelok.s: Add tests for "call|jmp [xtrn]". + * gas/i386/intelok.d: Updated. + 2010-04-21 Joseph Myers * gas/tic6x/insns-c674x.s, gas/tic6x/insns-c674x.d: Also test diff --git a/gas/testsuite/gas/i386/intelok.d b/gas/testsuite/gas/i386/intelok.d index 7a958d574..bad81e41e 100644 --- a/gas/testsuite/gas/i386/intelok.d +++ b/gas/testsuite/gas/i386/intelok.d @@ -204,4 +204,6 @@ Disassembly of section .text: [ ]*[0-9a-f]+: ea 03 00 00 00 05 00[ ]+l?jmp[ ]+0x5[,:]0x3 [ ]*[0-9a-f]+: ff 15 00 00 00 00[ ]+call[ ]+DWORD PTR (ds:)?(0x)?0 [ ]*[0-9a-f]+: 66 ff 25 00 00 00 00[ ]+jmp[ ]+WORD PTR (ds:)?(0x)?0 +[ ]*[0-9a-f]+: ff 15 00 00 00 00[ ]+call[ ]+DWORD PTR (ds:)?(0x)?0 +[ ]*[0-9a-f]+: ff 25 00 00 00 00[ ]+jmp[ ]+DWORD PTR (ds:)?(0x)?0 #pass diff --git a/gas/testsuite/gas/i386/intelok.s b/gas/testsuite/gas/i386/intelok.s index 68833015a..eae9c2d50 100644 --- a/gas/testsuite/gas/i386/intelok.s +++ b/gas/testsuite/gas/i386/intelok.s @@ -215,3 +215,5 @@ start: jmp 5:[3] call dword ptr xtrn jmp word ptr xtrn + call [xtrn] + jmp [xtrn] -- 2.11.4.GIT