From 64a1a422dba4b0c09ad38310e32a223f2e16ed9d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 17 Oct 2011 09:59:52 +0000 Subject: Add line map statistics to -fmem-report output This patch adds statistics about line maps' memory consumption and macro expansion to the output of -fmem-report. It has been useful in trying to reduce the memory consumption of the macro maps support. Co-Authored-By: Dodji Seketeli From-SVN: r180085 --- gcc/ChangeLog | 11 +++++++ gcc/input.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gcc/input.h | 2 ++ gcc/toplev.c | 1 + 4 files changed, 110 insertions(+) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9021c97..81caf54 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,17 @@ 2011-10-15 Tom Tromey Dodji Seketeli + * input.c (ONE_K, ONE_M, SCALE, STAT_LABEL, FORMAT_AMOUNT): New + macros. + (num_expanded_macros_counter, num_macro_tokens_counter): Declare + new counters. + (dump_line_table_statistics): Define new function. + * input.h (dump_line_table_statistics): Declare new function. + * toplev.c (dump_memory_report): Call dump_line_table_statistics. + +2011-10-15 Tom Tromey + Dodji Seketeli + * doc/cppopts.texi: Document -fdebug-cpp. * doc/invoke.texi: Add -fdebug-cpp to the list of preprocessor options. diff --git a/gcc/input.c b/gcc/input.c index 89af274..41842b7 100644 --- a/gcc/input.c +++ b/gcc/input.c @@ -46,3 +46,99 @@ expand_location (source_location loc) LRK_SPELLING_LOCATION); return xloc; } + +#define ONE_K 1024 +#define ONE_M (ONE_K * ONE_K) + +/* Display a number as an integer multiple of either: + - 1024, if said integer is >= to 10 K (in base 2) + - 1024 * 1024, if said integer is >= 10 M in (base 2) + */ +#define SCALE(x) ((unsigned long) ((x) < 10 * ONE_K \ + ? (x) \ + : ((x) < 10 * ONE_M \ + ? (x) / ONE_K \ + : (x) / ONE_M))) + +/* For a given integer, display either: + - the character 'k', if the number is higher than 10 K (in base 2) + but strictly lower than 10 M (in base 2) + - the character 'M' if the number is higher than 10 M (in base2) + - the charcter ' ' if the number is strictly lower than 10 K */ +#define STAT_LABEL(x) ((x) < 10 * ONE_K ? ' ' : ((x) < 10 * ONE_M ? 'k' : 'M')) + +/* Display an integer amount as multiple of 1K or 1M (in base 2). + Display the correct unit (either k, M, or ' ') after the amout, as + well. */ +#define FORMAT_AMOUNT(size) SCALE (size), STAT_LABEL (size) + +/* Dump statistics to stderr about the memory usage of the line_table + set of line maps. This also displays some statistics about macro + expansion. */ + +void +dump_line_table_statistics (void) +{ + struct linemap_stats s; + size_t total_used_map_size, + macro_maps_size, + total_allocated_map_size; + + memset (&s, 0, sizeof (s)); + + linemap_get_statistics (line_table, &s); + + macro_maps_size = s.macro_maps_used_size + + s.macro_maps_locations_size; + + total_allocated_map_size = s.ordinary_maps_allocated_size + + s.macro_maps_allocated_size + + s.macro_maps_locations_size; + + total_used_map_size = s.ordinary_maps_used_size + + s.macro_maps_used_size + + s.macro_maps_locations_size; + + fprintf (stderr, "Number of expanded macros: %5lu\n", + s.num_expanded_macros); + if (s.num_expanded_macros != 0) + fprintf (stderr, "Average number of tokens per macro expansion: %5lu\n", + s.num_macro_tokens / s.num_expanded_macros); + fprintf (stderr, + "\nLine Table allocations during the " + "compilation process\n"); + fprintf (stderr, "Number of ordinary maps used: %5lu%c\n", + SCALE (s.num_ordinary_maps_used), + STAT_LABEL (s.num_ordinary_maps_used)); + fprintf (stderr, "Ordinary map used size: %5lu%c\n", + SCALE (s.ordinary_maps_used_size), + STAT_LABEL (s.ordinary_maps_used_size)); + fprintf (stderr, "Number of ordinary maps allocated: %5lu%c\n", + SCALE (s.num_ordinary_maps_allocated), + STAT_LABEL (s.num_ordinary_maps_allocated)); + fprintf (stderr, "Ordinary maps allocated size: %5lu%c\n", + SCALE (s.ordinary_maps_allocated_size), + STAT_LABEL (s.ordinary_maps_allocated_size)); + fprintf (stderr, "Number of macro maps used: %5lu%c\n", + SCALE (s.num_macro_maps_used), + STAT_LABEL (s.num_macro_maps_used)); + fprintf (stderr, "Macro maps used size: %5lu%c\n", + SCALE (s.macro_maps_used_size), + STAT_LABEL (s.macro_maps_used_size)); + fprintf (stderr, "Macro maps locations size: %5lu%c\n", + SCALE (s.macro_maps_locations_size), + STAT_LABEL (s.macro_maps_locations_size)); + fprintf (stderr, "Macro maps size: %5lu%c\n", + SCALE (macro_maps_size), + STAT_LABEL (macro_maps_size)); + fprintf (stderr, "Duplicated maps locations size: %5lu%c\n", + SCALE (s.duplicated_macro_maps_locations_size), + STAT_LABEL (s.duplicated_macro_maps_locations_size)); + fprintf (stderr, "Total allocated maps size: %5lu%c\n", + SCALE (total_allocated_map_size), + STAT_LABEL (total_allocated_map_size)); + fprintf (stderr, "Total used maps size: %5lu%c\n", + SCALE (total_used_map_size), + STAT_LABEL (total_used_map_size)); + fprintf (stderr, "\n"); +} diff --git a/gcc/input.h b/gcc/input.h index 9fc55f3..f2f3513 100644 --- a/gcc/input.h +++ b/gcc/input.h @@ -55,4 +55,6 @@ extern location_t input_location; ((linemap_location_in_system_header_p (line_table, LOC))) #define in_system_header (in_system_header_at (input_location)) +void dump_line_table_statistics (void); + #endif diff --git a/gcc/toplev.c b/gcc/toplev.c index c43869c..f508196 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1827,6 +1827,7 @@ target_reinit (void) void dump_memory_report (bool final) { + dump_line_table_statistics (); ggc_print_statistics (); stringpool_statistics (); dump_tree_statistics (); -- cgit v1.1