From 0f00eb3e59168f93e30b5ae5ea70f3b688d39a45 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Mon, 29 May 2017 18:41:29 +0200 Subject: [PATCH 1/1] [interp] implement RELOC_LONG_BRANCH. fixes test/imt_big_iface_test.exe --- mono/mini/interp/transform.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/mono/mini/interp/transform.c b/mono/mini/interp/transform.c index a309a4a9fab..03e848a42db 100644 --- a/mono/mini/interp/transform.c +++ b/mono/mini/interp/transform.c @@ -201,15 +201,17 @@ handle_branch (TransformData *td, int short_op, int long_op, int offset) shorten_branch = 1; } } else { - offset = 0xffff; if (td->header->code_size <= 25000) /* FIX to be precise somehow? */ shorten_branch = 1; Reloc *reloc = mono_mempool_alloc0 (td->mempool, sizeof (Reloc)); - if (shorten_branch) + if (shorten_branch) { + offset = 0xffff; reloc->type = RELOC_SHORT_BRANCH; - else + } else { + offset = 0xdeadbeef; reloc->type = RELOC_LONG_BRANCH; + } reloc->offset = td->new_ip - td->new_code; reloc->target = target; g_ptr_array_add (td->relocs, reloc); @@ -3796,9 +3798,14 @@ generate (MonoMethod *method, RuntimeMethod *rtm, unsigned char *is_bb_start, Mo g_assert (td.new_code [reloc->offset + 1] == 0xffff); td.new_code [reloc->offset + 1] = offset; break; - case RELOC_LONG_BRANCH: - g_assert_not_reached (); + case RELOC_LONG_BRANCH: { + guint16 *v = (guint16 *) &offset; + g_assert (td.new_code [reloc->offset + 1] == 0xbeef); + g_assert (td.new_code [reloc->offset + 2] == 0xdead); + td.new_code [reloc->offset + 1] = *(guint16 *) v; + td.new_code [reloc->offset + 2] = *(guint16 *) (v + 1); break; + } case RELOC_SWITCH: { guint16 *v = (guint16*)&offset; td.new_code [reloc->offset] = *(guint16*)v; -- 2.25.1