diff options
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 10 | ||||
-rw-r--r-- | gcc/ggc-common.c | 45 |
3 files changed, 60 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3b0e143b16c..b8c4d6fab51 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2003-02-23 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * doc/invoke.texi (ggc-min-expand, ggc-min-heapsize): Document + new default behavior. + * ggc-common.c: Include sys/resource.h. + (ggc_rlimit_bound): New function. + (ggc_min_expand_heuristic, ggc_min_heapsize_heuristic): Update + defaults to account for rlimits. + 2003-02-22 Richard Henderson <rth@redhat.com> * i386.c, i386.h (TUNEMASK): Rename from CPUMASK. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 2ae2ac39a48..ff9a9a7642e 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -4474,8 +4474,10 @@ Tuning this may improve compilation speed; it has no effect on code generation. The default is 30% + 70% * (RAM/1GB) with an upper bound of 100% when -RAM >= 1GB. If GCC is not able to calculate RAM on a particular -platform, the lower bound of 30% is used. Setting this parameter and +RAM >= 1GB. If @code{getrlimit} is available, the notion of "RAM" is +the smallest of actual RAM, RLIMIT_RSS, RLIMIT_DATA and RLIMIT_AS. If +GCC is not able to calculate RAM on a particular platform, the lower +bound of 30% is used. Setting this parameter and @option{ggc-min-heapsize} to zero causes a full collection to occur at every opportunity. This is extremely slow, but can be useful for debugging. @@ -4489,7 +4491,9 @@ tuning this may improve compilation speed, and has no effect on code generation. The default is RAM/8, with a lower bound of 4096 (four megabytes) and an -upper bound of 131072 (128 megabytes). If GCC is not able to calculate +upper bound of 131072 (128 megabytes). If @code{getrlimit} is +available, the notion of "RAM" is the smallest of actual RAM, +RLIMIT_RSS, RLIMIT_DATA and RLIMIT_AS. If GCC is not able to calculate RAM on a particular platform, the lower bound is used. Setting this parameter very large effectively disables garbage collection. Setting this parameter and @option{ggc-min-expand} to zero causes a full diff --git a/gcc/ggc-common.c b/gcc/ggc-common.c index 8a8f7ecd313..5b0e330ecfd 100644 --- a/gcc/ggc-common.c +++ b/gcc/ggc-common.c @@ -29,6 +29,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "toplev.h" #include "params.h" +#ifdef HAVE_SYS_RESOURCE_H +# include <sys/resource.h> +#endif + #ifdef HAVE_MMAP_FILE # include <sys/mman.h> #endif @@ -54,6 +58,7 @@ static int compare_ptr_data PARAMS ((const void *, const void *)); static void relocate_ptrs PARAMS ((void *, void *)); static void write_pch_globals PARAMS ((const struct ggc_root_tab * const *tab, struct traversal_state *state)); +static double ggc_rlimit_bound PARAMS ((double)); /* Maintain global roots that are preserved during GC. */ @@ -626,11 +631,44 @@ gt_pch_restore (f) gt_pch_restore_stringpool (); } +/* Modify the bound based on rlimits. Keep the smallest number found. */ +static double +ggc_rlimit_bound (limit) + double limit; +{ +#if defined(HAVE_GETRLIMIT) + struct rlimit rlim; +# ifdef RLIMIT_RSS + if (getrlimit (RLIMIT_RSS, &rlim) == 0 + && rlim.rlim_cur != RLIM_INFINITY + && rlim.rlim_cur < limit) + limit = rlim.rlim_cur; +# endif +# ifdef RLIMIT_DATA + if (getrlimit (RLIMIT_DATA, &rlim) == 0 + && rlim.rlim_cur != RLIM_INFINITY + && rlim.rlim_cur < limit) + limit = rlim.rlim_cur; +# endif +# ifdef RLIMIT_AS + if (getrlimit (RLIMIT_AS, &rlim) == 0 + && rlim.rlim_cur != RLIM_INFINITY + && rlim.rlim_cur < limit) + limit = rlim.rlim_cur; +# endif +#endif /* HAVE_GETRLIMIT */ + + return limit; +} + /* Heuristic to set a default for GGC_MIN_EXPAND. */ int ggc_min_expand_heuristic() { double min_expand = physmem_total(); + + /* Adjust for rlimits. */ + min_expand = ggc_rlimit_bound (min_expand); /* The heuristic is a percentage equal to 30% + 70%*(RAM/1GB), yielding a lower bound of 30% and an upper bound of 100% (when RAM >= 1GB). */ @@ -646,7 +684,12 @@ ggc_min_expand_heuristic() int ggc_min_heapsize_heuristic() { - double min_heap_kbytes = physmem_total() / 1024; + double min_heap_kbytes = physmem_total(); + + /* Adjust for rlimits. */ + min_heap_kbytes = ggc_rlimit_bound (min_heap_kbytes); + + min_heap_kbytes /= 1024; /* convert to Kbytes. */ /* The heuristic is RAM/8, with a lower bound of 4M and an upper bound of 128M (when RAM >= 1GB). */ |