PATCH: PR gas/11037: invalid code generation depending on code position

H.J. Lu hongjiu.lu@intel.com
Tue Dec 8 01:54:00 GMT 2009


Hi,

When we can't compare symbol pointers directly to check if they
point to the same symbol due to converted local symbols.  This patch
fixes it.  OK to install?

Thanks.


H.J.
---
gas/

2009-12-07  H.J. Lu  <hongjiu.lu@intel.com>

	PR gas/11037
	* expr.c (resolve_expression): Call symbol_same_p to check
	if 2 symbols are the same.

	* symbols.c (symbol_same_p): New.
	* symbols.h (symbol_same_p): Likewise.

gas/testsuite/

2009-12-07  H.J. Lu  <hongjiu.lu@intel.com>

	PR gas/11037
	* gas/i386/intelpic.s: Add testcases.
	* gas/i386/intelpic.d: Updated.

diff --git a/gas/expr.c b/gas/expr.c
index 094141f..fbfdffc 100644
--- a/gas/expr.c
+++ b/gas/expr.c
@@ -2237,8 +2237,7 @@ resolve_expression (expressionS *expressionP)
 	op = O_constant;
       else if (seg_left == reg_section && final_val == 0)
 	op = O_register;
-      else if (seg_left == undefined_section
-	       && add_symbol != orig_add_symbol)
+      else if (!symbol_same_p (add_symbol, orig_add_symbol))
 	final_val += left;
       expressionP->X_add_symbol = add_symbol;
     }
diff --git a/gas/symbols.c b/gas/symbols.c
index 4cfa85b..5eda2cb 100644
--- a/gas/symbols.c
+++ b/gas/symbols.c
@@ -2385,6 +2385,20 @@ symbol_set_value_expression (symbolS *s, const expressionS *exp)
   S_CLEAR_WEAKREFR (s);
 }
 
+/* Return whether 2 symbols are the same.  */
+
+int
+symbol_same_p (symbolS *s1, symbolS *s2)
+{
+  if (s1->bsym == NULL
+      && local_symbol_converted_p ((struct local_symbol *) s1))
+    s1 = local_symbol_get_real_symbol ((struct local_symbol *) s1);
+  if (s2->bsym == NULL
+      && local_symbol_converted_p ((struct local_symbol *) s2))
+    s2 = local_symbol_get_real_symbol ((struct local_symbol *) s2);
+  return s1 == s2;
+}
+
 /* Return a pointer to the X_add_number component of a symbol.  */
 
 offsetT *
diff --git a/gas/symbols.h b/gas/symbols.h
index 19f58c6..377a130 100644
--- a/gas/symbols.h
+++ b/gas/symbols.h
@@ -198,6 +198,7 @@ extern int symbol_constant_p (symbolS *);
 extern int symbol_shadow_p (symbolS *);
 extern asymbol *symbol_get_bfdsym (symbolS *);
 extern void symbol_set_bfdsym (symbolS *, asymbol *);
+extern int symbol_same_p (symbolS *, symbolS *);
 
 #ifdef OBJ_SYMFIELD_TYPE
 OBJ_SYMFIELD_TYPE *symbol_get_obj (symbolS *);
diff --git a/gas/testsuite/gas/i386/intelpic.d b/gas/testsuite/gas/i386/intelpic.d
index 5af7389..d78894a 100644
--- a/gas/testsuite/gas/i386/intelpic.d
+++ b/gas/testsuite/gas/i386/intelpic.d
@@ -14,4 +14,14 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:	8b 83 00 00 00 00    	mov    0x0\(%ebx\),%eax
 [ 	]*[a-f0-9]+:	ff 24 85 0d 00 00 00 	jmp    \*0xd\(,%eax,4\)
 [ 	]*[a-f0-9]+:	8d 83 14 00 00 00    	lea    0x14\(%ebx\),%eax
+[ 	]*[a-f0-9]+:	ff 24 85 0d 10 00 00 	jmp    \*0x100d\(,%eax,4\)
+[ 	]*[a-f0-9]+:	ff 24 85 28 10 00 00 	jmp    \*0x1028\(,%eax,4\)
+[ 	]*[a-f0-9]+:	90                   	nop
+
+0+29 <L11>:
+[ 	]*[a-f0-9]+:	ff 24 85 29 10 00 00 	jmp    \*0x1029\(,%eax,4\)
+[ 	]*[a-f0-9]+:	ff 24 85 37 10 00 00 	jmp    \*0x1037\(,%eax,4\)
+
+0+37 <L12>:
+[ 	]*[a-f0-9]+:	90                   	nop
 #pass
diff --git a/gas/testsuite/gas/i386/intelpic.s b/gas/testsuite/gas/i386/intelpic.s
index 9bca76f..b8db43d 100644
--- a/gas/testsuite/gas/i386/intelpic.s
+++ b/gas/testsuite/gas/i386/intelpic.s
@@ -12,3 +12,12 @@ bar:
         jmp     DWORD PTR[ .L11  + eax * 4 ]
 .LC0:
         lea     eax, DWORD PTR[ .LC0@GOTOFF + ebx ]
+        jmp     DWORD PTR[ .L11  + eax * 4 + 0x1000 ]
+        jmp     DWORD PTR[ .L12  + eax * 4 + 0x1000 ]
+.L12:
+	nop
+L11:
+        jmp     DWORD PTR[ L11  + eax * 4 + 0x1000 ]
+        jmp     DWORD PTR[ L12  + eax * 4 + 0x1000 ]
+L12:
+	nop



More information about the Binutils mailing list