From e5207f1a6528877713109dc59b8db6c62a6eca28 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Fri, 11 Oct 2019 13:53:40 +0200 Subject: [PATCH] ggc-page.c (release_pages): Output statistics when !quiet_flag. * ggc-page.c (release_pages): Output statistics when !quiet_flag. (ggc_collect): Dump later to not interfere with release_page dump. (ggc_trim): New function. * ggc-none.c (ggc_trim): New. * ggc.h (ggc_trim): Declare. * lto.c (lto_wpa_write_files): Call ggc_trim. From-SVN: r276878 --- gcc/ChangeLog | 8 ++++++++ gcc/ggc-none.c | 5 +++++ gcc/ggc-page.c | 45 +++++++++++++++++++++++++++++++++++++++------ gcc/ggc.h | 3 +++ gcc/lto/ChangeLog | 4 ++++ gcc/lto/lto.c | 1 + 6 files changed, 60 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e250c9d55d0..a73fe2074ed 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2019-10-11 Jan Hubicka + + * ggc-page.c (release_pages): Output statistics when !quiet_flag. + (ggc_collect): Dump later to not interfere with release_page dump. + (ggc_trim): New function. + * ggc-none.c (ggc_trim): New. + * ggc.h (ggc_trim): Declare. + 2019-10-11 Richard Biener PR tree-optimization/92066 diff --git a/gcc/ggc-none.c b/gcc/ggc-none.c index 6edec27868c..737429f9e49 100644 --- a/gcc/ggc-none.c +++ b/gcc/ggc-none.c @@ -72,3 +72,8 @@ void ggc_grow (void) { } + +void +ggc_trim (void) +{ +} diff --git a/gcc/ggc-page.c b/gcc/ggc-page.c index 220f20c5cfe..4560206ac2e 100644 --- a/gcc/ggc-page.c +++ b/gcc/ggc-page.c @@ -529,7 +529,6 @@ static void clear_page_group_in_use (page_group *, char *); #endif static struct page_entry * alloc_page (unsigned); static void free_page (struct page_entry *); -static void release_pages (void); static void clear_marks (void); static void sweep_pages (void); static void ggc_recalculate_in_use_p (page_entry *); @@ -1016,6 +1015,8 @@ free_page (page_entry *entry) static void release_pages (void) { + size_t n1 = 0; + size_t n2 = 0; #ifdef USING_MADVISE page_entry *p, *start_p; char *start; @@ -1061,6 +1062,7 @@ release_pages (void) else G.free_pages = p; G.bytes_mapped -= mapped_len; + n1 += len; continue; } prev = newprev; @@ -1092,6 +1094,7 @@ release_pages (void) /* Don't count those pages as mapped to not touch the garbage collector unnecessarily. */ G.bytes_mapped -= len; + n2 += len; while (start_p != p) { start_p->discarded = true; @@ -1124,6 +1127,7 @@ release_pages (void) } munmap (start, len); + n1 += len; G.bytes_mapped -= len; } @@ -1152,10 +1156,20 @@ release_pages (void) *gp = g->next; G.bytes_mapped -= g->alloc_size; free (g->allocation); + n1 += g->alloc_size; } else gp = &g->next; #endif + if (!quiet_flag && (n1 || n2)) + { + fprintf (stderr, " {GC"); + if (n1) + fprintf (stderr, " released %luk", (unsigned long)(n1 / 1024)); + if (n2) + fprintf (stderr, " madv_dontneed %luk", (unsigned long)(n2 / 1024)); + fprintf (stderr, "}"); + } } /* This table provides a fast way to determine ceil(log_2(size)) for @@ -2178,19 +2192,22 @@ ggc_collect (void) return; timevar_push (TV_GC); - if (!quiet_flag) - fprintf (stderr, " {GC %luk -> ", (unsigned long) G.allocated / 1024); if (GGC_DEBUG_LEVEL >= 2) fprintf (G.debug_file, "BEGIN COLLECTING\n"); /* Zero the total allocated bytes. This will be recalculated in the sweep phase. */ + size_t allocated = G.allocated; G.allocated = 0; /* Release the pages we freed the last time we collected, but didn't reuse in the interim. */ release_pages (); + /* Output this later so we do not interfere with release_pages. */ + if (!quiet_flag) + fprintf (stderr, " {GC %luk -> ", (unsigned long) allocated / 1024); + /* Indicate that we've seen collections at this context depth. */ G.context_depth_collections = ((unsigned long)1 << (G.context_depth + 1)) - 1; @@ -2221,9 +2238,25 @@ ggc_collect (void) fprintf (G.debug_file, "END COLLECTING\n"); } -/* Assume that all GGC memory is reachable and grow the limits for next collection. - With checking, trigger GGC so -Q compilation outputs how much of memory really is - reachable. */ +/* Return free pages to the system. */ + +void +ggc_trim () +{ + timevar_push (TV_GC); + G.allocated = 0; + sweep_pages (); + release_pages (); + if (!quiet_flag) + fprintf (stderr, " {GC trimmed to %luk, %luk mapped}", + (unsigned long) G.allocated / 1024, + (unsigned long) G.bytes_mapped / 1024); + timevar_pop (TV_GC); +} + +/* Assume that all GGC memory is reachable and grow the limits for next + collection. With checking, trigger GGC so -Q compilation outputs how much + of memory really is reachable. */ void ggc_grow (void) diff --git a/gcc/ggc.h b/gcc/ggc.h index 60273f2e57d..31606dc843f 100644 --- a/gcc/ggc.h +++ b/gcc/ggc.h @@ -243,6 +243,9 @@ extern const char *ggc_alloc_string (const char *contents, int length function is called, not during allocations. */ extern void ggc_collect (void); +/* Return unused memory pages to the system. */ +extern void ggc_trim (void); + /* Assume that all GGC memory is reachable and grow the limits for next collection. */ extern void ggc_grow (void); diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 5fd02dff7cd..5ad79e821ad 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,7 @@ +2019-10-11 Jan Hubicka + + * lto.c (lto_wpa_write_files): Call ggc_trim. + 2019-10-11 Jan Hubicka * lto.c (lto_wpa_write_files): Prepare all bodies for streaming. diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c index f7452c232fe..5aa143859d5 100644 --- a/gcc/lto/lto.c +++ b/gcc/lto/lto.c @@ -311,6 +311,7 @@ lto_wpa_write_files (void) if (gimple_has_body_p (node->decl)) lto_prepare_function_for_streaming (node); + ggc_trim (); /* Generate a prefix for the LTRANS unit files. */ blen = strlen (ltrans_output_list); temp_filename = (char *) xmalloc (blen + sizeof ("2147483648.o")); -- 2.30.2