This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: PR gas/11535: "jmp [foo]" no longer works


Hi,

I checked in this patch to restore "call|jmp [symbol]".

H.J.
----
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 6fb61e9..1638bc7 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+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]".
+
 2010-04-22  Nick Clifton  <nickc@redhat.com>
 
 	* 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 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;
 	      }
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 111a118..8e3df9e 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+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.
+
 2010-04-21  Joseph Myers  <joseph@codesourcery.com>
 
 	* 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 7a958d5..bad81e4 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 6883301..eae9c2d 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]


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]