sparc.h (ASM_OUTPUT_MI_THUNK): Move %o7 through %g1 instead of save+restore.
authorRichard Henderson <rth@cygnus.com>
Tue, 30 Dec 1997 00:02:54 +0000 (16:02 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 30 Dec 1997 00:02:54 +0000 (16:02 -0800)
* sparc.h (ASM_OUTPUT_MI_THUNK): Move %o7 through %g1 instead of
save+restore.  Fix pic+big_offset delay slot.  Use "pic" case for
unix always, since we want to be able to thunk to functions in a
shared library from an application.

From-SVN: r17262

gcc/ChangeLog
gcc/config/sparc/sparc.h

index c619c03b371f8c2d1ab3b81f42e1d7ff61dcd402..b2043d1ac9a0cbe579fcd945e0a26d451b32d5c8 100644 (file)
@@ -1,3 +1,10 @@
+Tue Dec 30 00:04:49 1997  Richard Henderson  <rth@cygnus.com>
+
+       * sparc.h (ASM_OUTPUT_MI_THUNK): Move %o7 through %g1 instead of
+       save+restore.  Fix pic+big_offset delay slot.  Use "pic" case for
+       unix always, since we want to be able to thunk to functions in a
+       shared library from an application.
+
 Mon Dec 29 14:37:31 1997  Ian Lance Taylor  <ian@cygnus.com>
 
        * mips/t-ecoff (CROSS_LIBGCC1): Define to libgcc1-asm.a.
index e87058cc33f4d4a43aea8a7e9c2a3d1e59f4f3df..2cc8b95a3d55630299184d8463ef777845111cc4 100644 (file)
@@ -3017,11 +3017,15 @@ do {                                                                    \
   int big_delta = (DELTA) >= 4096 || (DELTA) < -4096;                  \
   if (big_delta)                                                       \
     fprintf (FILE, "\tset %d,%%g1\n\tadd %%o0,%%g1,%%o0\n", (DELTA));  \
-  if (flag_pic)                                                                \
+  /* Don't use the jmp solution unless we know the target is local to  \
+     the application or shared object.                                 \
+     XXX: Wimp out and don't actually check anything except if this is \
+     an embedded target where we assume there are no shared libs.  */  \
+  if (!TARGET_CM_EMBMEDANY || flag_pic)                                        \
     {                                                                  \
       if (! big_delta)                                                 \
        fprintf (FILE, "\tadd %%o0,%d,%%o0\n", DELTA);                  \
-      fprintf (FILE, "\tsave %%sp,-112,%%sp\n");                       \
+      fprintf (FILE, "\tmov %%o7,%%g1\n");                             \
       fprintf (FILE, "\tcall ");                                       \
       assemble_name                                                    \
        (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION)));    \
@@ -3044,10 +3048,10 @@ do {                                                                    \
        (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION)));    \
       fprintf (FILE, ")\n");                                           \
     }                                                                  \
-  if (big_delta)                                                       \
+  if (!TARGET_CM_EMBMEDANY || flag_pic)                                        \
+    fprintf (FILE, "\tmov %%g1,%%o7\n");                               \
+  else if (big_delta)                                                  \
     fprintf (FILE, "\tnop\n");                                         \
-  else if (flag_pic)                                                   \
-    fprintf (FILE, "\trestore\n");                                     \
   else                                                                 \
     fprintf (FILE, "\tadd %%o0,%d,%%o0\n", DELTA);                     \
 } while (0)