* config/rs6000/rs6000.c (rs6000_traceback_name): New var.
authoramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Jul 2002 23:46:47 +0000 (23:46 +0000)
committeramodra <amodra@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 26 Jul 2002 23:46:47 +0000 (23:46 +0000)
(rs6000_traceback): New var.
(rs6000_override_options): Set rs6000_traceback.
(rs6000_output_function_epilogue): Implement traceback options.
* config/rs6000/rs6000.h (TARGET_OPTIONS): Add "traceback=".
(rs6000_traceback_name): Declare.

* config/rs6000/rs6000.c (output_profile_hook): Don't generate profile
label reference when NO_PROFILE_COUNTERS.

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

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.h

index 138d317..ffed763 100644 (file)
@@ -1,3 +1,15 @@
+2002-07-27  Alan Modra  <amodra@bigpond.net.au>
+
+       * config/rs6000/rs6000.c (rs6000_traceback_name): New var.
+       (rs6000_traceback): New var.
+       (rs6000_override_options): Set rs6000_traceback.
+       (rs6000_output_function_epilogue): Implement traceback options.
+       * config/rs6000/rs6000.h (TARGET_OPTIONS): Add "traceback=".
+       (rs6000_traceback_name): Declare.
+
+       * config/rs6000/rs6000.c (output_profile_hook): Don't generate profile
+       label reference when NO_PROFILE_COUNTERS.
+
 2002-07-26  Jason Merrill  <jason@redhat.com>
 
        * function.c (assign_parms): Handle frontend-directed pass by
index a9f3e24..2df15f2 100644 (file)
@@ -129,6 +129,14 @@ const char *rs6000_debug_name;
 int rs6000_debug_stack;                /* debug stack applications */
 int rs6000_debug_arg;          /* debug argument handling */
 
+const char *rs6000_traceback_name;
+static enum {
+  traceback_default = 0,
+  traceback_none,
+  traceback_part,
+  traceback_full
+} rs6000_traceback;
+
 /* Flag to say the TOC is initialized */
 int toc_initialized;
 char toc_label_name[10];
@@ -600,6 +608,19 @@ rs6000_override_options (default_cpu)
        error ("unknown -mdebug-%s switch", rs6000_debug_name);
     }
 
+  if (rs6000_traceback_name)
+    {
+      if (! strncmp (rs6000_traceback_name, "full", 4))
+       rs6000_traceback = traceback_full;
+      else if (! strncmp (rs6000_traceback_name, "part", 4))
+       rs6000_traceback = traceback_part;
+      else if (! strncmp (rs6000_traceback_name, "no", 2))
+       rs6000_traceback = traceback_none;
+      else
+       error ("unknown -mtraceback arg `%s'; expecting `full', `partial' or `none'",
+              rs6000_traceback_name);
+    }
+
   /* Set size of long double */
   rs6000_long_double_type_size = 64;
   if (rs6000_long_double_size_string)
@@ -10818,7 +10839,6 @@ rs6000_output_function_epilogue (file, size)
      HOST_WIDE_INT size ATTRIBUTE_UNUSED;
 {
   rs6000_stack_t *info = rs6000_stack_info ();
-  int optional_tbtab = (optimize_size || TARGET_ELF) ? 0 : 1;
 
   if (! HAVE_epilogue)
     {
@@ -10871,12 +10891,21 @@ rs6000_output_function_epilogue (file, size)
 
      System V.4 Powerpc's (and the embedded ABI derived from it) use a
      different traceback table.  */
-  if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive)
+  if (DEFAULT_ABI == ABI_AIX && ! flag_inhibit_size_directive
+      && rs6000_traceback != traceback_none)
     {
       const char *fname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
       const char *language_string = lang_hooks.name;
       int fixed_parms = 0, float_parms = 0, parm_info = 0;
       int i;
+      int optional_tbtab;
+
+      if (rs6000_traceback == traceback_full)
+       optional_tbtab = 1;
+      else if (rs6000_traceback == traceback_part)
+       optional_tbtab = 0;
+      else
+       optional_tbtab = !optimize_size && !TARGET_ELF;
 
       while (*fname == '.')    /* V.4 encodes . in the name */
        fname++;
@@ -11070,7 +11099,6 @@ rs6000_output_function_epilogue (file, size)
 
       fputs ("\t.align 2\n", file);
     }
-  return;
 }
 \f
 /* A C compound statement that outputs the assembler code for a thunk
@@ -11835,10 +11863,13 @@ rs6000_gen_section_name (buf, filename, section_desc)
 
 void
 output_profile_hook (labelno)
-     int labelno;
+     int labelno ATTRIBUTE_UNUSED;
 {
   if (DEFAULT_ABI == ABI_AIX)
     {
+#ifdef NO_PROFILE_COUNTERS
+      emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 0);
+#else
       char buf[30];
       const char *label_name;
       rtx fun;
@@ -11849,6 +11880,7 @@ output_profile_hook (labelno)
 
       emit_library_call (init_one_libfunc (RS6000_MCOUNT), 0, VOIDmode, 1,
                          fun, Pmode);
+#endif
     }
   else if (DEFAULT_ABI == ABI_DARWIN)
     {
index 402490b..332609e 100644 (file)
@@ -392,6 +392,8 @@ extern enum processor_type rs6000_cpu;
    {"tune=", &rs6000_select[2].string,                                 \
     N_("Schedule code for given CPU") },                               \
    {"debug=", &rs6000_debug_name, N_("Enable debug output") },         \
+   {"traceback=", &rs6000_traceback_name,                              \
+    N_("Select full, part, or no traceback table") },                  \
    {"abi=", &rs6000_abi_string, N_("Specify ABI to use") },            \
    {"long-double-", &rs6000_long_double_size_string,                   \
     N_("Specify size of long double (64 or 128 bits)") },              \
@@ -425,6 +427,8 @@ extern int rs6000_debug_arg;                /* debug argument handling */
 #define        TARGET_DEBUG_STACK      rs6000_debug_stack
 #define        TARGET_DEBUG_ARG        rs6000_debug_arg
 
+extern const char *rs6000_traceback_name; /* Type of traceback table.  */
+
 /* These are separate from target_flags because we've run out of bits
    there.  */
 extern const char *rs6000_long_double_size_string;