* 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
+Tue Sep 7 17:15:21 1999 Mark Mitchell <mark@codesourcery.com>
+
+ 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 <ghazi@caip.rutgers.edu>
* cpperror.c (cpp_file_line_for_message): Constify a char*.
#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. */
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. */
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
/* 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);
+}
#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));
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. */
warning ("-g option disabled.");
write_symbols = NO_DEBUG;
}
+
+ /* Register global variables with the garbage collector. */
+ pa_add_gc_roots ();
}
&& 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);
+}
#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.
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 ();
{
error ("profiling does not support code models other than medlow");
}
+
+ /* Register global variables with the garbage collector. */
+ sparc_add_gc_roots ();
}
\f
/* Miscellaneous utilities. */
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);
+}