From d07d525a85f68646d68a5a2bc6c885894674ebc3 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 8 Sep 1999 00:21:45 +0000 Subject: [PATCH] Add some machine-dependent GC roots. * sparc.c: Include ggc.h. (sparc_add_gc_roots): New function. (mark_ultrasparc_pipeline_state): Likewise. (override_options): Call sparc_add_gc_roots. * pa.c: Include ggc.h. (pa_add_gc_roots): New function. (mark_deferred_plabels): Likewise. (override_options): Call pa_add_gc_roots. * mips.c: Include ggc.h. (mips_add_gc_roots): New function. (override_options): Use it. From-SVN: r29176 --- gcc/ChangeLog | 15 +++++++++++++++ gcc/config/mips/mips.c | 20 ++++++++++++++++++++ gcc/config/pa/pa.c | 32 +++++++++++++++++++++++++++++++ gcc/config/sparc/sparc.c | 41 +++++++++++++++++++++++++++++++++++++++- 4 files changed, 107 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5409be57796..f1425e91780 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +Tue Sep 7 17:15:21 1999 Mark Mitchell + + Add some machine-dependent GC roots. + * sparc.c: Include ggc.h. + (sparc_add_gc_roots): New function. + (mark_ultrasparc_pipeline_state): Likewise. + (override_options): Call sparc_add_gc_roots. + * pa.c: Include ggc.h. + (pa_add_gc_roots): New function. + (mark_deferred_plabels): Likewise. + (override_options): Call pa_add_gc_roots. + * mips.c: Include ggc.h. + (mips_add_gc_roots): New function. + (override_options): Use it. + Tue Sep 7 11:39:41 1999 Kaveh R. Ghazi * cpperror.c (cpp_file_line_for_message): Constify a char*. diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index e65e4be7a8d..a192be04657 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -48,6 +48,7 @@ Boston, MA 02111-1307, USA. */ #include "flags.h" #include "reload.h" #include "output.h" +#include "ggc.h" #if defined(USG) || !defined(HAVE_STAB_H) #include "gstab.h" /* If doing DBX on sysV, use our own stab.h. */ @@ -107,6 +108,7 @@ static rtx mips_find_symbol PROTO ((rtx)); static void abort_with_insn PROTO ((rtx, const char *)) ATTRIBUTE_NORETURN; static int symbolic_expression_p PROTO ((rtx)); +static void mips_add_gc_roots PROTO ((void)); /* Global variables for machine-dependent things. */ @@ -4509,6 +4511,9 @@ override_options () if (align_functions == 0) align_functions = 8; } + + /* Register global variables with the garbage collector. */ + mips_add_gc_roots (); } /* On the mips16, we want to allocate $24 (T_REG) before other @@ -8922,3 +8927,18 @@ mips_output_conditional_branch (insn, /* NOTREACHED */ return 0; } + +/* Called to register all of our global variables with the garbage + collector. */ + +static void +mips_add_gc_roots () +{ + ggc_add_rtx_root (&mips_load_reg, 1); + ggc_add_rtx_root (&mips_load_reg2, 1); + ggc_add_rtx_root (&mips_load_reg3, 1); + ggc_add_rtx_root (&mips_load_reg4, 1); + ggc_add_rtx_root (branch_cmp, sizeof (branch_cmp) / sizeof (rtx)); + ggc_add_rtx_root (&embedded_pic_fnaddr_rtx, 1); + ggc_add_rtx_root (&mips16_gp_pseudo_rtx, 1); +} diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 4bb427efe0a..40054cf7281 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -38,6 +38,7 @@ Boston, MA 02111-1307, USA. */ #include "expr.h" #include "obstack.h" #include "toplev.h" +#include "ggc.h" static void restore_unscaled_index_insn_codes PROTO((rtx)); static void record_unscaled_index_insn_codes PROTO((rtx)); @@ -45,6 +46,8 @@ static void pa_combine_instructions PROTO((rtx)); static int pa_can_combine_p PROTO((rtx, rtx, rtx, int, rtx, rtx, rtx)); static int forward_branch_p PROTO((rtx)); static int shadd_constant_p PROTO((int)); +static void pa_add_gc_roots PROTO((void)); +static void mark_deferred_plabels PROTO((void *)); /* Save the operands last given to a compare for use when we generate a scc or bcc insn. */ @@ -176,6 +179,9 @@ override_options () warning ("-g option disabled."); write_symbols = NO_DEBUG; } + + /* Register global variables with the garbage collector. */ + pa_add_gc_roots (); } @@ -6516,3 +6522,29 @@ insn_sets_and_refs_are_delayed (insn) && GET_CODE (PATTERN (insn)) != CLOBBER && get_attr_type (insn) == TYPE_MILLI)); } + +/* Mark ARG (which is really a struct deferred_plabel **) for GC. */ + +static void +mark_deferred_plabels (arg) + void *arg; +{ + struct deferred_plabel *dp = *(struct deferred_plabel **) arg; + int i; + + for (i = 0; i < n_deferred_plabels; ++i) + ggc_mark_rtx (dp[i].internal_label); +} + +/* Called to register all of our global variables with the garbage + collector. */ + +static void +pa_add_gc_roots () +{ + ggc_add_rtx_root (&hppa_compare_op0, 1); + ggc_add_rtx_root (&hppa_compare_op1, 1); + ggc_add_rtx_root (&hp_profile_label_rtx, 1); + ggc_add_root (&deferred_plabels, sizeof (&deferred_plabels), 1, + &mark_deferred_plabels); +} diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 622e04b0774..190a788412d 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -38,6 +38,7 @@ Boston, MA 02111-1307, USA. */ #include "expr.h" #include "recog.h" #include "toplev.h" +#include "ggc.h" /* 1 if the caller has placed an "unimp" insn immediately after the call. This is used in v8 code when calling a function that returns a structure. @@ -119,7 +120,8 @@ static int ultrasparc_adjust_cost PROTO((rtx, rtx, rtx, int)); static void sparc_output_addr_vec PROTO((rtx)); static void sparc_output_addr_diff_vec PROTO((rtx)); static void sparc_output_deferred_case_vectors PROTO((void)); - +static void sparc_add_gc_roots PROTO ((void)); +static void mark_ultrasparc_pipeline_state PROTO ((void *)); #ifdef DWARF2_DEBUGGING_INFO extern char *dwarf2out_cfi_label (); @@ -331,6 +333,9 @@ sparc_override_options () { error ("profiling does not support code models other than medlow"); } + + /* Register global variables with the garbage collector. */ + sparc_add_gc_roots (); } /* Miscellaneous utilities. */ @@ -7908,3 +7913,37 @@ sparc_function_block_profiler_exit(file) else abort (); } + +/* Mark ARG, which is really a struct ultrasparc_pipline_state *, for + GC. */ + +static void +mark_ultrasparc_pipeline_state (arg) + void *arg; +{ + struct ultrasparc_pipeline_state *ups; + size_t i; + + ups = (struct ultrasparc_pipeline_state *) arg; + for (i = 0; i < sizeof (ups->group) / sizeof (rtx); ++i) + ggc_mark_rtx (ups->group[i]); +} + +/* Called to register all of our global variables with the garbage + collector. */ + +static void +sparc_add_gc_roots () +{ + ggc_add_rtx_root (&sparc_compare_op0, 1); + ggc_add_rtx_root (&sparc_compare_op1, 1); + ggc_add_rtx_root (&leaf_label, 1); + ggc_add_rtx_root (&global_offset_table, 1); + ggc_add_rtx_root (&get_pc_symbol, 1); + ggc_add_rtx_root (&sparc_addr_diff_list, 1); + ggc_add_rtx_root (&sparc_addr_list, 1); + ggc_add_root (ultra_pipe_hist, + sizeof (ultra_pipe_hist) / sizeof (ultra_pipe_hist[0]), + sizeof (ultra_pipe_hist[0]), + &mark_ultrasparc_pipeline_state); +}