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