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/12186: "add ebx, OFFSET FLAT:_GLOBAL_OFFSET_TABLE_" is incorrectly assembled


Hi,

I checked in this patch to properly fold _GLOBAL_OFFSET_TABLE_ in Intel
syntax.


H.J.
---
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 17ce85a..5cb95f8 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,9 @@
+2010-11-03  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR gas/12186
+	* config/tc-i386-intel.c (i386_intel_fold): Properly fold
+	_GLOBAL_OFFSET_TABLE_.
+
 2010-11-02  Joseph Myers  <joseph@codesourcery.com>
 
 	* config/tc-tic6x.c (OPTION_MPID, OPTION_MPIC, OPTION_MNO_PIC):
diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c
index 64d6824..1e563b2 100644
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -227,15 +227,20 @@ static INLINE int i386_intel_check (const reg_entry *rreg,
 
 static INLINE void i386_intel_fold (expressionS *e, symbolS *sym)
 {
+  expressionS *exp = symbol_get_value_expression (sym);
   if (S_GET_SEGMENT (sym) == absolute_section)
     {
       offsetT val = e->X_add_number;
 
-      *e = *symbol_get_value_expression (sym);
+      *e = *exp;
       e->X_add_number += val;
     }
   else
     {
+      if (exp->X_op == O_symbol
+	  && strcmp (S_GET_NAME (exp->X_add_symbol),
+		     GLOBAL_OFFSET_TABLE_NAME) == 0)
+	sym = exp->X_add_symbol;
       e->X_add_symbol = sym;
       e->X_op_symbol = NULL;
       e->X_op = O_symbol;
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index e7936f6..07689b6 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2010-11-03  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR gas/12186
+	* gas/i386/gotpc.s: Add more _GLOBAL_OFFSET_TABLE_ test.
+	* gas/i386/gotpc.d: Updated.
+
 2010-11-02  Joseph Myers  <joseph@codesourcery.com>
 
 	* gas/tic6x/attr-array-directive-1.d,
diff --git a/gas/testsuite/gas/i386/gotpc.d b/gas/testsuite/gas/i386/gotpc.d
index ef79cbd..30faabd 100644
--- a/gas/testsuite/gas/i386/gotpc.d
+++ b/gas/testsuite/gas/i386/gotpc.d
@@ -51,4 +51,5 @@ Disassembly of section .text:
   e4:	00 00 [ 	]*add    %al,\(%eax\)	e4: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_
   e6:	00 00 [ 	]*add    %al,\(%eax\)
   e8:	8b 83 00 00 00 00 [ 	]*mov    0x0\(%ebx\),%eax	ea: (R_386_)?GOTOFF	_GLOBAL_OFFSET_TABLE_
+  ee:	81 c3 02 00 00 00 [ 	]*add    \$0x2,%ebx	f0: (R_386_)GOTPC	_GLOBAL_OFFSET_TABLE_
 #pass
diff --git a/gas/testsuite/gas/i386/gotpc.s b/gas/testsuite/gas/i386/gotpc.s
index fc771f6..150bd16 100644
--- a/gas/testsuite/gas/i386/gotpc.s
+++ b/gas/testsuite/gas/i386/gotpc.s
@@ -39,3 +39,6 @@ test:
 	.long _GLOBAL_OFFSET_TABLE_+[.-test]
 	.long _GLOBAL_OFFSET_TABLE_@GOTOFF
 	movl _GLOBAL_OFFSET_TABLE_@GOTOFF (%ebx), %eax
+
+	.intel_syntax noprefix
+	add	ebx, OFFSET FLAT:_GLOBAL_OFFSET_TABLE_


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