[PATCH] x86 (Intel syntax): fix handling of '$'

Jan Beulich JBeulich@novell.com
Mon Jun 21 16:12:00 GMT 2010


This pseudo symbol can be used anywhere in an expression, not just at
the beginning.

gas/
2010-06-21  Jan Beulich  <jbeulich@novell.com>

	PR gas/11732
	* config/tc-i386-intel.c (i386_intel_parse_name): Handle pseudo
	symbols named "$".
	(i386_intel_operand): Remove bogus handling of pseudo symbols
	named "$".
	* expr.c (current_location): Remove 'static' and local
	declaration.
	* expr.h (current_location): Declare.

gas/testsuite/
2010-06-21  Jan Beulich  <jbeulich@novell.com>

	PR gas/11732
	* gas/i386/jump.d: Adjust.
	* gas/i386/jump.s: Add check for branch to 2+$.

--- 2010-06-09/gas/config/tc-i386-intel.c	2010-05-07 15:46:09.000000000 +0200
+++ 2010-06-09/gas/config/tc-i386-intel.c	2010-06-21 18:04:12.000000000 +0200
@@ -191,6 +191,12 @@ static int i386_intel_parse_name (const 
 {
   unsigned int j;
 
+  if (! strcmp (name, "$"))
+    {
+      current_location (e);
+      return 1;
+    }
+
   for (j = 0; i386_types[j].name; ++j)
     if (strcasecmp(i386_types[j].name, name) == 0)
       {
@@ -505,11 +511,6 @@ i386_intel_operand (char *operand_string
   saved_input_line_pointer = input_line_pointer;
   input_line_pointer = buf = xstrdup (operand_string);
 
-  /* A '$' followed by an identifier char is an identifier.  Otherwise,
-     it's operator '.' followed by an expression.  */
-  if (*buf == '$' && !is_identifier_char (buf[1]))
-    *buf = '.';
-
   intel_syntax = -1;
   memset (&exp, 0, sizeof(exp));
   exp_seg = expression (&exp);
--- 2010-06-09/gas/expr.c	2010-05-07 15:46:07.000000000 +0200
+++ 2010-06-09/gas/expr.c	2010-06-21 18:04:12.000000000 +0200
@@ -45,7 +45,6 @@ static valueT generic_bignum_to_int64 (v
 #endif
 static void integer_constant (int radix, expressionS * expressionP);
 static void mri_char_constant (expressionS *);
-static void current_location (expressionS *);
 static void clean_up_expression (expressionS * expressionP);
 static segT operand (expressionS *, enum expr_mode);
 static operatorT operatorf (int *);
@@ -695,7 +694,7 @@ mri_char_constant (expressionS *expressi
 /* Return an expression representing the current location.  This
    handles the magic symbol `.'.  */
 
-static void
+void
 current_location (expressionS *expressionp)
 {
   if (now_seg == absolute_section)
--- 2010-06-09/gas/expr.h	2009-09-07 08:51:31.000000000 +0200
+++ 2010-06-09/gas/expr.h	2010-06-21 18:04:12.000000000 +0200
@@ -174,6 +174,7 @@ extern segT expr (int, expressionS *, en
 extern unsigned int get_single_number (void);
 extern symbolS *make_expr_symbol (expressionS * expressionP);
 extern int expr_symbol_where (symbolS *, char **, unsigned int *);
+extern void current_location (expressionS *);
 
 extern symbolS *expr_build_uconstant (offsetT);
 extern symbolS *expr_build_dot (void);
--- 2010-06-09/gas/testsuite/gas/i386/jump.d	2009-11-18 13:07:29.000000000 +0100
+++ 2010-06-09/gas/testsuite/gas/i386/jump.d	2010-06-21 18:05:07.000000000 +0200
@@ -34,22 +34,24 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:	ff 2b                	ljmp   \*\(%ebx\)
 [ 	]*[a-f0-9]+:	eb 00                	jmp    (0x)?7b( <.text(\+0x7b)?>)?
 [ 	]*[a-f0-9]+:	90                   	nop
-[ 	]*[a-f0-9]+:	eb 00                	jmp    (0x)?7e( <.text(\+0x7e)?>)?
+[ 	]*[a-f0-9]+:	e3 00                	jecxz  (0x)?7e( <.text(\+0x7e)?>)?
+[ 	]*[a-f0-9]+:	90                   	nop
+[ 	]*[a-f0-9]+:	eb 00                	jmp    (0x)?81( <.text(\+0x81)?>)?
 [ 	]*[a-f0-9]+:	90                   	nop
 [ 	]*[a-f0-9]+:	9a 90 90 90 90 90 90 	lcall  \$0x9090,\$0x90909090
 [ 	]*[a-f0-9]+:	9a 90 90 90 90 90 90 	lcall  \$0x9090,\$0x90909090
-[ 	]*[a-f0-9]+:	9a 00 00 00 00 90 90 	lcall  \$0x9090,\$0x0	8e: (R_386_)?(dir)?32	xxx
-[ 	]*[a-f0-9]+:	9a 00 00 00 00 90 90 	lcall  \$0x9090,\$0x0	95: (R_386_)?(dir)?32	xxx
+[ 	]*[a-f0-9]+:	9a 00 00 00 00 90 90 	lcall  \$0x9090,\$0x0[ 	]+[a-f0-9]+: (R_386_)?(dir)?32	xxx
+[ 	]*[a-f0-9]+:	9a 00 00 00 00 90 90 	lcall  \$0x9090,\$0x0[ 	]+[a-f0-9]+: (R_386_)?(dir)?32	xxx
 [ 	]*[a-f0-9]+:	9a 90 90 90 90 90 90 	lcall  \$0x9090,\$0x90909090
 [ 	]*[a-f0-9]+:	9a 90 90 90 90 90 90 	lcall  \$0x9090,\$0x90909090
-[ 	]*[a-f0-9]+:	9a 00 00 00 00 90 90 	lcall  \$0x9090,\$0x0	aa: (R_386_)?(dir)?32	xxx
-[ 	]*[a-f0-9]+:	9a 00 00 00 00 90 90 	lcall  \$0x9090,\$0x0	b1: (R_386_)?(dir)?32	xxx
+[ 	]*[a-f0-9]+:	9a 00 00 00 00 90 90 	lcall  \$0x9090,\$0x0[ 	]+[a-f0-9]+: (R_386_)?(dir)?32	xxx
+[ 	]*[a-f0-9]+:	9a 00 00 00 00 90 90 	lcall  \$0x9090,\$0x0[ 	]+[a-f0-9]+: (R_386_)?(dir)?32	xxx
 [ 	]*[a-f0-9]+:	ea 90 90 90 90 90 90 	ljmp   \$0x9090,\$0x90909090
 [ 	]*[a-f0-9]+:	ea 90 90 90 90 90 90 	ljmp   \$0x9090,\$0x90909090
-[ 	]*[a-f0-9]+:	ea 00 00 00 00 90 90 	ljmp   \$0x9090,\$0x0	c6: (R_386_)?(dir)?32	xxx
-[ 	]*[a-f0-9]+:	ea 00 00 00 00 90 90 	ljmp   \$0x9090,\$0x0	cd: (R_386_)?(dir)?32	xxx
+[ 	]*[a-f0-9]+:	ea 00 00 00 00 90 90 	ljmp   \$0x9090,\$0x0[ 	]+[a-f0-9]+: (R_386_)?(dir)?32	xxx
+[ 	]*[a-f0-9]+:	ea 00 00 00 00 90 90 	ljmp   \$0x9090,\$0x0[ 	]+[a-f0-9]+: (R_386_)?(dir)?32	xxx
 [ 	]*[a-f0-9]+:	ea 90 90 90 90 90 90 	ljmp   \$0x9090,\$0x90909090
 [ 	]*[a-f0-9]+:	ea 90 90 90 90 90 90 	ljmp   \$0x9090,\$0x90909090
-[ 	]*[a-f0-9]+:	ea 00 00 00 00 90 90 	ljmp   \$0x9090,\$0x0	e2: (R_386_)?(dir)?32	xxx
-[ 	]*[a-f0-9]+:	ea 00 00 00 00 90 90 	ljmp   \$0x9090,\$0x0	e9: (R_386_)?(dir)?32	xxx
+[ 	]*[a-f0-9]+:	ea 00 00 00 00 90 90 	ljmp   \$0x9090,\$0x0[ 	]+[a-f0-9]+: (R_386_)?(dir)?32	xxx
+[ 	]*[a-f0-9]+:	ea 00 00 00 00 90 90 	ljmp   \$0x9090,\$0x0[ 	]+[a-f0-9]+: (R_386_)?(dir)?32	xxx
 #pass
--- 2010-06-09/gas/testsuite/gas/i386/jump.s	2009-11-18 13:07:29.000000000 +0100
+++ 2010-06-09/gas/testsuite/gas/i386/jump.s	2010-06-21 18:04:12.000000000 +0200
@@ -33,6 +33,8 @@
 	jmp	fword ptr [ebx]
 	jmp	$+2
 	nop
+	jecxz	2+$
+	nop
 	jmp	.+2
 	nop
 




More information about the Binutils mailing list