This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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, committed] Nios II GOT pointer initialization


The initial commit of the Nios II GCC backend has an ABI conformance bug in that it initializes the GOT pointer from _GLOBAL_OFFSET_TABLE_ rather than _gp_got, as specified in the ABI. As a consequence of this, GCC-generated code can only address 32K of GOT rather than 64K as documented in the ABI. This patch fixes that.

This patch depends on the binutils patch I posted earlier today:

https://sourceware.org/ml/binutils/2014-02/msg00009.html

as the linker was not previously defining the _gp_got symbol specified in the ABI document. There's a potential compatibility issue here with old versions of the linker, but we'd rather have the first official release of GCC for Nios II implement this correctly.

-Sandra

2014-02-02  Sandra Loosemore  <sandra@codesourcery.com>

	gcc/
	* config/nios2/nios2.md (load_got_register): Initialize GOT
	pointer from _gp_got instead of _GLOBAL_OFFSET_TABLE_.
	* config/nios2/nios2.c (nios2_function_profiler): Likewise.

	libgcc/
	* config/nios2/crti.S (_init): Initialize GOT pointer from
	_gp_got instead of _GLOBAL_OFFSET_TABLE_.
Index: gcc/config/nios2/nios2.md
===================================================================
--- gcc/config/nios2/nios2.md	(revision 207406)
+++ gcc/config/nios2/nios2.md	(working copy)
@@ -1015,8 +1015,8 @@
   ""
   "nextpc\\t%0
 \\t1:
-\\tmovhi\\t%1, %%hiadj(_GLOBAL_OFFSET_TABLE_ - 1b)
-\\taddi\\t%1, %1, %%lo(_GLOBAL_OFFSET_TABLE_ - 1b)"
+\\tmovhi\\t%1, %%hiadj(_gp_got - 1b)
+\\taddi\\t%1, %1, %%lo(_gp_got - 1b)"
   [(set_attr "length" "12")])
 
 ;; Read thread pointer register
Index: gcc/config/nios2/nios2.c
===================================================================
--- gcc/config/nios2/nios2.c	(revision 207406)
+++ gcc/config/nios2/nios2.c	(working copy)
@@ -667,8 +667,8 @@ nios2_function_profiler (FILE *file, int
   if (flag_pic)
     {
       fprintf (file, "\tnextpc\tr2\n");
-      fprintf (file, "\t1: movhi\tr3, %%hiadj(_GLOBAL_OFFSET_TABLE_ - 1b)\n");
-      fprintf (file, "\taddi\tr3, r3, %%lo(_GLOBAL_OFFSET_TABLE_ - 1b)\n");
+      fprintf (file, "\t1: movhi\tr3, %%hiadj(_gp_got - 1b)\n");
+      fprintf (file, "\taddi\tr3, r3, %%lo(_gp_got - 1b)\n");
       fprintf (file, "\tadd\tr2, r2, r3\n");
       fprintf (file, "\tldw\tr2, %%call(_mcount)(r2)\n");
       fprintf (file, "\tcallr\tr2\n");
Index: libgcc/config/nios2/crti.S
===================================================================
--- libgcc/config/nios2/crti.S	(revision 207406)
+++ libgcc/config/nios2/crti.S	(working copy)
@@ -56,8 +56,8 @@ _init:
 	addi	fp, sp, 8
 #ifdef linux
 	nextpc	r22
-1:	movhi	r2, %hiadj(_GLOBAL_OFFSET_TABLE_ - 1b)
-	addi	r2, r2, %lo(_GLOBAL_OFFSET_TABLE_ - 1b)
+1:	movhi	r2, %hiadj(_gp_got - 1b)
+	addi	r2, r2, %lo(_gp_got - 1b)
 	add	r22, r22, r2
 #endif
 	
@@ -80,8 +80,8 @@ _fini:
 	addi	fp, sp, 8
 #ifdef linux
 	nextpc	r22
-1:	movhi	r2, %hiadj(_GLOBAL_OFFSET_TABLE_ - 1b)
-	addi	r2, r2, %lo(_GLOBAL_OFFSET_TABLE_ - 1b)
+1:	movhi	r2, %hiadj(_gp_got - 1b)
+	addi	r2, r2, %lo(_gp_got - 1b)
 	add	r22, r22, r2
 #endif
 

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