/* Allocate locals */
offsets = mono_allocate_stack_slots (cfg, cfg->arch.omit_fp ? FALSE: TRUE, &locals_stack_size, &locals_stack_align);
- if (locals_stack_size > MONO_ARCH_MAX_FRAME_SIZE) {
- char *mname = mono_method_full_name (cfg->method, TRUE);
- mono_cfg_set_exception_invalid_program (cfg, g_strdup_printf ("Method %s stack is too big.", mname));
- g_free (mname);
- return;
- }
-
if (locals_stack_align) {
offset += (locals_stack_align - 1);
offset &= ~(locals_stack_align - 1);
#if defined(TARGET_WIN32)
need_touch = TRUE;
#elif defined(MONO_ARCH_SIGSEGV_ON_ALTSTACK)
- if (!tree->flags & MONO_INST_INIT)
+ if (!(tree->flags & MONO_INST_INIT))
need_touch = TRUE;
#endif
amd64_mov_membase_reg (code, spvar->inst_basereg, spvar->inst_offset, AMD64_RSP, sizeof(gpointer));
if ((MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_FINALLY) ||
- MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_FINALLY)) &&
+ MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_FILTER)) &&
cfg->param_area) {
amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP, ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT));
}
/* See mono_emit_stack_alloc */
#if defined(MONO_ARCH_SIGSEGV_ON_ALTSTACK)
guint32 remaining_size = alloc_size;
- /*FIXME handle unbounded code expansion, we should use a loop in case of more than X interactions*/
+
+ /* Use a loop for large sizes */
+ if (remaining_size > 10 * 0x1000) {
+ amd64_mov_reg_imm (code, X86_EAX, remaining_size / 0x1000);
+ guint8 *label = code;
+ amd64_alu_reg_imm (code, X86_SUB, AMD64_RSP, 0x1000);
+ amd64_test_membase_reg (code, AMD64_RSP, 0, AMD64_RSP);
+ amd64_alu_reg_imm (code, X86_SUB, AMD64_RAX, 1);
+ amd64_alu_reg_imm (code, X86_CMP, AMD64_RAX, 0);
+ guint8 *label2 = code;
+ x86_branch8 (code, X86_CC_NE, 0, FALSE);
+ amd64_patch (label2, label);
+ if (cfg->arch.omit_fp) {
+ cfa_offset += (remaining_size / 0x1000) * 0x1000;
+ mono_emit_unwind_op_def_cfa_offset (cfg, code, cfa_offset);
+ }
+
+ remaining_size = remaining_size % 0x1000;
+ }
+
guint32 required_code_size = ((remaining_size / 0x1000) + 1) * 11; /*11 is the max size of amd64_alu_reg_imm + amd64_test_membase_reg*/
guint32 offset = code - cfg->native_code;
if (G_UNLIKELY (required_code_size >= (cfg->code_size - offset))) {