linux-unwind.h (SH_DWARF_FRAME_XD0): Remove for SH5.
[platform/upstream/gcc.git] / gcc / config / sh / linux.h
index fe48d0c..51d52eb 100644 (file)
@@ -68,29 +68,56 @@ Boston, MA 02111-1307, USA.  */
 #undef FUNCTION_PROFILER
 #define FUNCTION_PROFILER(STREAM,LABELNO)                              \
   do {                                                                 \
-    if (flag_pic)                                                      \
+    if (TARGET_SHMEDIA)                                                        \
       {                                                                        \
-       fprintf (STREAM, "\tmov.l\t3f,r1\n");                           \
-       fprintf (STREAM, "\tmova\t3f,r0\n");                            \
-       fprintf (STREAM, "\tadd\tr1,r0\n");                             \
-       fprintf (STREAM, "\tmov.l\t1f,r1\n");                           \
-       fprintf (STREAM, "\tmov.l\t@(r0,r1),r1\n");                     \
+       fprintf (STREAM, "\tpt\t1f,tr1\n");                             \
+       fprintf (STREAM, "\taddi.l\tr15,-8,r15\n");                     \
+       fprintf (STREAM, "\tst.l\tr15,0,r18\n");                        \
+       if (flag_pic)                                                   \
+         {                                                             \
+           char *gofs = "(datalabel _GLOBAL_OFFSET_TABLE_-(0f-.))";    \
+           fprintf (STREAM, "\tmovi\t((%s>>16)&0xffff),r21\n", gofs);  \
+           fprintf (STREAM, "\tshori\t(%s & 0xffff),r21\n", gofs);     \
+           fprintf (STREAM, "0:\tptrel/u\tr21,tr0\n");                 \
+           fprintf (STREAM, "\tmovi\t((mcount@GOTPLT)&0xffff),r22\n"); \
+           fprintf (STREAM, "\tgettr\ttr0,r21\n");                     \
+           fprintf (STREAM, "\tadd.l\tr21,r22,r21\n");                 \
+           fprintf (STREAM, "\tld.l\tr21,0,r21\n");                    \
+           fprintf (STREAM, "\tptabs\tr21,tr0\n");                     \
+         }                                                             \
+       else                                                            \
+         fprintf (STREAM, "\tpt\tmcount,tr0\n");                       \
+       fprintf (STREAM, "\tgettr\ttr1,r18\n");                         \
+       fprintf (STREAM, "\tblink\ttr0,r63\n");                         \
+       fprintf (STREAM, "1:\tld.l\tr15,0,r18\n");                      \
+       fprintf (STREAM, "\taddi.l\tr15,8,r15\n");                      \
       }                                                                        \
     else                                                               \
-      fprintf (STREAM, "\tmov.l\t1f,r1\n");                            \
-    fprintf (STREAM, "\tsts.l\tpr,@-r15\n");                           \
-    fprintf (STREAM, "\tmova\t2f,r0\n");                               \
-    fprintf (STREAM, "\tjmp\t@r1\n");                                  \
-    fprintf (STREAM, "\tlds\tr0,pr\n");                                        \
-    fprintf (STREAM, "\t.align\t2\n");                                 \
-    if (flag_pic)                                                      \
       {                                                                        \
-       fprintf (STREAM, "1:\t.long\tmcount@GOT\n");                    \
-       fprintf (STREAM, "3:\t.long\t_GLOBAL_OFFSET_TABLE_\n");         \
+       if (flag_pic)                                                   \
+         {                                                             \
+           fprintf (STREAM, "\tmov.l\t3f,r1\n");                       \
+           fprintf (STREAM, "\tmova\t3f,r0\n");                        \
+           fprintf (STREAM, "\tadd\tr1,r0\n");                         \
+           fprintf (STREAM, "\tmov.l\t1f,r1\n");                       \
+           fprintf (STREAM, "\tmov.l\t@(r0,r1),r1\n");                 \
+         }                                                             \
+       else                                                            \
+         fprintf (STREAM, "\tmov.l\t1f,r1\n");                         \
+       fprintf (STREAM, "\tsts.l\tpr,@-r15\n");                        \
+       fprintf (STREAM, "\tmova\t2f,r0\n");                            \
+       fprintf (STREAM, "\tjmp\t@r1\n");                               \
+       fprintf (STREAM, "\tlds\tr0,pr\n");                             \
+       fprintf (STREAM, "\t.align\t2\n");                              \
+       if (flag_pic)                                                   \
+         {                                                             \
+           fprintf (STREAM, "1:\t.long\tmcount@GOT\n");                \
+           fprintf (STREAM, "3:\t.long\t_GLOBAL_OFFSET_TABLE_\n");     \
+         }                                                             \
+       else                                                            \
+         fprintf (STREAM, "1:\t.long\tmcount\n");                      \
+       fprintf (STREAM, "2:\tlds.l\t@r15+,pr\n");                      \
       }                                                                        \
-    else                                                               \
-      fprintf (STREAM, "1:\t.long\tmcount\n");                         \
-    fprintf (STREAM, "2:\tlds.l\t@r15+,pr\n");                         \
   } while (0)
 
 #define MD_UNWIND_SUPPORT "config/sh/linux-unwind.h"