From e2419dee784e69dea32efe7d1509d3098eb3e100 Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Thu, 15 Feb 2018 20:27:32 +0200 Subject: [PATCH] [interp] Add missing exception checkpoints (#6917) On interp we can't async abort since we cannot unwind from an ip in the interp, so the interpreter does explicit checks as part of branch instructions. Note this can lead to increased stack usage when compiling with -O0. --- mono/mini/interp/interp.c | 9 +++++---- mono/mini/interp/mintops.def | 2 ++ mono/mini/interp/transform.c | 3 +++ mono/tests/Makefile.am | 1 - 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/mono/mini/interp/interp.c b/mono/mini/interp/interp.c index db871f233e7..c9081806a50 100644 --- a/mono/mini/interp/interp.c +++ b/mono/mini/interp/interp.c @@ -2794,13 +2794,9 @@ interp_exec_method_full (InterpFrame *frame, ThreadContext *context, guint16 *st g_warning ("ret.vt: more values on stack: %d", sp-frame->stack); goto exit_frame; MINT_IN_CASE(MINT_BR_S) - /* Checkpoint to be able to handle aborts */ - EXCEPTION_CHECKPOINT; ip += (short) *(ip + 1); MINT_IN_BREAK; MINT_IN_CASE(MINT_BR) - /* Checkpoint to be able to handle aborts */ - EXCEPTION_CHECKPOINT; ip += (gint32) READ32(ip + 1); MINT_IN_BREAK; #define ZEROP_S(datamem, op) \ @@ -3650,6 +3646,11 @@ array_constructed: THROW_EX ((MonoException *)sp->data.p, ip); MINT_IN_BREAK; + MINT_IN_CASE(MINT_CHECKPOINT) + /* Do synchronous checking of abort requests */ + EXCEPTION_CHECKPOINT; + ++ip; + MINT_IN_BREAK; MINT_IN_CASE(MINT_LDFLDA_UNSAFE) o = sp [-1].data.p; sp[-1].data.p = (char *)o + * (guint16 *)(ip + 1); diff --git a/mono/mini/interp/mintops.def b/mono/mini/interp/mintops.def index 47dc74d82e8..a2348ce687b 100644 --- a/mono/mini/interp/mintops.def +++ b/mono/mini/interp/mintops.def @@ -179,6 +179,8 @@ OPDEF(MINT_THROW, "throw", 1, MintOpNoArgs) OPDEF(MINT_RETHROW, "rethrow", 2, MintOpUShortInt) OPDEF(MINT_ENDFINALLY, "endfinally", 2, MintOpNoArgs) +OPDEF(MINT_CHECKPOINT, "checkpoint", 1, MintOpNoArgs) + OPDEF(MINT_BRFALSE_I4, "brfalse.i4", 3, MintOpBranch) OPDEF(MINT_BRFALSE_I8, "brfalse.i8", 3, MintOpBranch) OPDEF(MINT_BRFALSE_R8, "brfalse.r8", 3, MintOpBranch) diff --git a/mono/mini/interp/transform.c b/mono/mini/interp/transform.c index 5fb36c8080d..7f5602c00ec 100644 --- a/mono/mini/interp/transform.c +++ b/mono/mini/interp/transform.c @@ -313,6 +313,9 @@ handle_branch (TransformData *td, int short_op, int long_op, int offset) int target = td->ip + offset - td->il_code; if (target < 0 || target >= td->code_size) g_assert_not_reached (); + /* Add exception checkpoint for backward branches */ + if (offset < 0) + ADD_CODE(td, MINT_CHECKPOINT); if (offset > 0 && td->stack_height [target] < 0) { td->stack_height [target] = td->sp - td->stack; if (td->stack_height [target] > 0) diff --git a/mono/tests/Makefile.am b/mono/tests/Makefile.am index 43a64ab990f..bea300e1990 100755 --- a/mono/tests/Makefile.am +++ b/mono/tests/Makefile.am @@ -1021,7 +1021,6 @@ INTERP_DISABLED_TESTS = \ $(if $(CI),$(CI_DISABLED_TESTS)) \ $(if $(CI_PR),$(CI_PR_DISABLED_TESTS)) \ appdomain-unload.exe \ - async-exc-compilation.exe \ async-with-cb-throws.exe \ block_guard_restore_aligment_on_exit.exe \ bug-335131.2.exe \ -- 2.11.4.GIT