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