+2000-10-13 Richard Earnshaw <rearnsha@arm.com>
+
+ * arm.c: Include obstack.h
+ (minipool_obstack, minipool_startobj): Define.
+ (arm_add_gc_roots): Initialize them.
+ (create_fix_barrier): Use our new obstack.
+ (push_minipool_barrier, push_minipool_fix): Likewise.
+ (arm_reorg): Release obstack memory.
+
2000-10-13 Jakub Jelinek <jakub@redhat.com>
* config/sparc/sparc.md (nonlocal_goto_receiver): Remove.
#include "system.h"
#include "rtl.h"
#include "tree.h"
+#include "obstack.h"
#include "regs.h"
#include "hard-reg-set.h"
#include "real.h"
#undef Mmode
#undef Ulong
+/* Obstack for minipool constant handling. */
+static struct obstack minipool_obstack;
+static char *minipool_startobj;
+
+#define obstack_chunk_alloc xmalloc
+#define obstack_chunk_free free
+
/* The maximum number of insns skipped which will be conditionalised if
possible. */
static int max_insns_skipped = 5;
ggc_add_rtx_root (&arm_compare_op0, 1);
ggc_add_rtx_root (&arm_compare_op1, 1);
ggc_add_rtx_root (&arm_target_insn, 1); /* Not sure this is really a root */
- /* XXX: What about the minipool tables? */
+
+ gcc_obstack_init(&minipool_obstack);
+ minipool_startobj = (char *) obstack_alloc (&minipool_obstack, 0);
}
\f
/* Return 1 if it is possible to return using a single instruction. */
emit_label_after (label, barrier);
/* Create a minipool barrier entry for the new barrier. */
- new_fix = (Mfix *) oballoc (sizeof (* new_fix));
+ new_fix = (Mfix *) obstack_alloc (&minipool_obstack, sizeof (* new_fix));
new_fix->insn = barrier;
new_fix->address = selected_address;
new_fix->next = fix->next;
rtx insn;
HOST_WIDE_INT address;
{
- Mfix * fix = (Mfix *) oballoc (sizeof (* fix));
+ Mfix * fix = (Mfix *) obstack_alloc (&minipool_obstack, sizeof (* fix));
fix->insn = insn;
fix->address = address;
enum machine_mode mode;
rtx value;
{
- Mfix * fix = (Mfix *) oballoc (sizeof (* fix));
+ Mfix * fix = (Mfix *) obstack_alloc (&minipool_obstack, sizeof (* fix));
#ifdef AOF_ASSEMBLER
/* PIC symbol refereneces need to be converted into offsets into the
directly. This can happen if the RTL gets split during final
instruction generation. */
after_arm_reorg = 1;
+
+ /* Free the minipool memory. */
+ obstack_free (&minipool_obstack, minipool_startobj);
}
\f
/* Routines to output assembly language. */