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, nios2] Misc. fixes


This contains a few small changes/fixes, committed to trunk.

(1) a typo in nios2_function_profiler.
(2) unneeded parameter in nios2_large_got_address().
(3) remove two no longer needed unspec enums.
(4) Provide basic implementation of the delegitimize address hook, to
silent a unrecognized UNSPECs warning when building with -g.
(5) Adjust the nios2-linux LINK_SPEC to define the dynamic linker name
to /lib/ld-linux-nios2.so.1, which is the current upstreamed arrangement.

Chung-Lin

2014-04-01  Chung-Lin Tang  <cltang@codesourcery.com>

        * config/nios2/nios2.md (unspec): Remove UNSPEC_TLS, UNSPEC_TLS_LDM.
        * config/nios2/nios2.c (nios2_function_profiler): Fix addi operand
        typo.
        (nios2_large_got_address): Remove unneeded 'sym' parameter.
        (nios2_got_address): Update nios2_large_got_address call site.
        (nios2_delegitimize_address): New function.
        (TARGET_DELEGITIMIZE_ADDRESS): Define to nios2_delegitimize_address.
        * config/nios2/linux.h (GLIBC_DYNAMIC_LINKER): Define.
        (LINK_SPEC): Specify dynamic linker using GNU_USER_DYNAMIC_LINKER.
Index: config/nios2/linux.h
===================================================================
--- config/nios2/linux.h	(revision 208987)
+++ config/nios2/linux.h	(working copy)
@@ -26,11 +26,16 @@
     }                                           \
   while (0)
 
+#define GLIBC_DYNAMIC_LINKER "/lib/ld-linux-nios2.so.1"
+
 #undef LINK_SPEC
 #define LINK_SPEC LINK_SPEC_ENDIAN \
-  " %{shared:-shared} \
-    %{static:-Bstatic} \
-    %{rdynamic:-export-dynamic}"
+ "%{shared:-shared} \
+  %{!shared: \
+    %{!static: \
+      %{rdynamic:-export-dynamic} \
+      -dynamic-linker " GNU_USER_DYNAMIC_LINKER "} \
+    %{static:-static}}"
 
 /* This toolchain implements the ABI for Linux Systems documented in the
    Nios II Processor Reference Handbook.  */
Index: config/nios2/nios2.md
===================================================================
--- config/nios2/nios2.md	(revision 208987)
+++ config/nios2/nios2.md	(working copy)
@@ -74,8 +74,6 @@
   UNSPEC_PIC_SYM
   UNSPEC_PIC_CALL_SYM
   UNSPEC_PIC_GOTOFF_SYM
-  UNSPEC_TLS
-  UNSPEC_TLS_LDM
   UNSPEC_LOAD_TLS_IE
   UNSPEC_ADD_TLS_LE
   UNSPEC_ADD_TLS_GD
Index: config/nios2/nios2.c
===================================================================
--- config/nios2/nios2.c	(revision 208987)
+++ config/nios2/nios2.c	(working copy)
@@ -695,7 +695,7 @@ nios2_function_profiler (FILE *file, int labelno A
       fprintf (file, "\taddi\tr3, r3, %%lo(_gp_got - 1b)\n");
       fprintf (file, "\tadd\tr2, r2, r3\n");
       fprintf (file, "\tmovhi\tr3, %%call_hiadj(_mcount)\n");
-      fprintf (file, "\taddi\tr3, %%call_lo(_mcount)\n");
+      fprintf (file, "\taddi\tr3, r3, %%call_lo(_mcount)\n");
       fprintf (file, "\tadd\tr3, r2, r3\n");
       fprintf (file, "\tldw\tr2, 0(r3)\n");
       fprintf (file, "\tcallr\tr2\n");
@@ -1183,7 +1183,7 @@ nios2_unspec_offset (rtx loc, int unspec)
 
 /* Generate GOT pointer based address with large offset.  */
 static rtx
-nios2_large_got_address (rtx sym, rtx offset)
+nios2_large_got_address (rtx offset)
 {
   rtx addr = gen_reg_rtx (Pmode);
   emit_insn (gen_add3_insn (addr, pic_offset_table_rtx,
@@ -1199,7 +1199,7 @@ nios2_got_address (rtx loc, int unspec)
   crtl->uses_pic_offset_table = 1;
 
   if (nios2_large_offset_p (unspec))
-    return nios2_large_got_address (loc, offset);
+    return nios2_large_got_address (offset);
 
   return gen_rtx_PLUS (Pmode, pic_offset_table_rtx, offset);
 }
@@ -1805,6 +1805,30 @@ nios2_legitimize_address (rtx x, rtx oldx ATTRIBUT
   return x;
 }
 
+static rtx
+nios2_delegitimize_address (rtx x)
+{
+  x = delegitimize_mem_from_attrs (x);
+
+  if (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == UNSPEC)
+    {
+      switch (XINT (XEXP (x, 0), 1))
+	{
+	case UNSPEC_PIC_SYM:
+	case UNSPEC_PIC_CALL_SYM:
+	case UNSPEC_PIC_GOTOFF_SYM:
+	case UNSPEC_ADD_TLS_GD:
+	case UNSPEC_ADD_TLS_LDM:
+	case UNSPEC_LOAD_TLS_IE:
+	case UNSPEC_ADD_TLS_LE:
+	  x = XVECEXP (XEXP (x, 0), 0, 0);
+	  gcc_assert (GET_CODE (x) == SYMBOL_REF);
+	  break;
+	}
+    }
+  return x;
+}
+
 /* Main expander function for RTL moves.  */
 int
 nios2_emit_move_sequence (rtx *operands, enum machine_mode mode)
@@ -3259,6 +3283,9 @@ nios2_merge_decl_attributes (tree olddecl, tree ne
 #undef TARGET_LEGITIMIZE_ADDRESS
 #define TARGET_LEGITIMIZE_ADDRESS nios2_legitimize_address
 
+#undef TARGET_DELEGITIMIZE_ADDRESS
+#define TARGET_DELEGITIMIZE_ADDRESS nios2_delegitimize_address
+
 #undef TARGET_LEGITIMATE_ADDRESS_P
 #define TARGET_LEGITIMATE_ADDRESS_P nios2_legitimate_address_p
 

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