]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commit
gprof: only process line numbers for intersection of vmas and histograms
authorRichard Allen <rsaxvc@gmail.com>
Sat, 8 Mar 2025 08:44:18 +0000 (16:44 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 14 Mar 2025 14:03:52 +0000 (07:03 -0700)
commitc912005af77c71461cdcc91cb23e7a2f6872d5b7
treec2b4e0060718a3193294ed2eb1831bff2dab9bc4
parentebe00173e32ce714bbc8e0fb877dc6eb5033ad6f
gprof: only process line numbers for intersection of vmas and histograms

Some programs like RTOS firmware may have a large number of symbols.
The profile information in the profile data file includes histogram
records, which capture low PC and high PC of program execution.  If all
histogram records come in the profile data file before any call-graph
records and basic-block records, we can look up only the line numbers
within low PC and high PC in histogram records, which reduces processing
time for such a firmware from ~2 minutes to ~2 seconds.

Add symbol table access function, get_symtab, get_symtab_direct and
set_symtab to delay loading the symbol table until its first use.

* aarch64.c (aarch64_find_call): Call get_symtab to get the
symbol table pointer
* alpha.c (alpha_find_call): Likewise.
* basic_blocks.c (bb_read_rec): Likewise.
(bb_write_blocks): Likewise.
(print_exec_counts): Likewise.
(print_annotated_source): Likewise.
* call_graph.c (cg_tally): Likewise.
(cg_write_arcs): Likewise.
* cg_arcs.c (cycle_link): Likewise.
(propagate_flags): Likewise.
(cg_assemble): Likewise.
* cg_print.c (cg_print): Likewise.
(cg_print_index): Likewise.
(cg_print_function_ordering): Likewise.
* corefile.c: Include "gmon_io.h".
(core_create_syms_from): Call get_symtab_direct to get the
symbol table pointer.
(core_create_function_syms): Likewise.
(core_create_line_syms): Likewise.  If all histogram records
come in the profile data file before any call-graph records and
basic-block records, we can look up only the line numbers within
low PC and high PC in histogram records.
* gmon_io.c (gmon_histograms_first): New.
(gmon_out_read): Set gmon_histograms_first to true if all
histogram records come first.
(gmon_out_write): Call get_symtab to get the symbol table
pointer.
* hist.c (scale_and_align_entries): Likewise.
(hist_assign_samples_1): Likewise.
(hist_print): Likewise.
* i386.c (i386_find_call): Likewise.
* mips.c (mips_find_call): Likewise.
* sparc.c (sparc_find_call): Likewise.
* sym_ids.c (sym_id_parse): Likewise.
* vax.c (vax_find_call): Likewise.
* gmon_io.h (gmon_histograms_first): New.
* gprof.c (man): Don't create profile info.
(symtab_init): New.
* gprof.h (symtab_init): New.
* symtab.c (symtab): Changed to static.
(get_symtab_direct): New.
(get_symtab): Likewise.
(set_symtab): Likewise.
* symtab.h (symtab): Removed.
(get_symtab_direct): New.
(get_symtab): Likewise.
(set_symtab): Likewise.

Signed-off-by: Richard Allen <rsaxvc@gmail.com>
Co-Authored-By: H.J. Lu <hjl.tools@gmail.com>
19 files changed:
gprof/aarch64.c
gprof/alpha.c
gprof/basic_blocks.c
gprof/call_graph.c
gprof/cg_arcs.c
gprof/cg_print.c
gprof/corefile.c
gprof/gmon_io.c
gprof/gmon_io.h
gprof/gprof.c
gprof/gprof.h
gprof/hist.c
gprof/i386.c
gprof/mips.c
gprof/sparc.c
gprof/sym_ids.c
gprof/symtab.c
gprof/symtab.h
gprof/vax.c