#include "system.h"
#include "coretypes.h"
#include "tm.h"
+#include "diagnostic-core.h"
#include "toplev.h"
#include "rtl.h"
#include "tree.h"
#include "function.h"
#include "expr.h"
#include "optabs.h"
+#include "libfuncs.h"
#include "hard-reg-set.h"
#include "insn-config.h"
#include "ggc.h"
#include "output.h"
static rtx break_out_memory_refs (rtx);
-static void emit_stack_probe (rtx);
/* Truncate and perhaps sign-extend C as appropriate for MODE. */
static GTY(()) rtx stack_check_libfunc;
void
-set_stack_check_libfunc (rtx libfunc)
+set_stack_check_libfunc (const char *libfunc_name)
{
- stack_check_libfunc = libfunc;
+ gcc_assert (stack_check_libfunc == NULL_RTX);
+ stack_check_libfunc = gen_rtx_SYMBOL_REF (Pmode, libfunc_name);
}
\f
/* Emit one stack probe at ADDRESS, an address within the stack. */
-static void
+void
emit_stack_probe (rtx address)
{
rtx memref = gen_rtx_MEM (word_mode, address);
emit_insn (gen_probe_stack (memref));
else
#endif
- if (STACK_CHECK_PROBE_LOAD)
- emit_move_insn (gen_reg_rtx (word_mode), memref);
- else
emit_move_insn (memref, const0_rtx);
}
HOST_WIDE_INT isize = INTVAL (size), i;
bool first_probe = true;
- /* Adjust SP and probe to PROBE_INTERVAL + N * PROBE_INTERVAL for
+ /* Adjust SP and probe at PROBE_INTERVAL + N * PROBE_INTERVAL for
values of N from 1 until it exceeds SIZE. If only one probe is
needed, this will not generate any code. Then adjust and probe
to PROBE_INTERVAL + SIZE. */
/* Step 3: the loop
- while (SP != LAST_ADDR)
- {
- SP = SP + PROBE_INTERVAL
- probe at SP
- }
+ while (SP != LAST_ADDR)
+ {
+ SP = SP + PROBE_INTERVAL
+ probe at SP
+ }
- adjusts SP and probes to PROBE_INTERVAL + N * PROBE_INTERVAL for
+ adjusts SP and probes at PROBE_INTERVAL + N * PROBE_INTERVAL for
values of N from 1 until it is equal to ROUNDED_SIZE. */
emit_label (loop_lab);
emit_label (end_lab);
- /* Step 4: adjust SP and probe to PROBE_INTERVAL + SIZE if we cannot
+ /* Step 4: adjust SP and probe at PROBE_INTERVAL + SIZE if we cannot
assert at compile-time that SIZE is equal to ROUNDED_SIZE. */
/* TEMP = SIZE - ROUNDED_SIZE. */