OSDN Git Service

* config/xtensa/xtensa.h (FUNCTION_PROFILER): Respect flag_pic
authorbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Jun 2002 21:18:46 +0000 (21:18 +0000)
committerbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 18 Jun 2002 21:18:46 +0000 (21:18 +0000)
        when generating the call to _mcount.
        (NO_PROFILE_COUNTERS): Define.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54765 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/xtensa/xtensa.h

index 37bb487..db446af 100644 (file)
@@ -1,3 +1,9 @@
+2002-06-18  Bob Wilson  <bob.wilson@acm.org>
+
+       * config/xtensa/xtensa.h (FUNCTION_PROFILER): Respect flag_pic
+       when generating the call to _mcount.
+       (NO_PROFILE_COUNTERS): Define.
+
 2002-06-18  Richard Henderson  <rth@redhat.com>
 
        * print-rtl.c (print_rtx): Adjust NOTE argument numbers for
index 3ec7b3f..e98c2c6 100644 (file)
@@ -921,29 +921,33 @@ typedef struct xtensa_args {
    && (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST                     \
        || TREE_ADDRESSABLE (TYPE)))
 
-/* Output assembler code to FILE to increment profiler label LABELNO
-   for profiling a function entry.
-
-   The mcount code in glibc doesn't seem to use this LABELNO stuff.
-   Some ports (e.g., MIPS) don't even bother to pass the label
-   address, and even those that do (e.g., i386) don't seem to use it.
-   The information needed by mcount() is the current PC and the
-   current return address, so that mcount can identify an arc in the
-   call graph.  For Xtensa, we pass the current return address as
-   the first argument to mcount, and the current PC is available as
-   a0 in mcount's register window.  Both of these values contain
-   window size information in the two most significant bits; we assume
-   that the mcount code will mask off those bits.  The call to mcount
-   uses a window size of 8 to make sure that mcount doesn't clobber
+/* Profiling Xtensa code is typically done with the built-in profiling
+   feature of Tensilica's instruction set simulator, which does not
+   require any compiler support.  Profiling code on a real (i.e.,
+   non-simulated) Xtensa processor is currently only supported by
+   GNU/Linux with glibc.  The glibc version of _mcount doesn't require
+   counter variables.  The _mcount function needs the current PC and
+   the current return address to identify an arc in the call graph.
+   Pass the current return address as the first argument; the current
+   PC is available as a0 in _mcount's register window.  Both of these
+   values contain window size information in the two most significant
+   bits; we assume that _mcount will mask off those bits.  The call to
+   _mcount uses a window size of 8 to make sure that it doesn't clobber
    any incoming argument values. */
 
-#define FUNCTION_PROFILER(FILE, LABELNO)                               \
+#define NO_PROFILE_COUNTERS
+
+#define FUNCTION_PROFILER(FILE, LABELNO) \
   do {                                                                 \
-    fprintf (FILE, "\taddi\t%s, %s, 0\t# save current return address\n", \
-            reg_names[GP_REG_FIRST+10],                                \
-            reg_names[GP_REG_FIRST+0]);                                \
-    fprintf (FILE, "\tcall8\t_mcount\n");                              \
-  } while (0);
+    fprintf (FILE, "\t%s\ta10, a0\n", TARGET_DENSITY ? "mov.n" : "mov"); \
+    if (flag_pic)                                                      \
+      {                                                                        \
+       fprintf (FILE, "\tmovi\ta8, _mcount@PLT\n");                    \
+       fprintf (FILE, "\tcallx8\ta8\n");                               \
+      }                                                                        \
+    else                                                               \
+      fprintf (FILE, "\tcall8\t_mcount\n");                            \
+  } while (0)
 
 /* Stack pointer value doesn't matter at exit.  */
 #define EXIT_IGNORE_STACK 1