target/6413

Alan Modra amodra@bigpond.net.au
Mon Apr 22 21:28:00 GMT 2002


Tested by building gcc-3.1 hppa-linux cross-compiler and compiling glibc
with --enable-profile.  Currently bootstrapping and regression testing
native i686-linux mainline compiler.

gcc/ChangeLog
	PR target/6413
	* function.h: (struct function): Add profile_label_no field.
	(current_function_profile_label_no): Define.
	* function.c: (profile_label_no): New static var.
	(expand_function_start): Increment it, and copy to
	current_function_profile_label_no.
	* output.h (profile_label_no): Delete.
	* final.c (profile_label_no): Delete.
	(profile_function): Use current_function_profile_label_no.
	(final_end_function): Don't increment profile_label_no here.
	* config/pa/pa.c (current_function_number): Delete.
	(pa_output_function_prologue): Don't output profile label here.
	(hppa_profile_hook): Use label_no param rather than
	current_function_number.
	(FUNC_BEGIN_PROLOG_LABEL): Move to ..
	* config/pa/pa.h: .. here.
	(FUNCTION_PROFILER): Output profile label here.

-- 
Alan Modra
IBM OzLabs - Linux Technology Centre

diff -urpN -xCVS -x'*~' -xTAGS gcc-31.orig/gcc/function.h gcc-31/gcc/function.h
--- gcc-31.orig/gcc/function.h	2002-01-04 21:43:25.000000000 +1030
+++ gcc-31/gcc/function.h	2002-04-23 13:22:37.000000000 +0930
@@ -364,6 +364,9 @@ struct function
   /* Highest label number in current function.  */
   int inl_max_label_num;
 
+  /* Profile label number.  */
+  int profile_label_no;
+
   /* For md files.  */
 
   /* tm.h can use this to store whatever it likes.  */
@@ -508,6 +511,7 @@ extern int virtuals_instantiated;
 #define current_function_return_rtx (cfun->return_rtx)
 #define current_function_instrument_entry_exit (cfun->instrument_entry_exit)
 #define current_function_profile (cfun->profile)
+#define current_function_profile_label_no (cfun->profile_label_no)
 #define current_function_limit_stack (cfun->limit_stack)
 #define current_function_uses_pic_offset_table (cfun->uses_pic_offset_table)
 #define current_function_uses_const_pool (cfun->uses_const_pool)
diff -urpN -xCVS -x'*~' -xTAGS gcc-31.orig/gcc/function.c gcc-31/gcc/function.c
--- gcc-31.orig/gcc/function.c	2002-04-23 11:06:21.000000000 +0930
+++ gcc-31/gcc/function.c	2002-04-23 13:22:37.000000000 +0930
@@ -123,6 +123,9 @@ int current_function_uses_only_leaf_regs
    post-instantiation libcalls.  */
 int virtuals_instantiated;
 
+/* Assign unique numbers to labels generated for profiling.  */
+static int profile_label_no;
+
 /* These variables hold pointers to functions to create and destroy
    target specific, per-function data structures.  */
 void (*init_machine_status) PARAMS ((struct function *));
@@ -6694,10 +6697,13 @@ expand_function_start (subr, parms_have_
 			 Pmode);
     }
 
-#ifdef PROFILE_HOOK
   if (current_function_profile)
-    PROFILE_HOOK (profile_label_no);
+    {
+      current_function_profile_label_no = profile_label_no++;
+#ifdef PROFILE_HOOK
+      PROFILE_HOOK (current_function_profile_label_no);
 #endif
+    }
 
   /* After the display initializations is where the tail-recursion label
      should go, if we end up needing one.   Ensure we have a NOTE here
diff -urpN -xCVS -x'*~' -xTAGS gcc-31.orig/gcc/output.h gcc-31/gcc/output.h
--- gcc-31.orig/gcc/output.h	2002-03-01 23:18:11.000000000 +1030
+++ gcc-31/gcc/output.h	2002-04-23 13:22:37.000000000 +0930
@@ -484,9 +484,6 @@ extern const char *user_label_prefix;
 #define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
   (VAR) = ((SYMBOL_NAME) + ((SYMBOL_NAME)[0] == '*'))
 #endif
-/* Assign unique numbers to labels generated for profiling.  */
-
-extern int profile_label_no;
 
 /* Default target function prologue and epilogue assembler output.  */
 extern void default_function_pro_epilogue PARAMS ((FILE *, HOST_WIDE_INT));
diff -urpN -xCVS -x'*~' -xTAGS gcc-31.orig/gcc/final.c gcc-31/gcc/final.c
--- gcc-31.orig/gcc/final.c	2002-04-05 11:24:31.000000000 +0930
+++ gcc-31/gcc/final.c	2002-04-23 13:22:37.000000000 +0930
@@ -170,10 +170,6 @@ char regs_ever_live[FIRST_PSEUDO_REGISTE
 
 int frame_pointer_needed;
 
-/* Assign unique numbers to labels generated for profiling.  */
-
-int profile_label_no;
-
 /* Number of unmatched NOTE_INSN_BLOCK_BEG notes we have seen.  */
 
 static int block_depth;
@@ -1595,7 +1591,7 @@ profile_function (file)
 #ifndef NO_PROFILE_COUNTERS
   data_section ();
   ASM_OUTPUT_ALIGN (file, floor_log2 (align / BITS_PER_UNIT));
-  ASM_OUTPUT_INTERNAL_LABEL (file, "LP", profile_label_no);
+  ASM_OUTPUT_INTERNAL_LABEL (file, "LP", current_function_profile_label_no);
   assemble_integer (const0_rtx, LONG_TYPE_SIZE / BITS_PER_UNIT, align, 1);
 #endif
 
@@ -1625,7 +1621,7 @@ profile_function (file)
 #endif
 #endif
 
-  FUNCTION_PROFILER (file, profile_label_no);
+  FUNCTION_PROFILER (file, current_function_profile_label_no);
 
 #if defined(STATIC_CHAIN_INCOMING_REGNUM) && defined(ASM_OUTPUT_REG_PUSH)
   if (cxt)
@@ -1675,8 +1671,6 @@ final_end_function ()
       && dwarf2out_do_frame ())
     dwarf2out_end_epilogue ();
 #endif
-
-  profile_label_no++;
 }
 
 /* Output assembler code for some insns: all or part of a function.
diff -urpN -xCVS -x'*~' -xTAGS gcc-31.orig/gcc/config/pa/pa.c gcc-31/gcc/config/pa/pa.c
--- gcc-31.orig/gcc/config/pa/pa.c	2002-04-13 10:09:37.000000000 +0930
+++ gcc-31/gcc/config/pa/pa.c	2002-04-23 13:25:43.000000000 +0930
@@ -67,10 +67,6 @@ Boston, MA 02111-1307, USA.  */
 #define FRP(INSN) INSN
 #endif
 
-#ifndef FUNC_BEGIN_PROLOG_LABEL
-#define FUNC_BEGIN_PROLOG_LABEL        "LFBP"
-#endif
-
 static inline rtx force_mode PARAMS ((enum machine_mode, rtx));
 static void pa_combine_instructions PARAMS ((rtx));
 static int pa_can_combine_p PARAMS ((rtx, rtx, rtx, int, rtx, rtx, rtx));
@@ -112,11 +108,6 @@ const char *pa_arch_string;
    registers which were saved by the current function's prologue.  */
 static int gr_saved, fr_saved;
 
-/* The number of the current function for which profile information
-   is to be collected.  These numbers are used to create unique label
-   id's for labels emitted at the beginning of profiled functions.  */
-static unsigned int current_function_number = 0;
-
 static rtx find_addr_reg PARAMS ((rtx));
 
 /* Keep track of the number of bytes we have output in the CODE subspaces
@@ -3071,16 +3062,6 @@ pa_output_function_prologue (file, size)
 
   fputs ("\n\t.ENTRY\n", file);
 
-  /* When profiling, we need a local label at the beginning of the
-     prologue because GAS can't handle the difference of a global symbol
-     and a local symbol.  */
-  if (current_function_profile)
-    {
-      ASM_OUTPUT_INTERNAL_LABEL (file, FUNC_BEGIN_PROLOG_LABEL,
-				 current_function_number);
-      current_function_number++;
-    }
-
   /* If we're using GAS and not using the portable runtime model, then
      we don't need to accumulate the total number of code bytes.  */
   if (TARGET_GAS && ! TARGET_PORTABLE_RUNTIME)
@@ -3540,13 +3521,13 @@ hppa_pic_save_rtx ()
 
 void
 hppa_profile_hook (label_no)
-     int label_no ATTRIBUTE_UNUSED;
+     int label_no;
 {
   rtx begin_label_rtx, call_insn;
   char begin_label_name[16];
 
   ASM_GENERATE_INTERNAL_LABEL (begin_label_name, FUNC_BEGIN_PROLOG_LABEL,
-			       current_function_number);
+			       label_no);
   begin_label_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (begin_label_name));
 
   if (TARGET_64BIT)
diff -urpN -xCVS -x'*~' -xTAGS gcc-31.orig/gcc/config/pa/pa.h gcc-31/gcc/config/pa/pa.h
--- gcc-31.orig/gcc/config/pa/pa.h	2002-04-08 10:13:04.000000000 +0930
+++ gcc-31/gcc/config/pa/pa.h	2002-04-23 13:25:43.000000000 +0930
@@ -938,9 +938,16 @@ extern enum cmp_type hppa_branch_type;
 }
 
 /* On HPPA, we emit profiling code as rtl via PROFILE_HOOK rather than
-   as assembly via FUNCTION_PROFILER.  */
+   as assembly via FUNCTION_PROFILER.  Just output a local label.
+   We can't use the function label because the GAS SOM target can't
+   handle the difference of a global symbol and a local symbol.  */
 
-#define FUNCTION_PROFILER(FILE, LABEL) /* nothing */
+#ifndef FUNC_BEGIN_PROLOG_LABEL
+#define FUNC_BEGIN_PROLOG_LABEL        "LFBP"
+#endif
+
+#define FUNCTION_PROFILER(FILE, LABEL) \
+  ASM_OUTPUT_INTERNAL_LABEL (FILE, FUNC_BEGIN_PROLOG_LABEL, LABEL)
 
 #define PROFILE_HOOK(label_no) hppa_profile_hook (label_no)
 void hppa_profile_hook PARAMS ((int label_no));



More information about the Gcc-patches mailing list