Issue 5177609: remove Monitor(Enter|Exit)Helper

Add necessary indirection for synchronized native methods that
lock/unlock the object/class using the regular JNI MonitorEnter/Exit
functions.

Change-Id: I00cda7284fcfa09e1218ddbfb1e24ea4aaa94ac3
diff --git a/src/jni_compiler.cc b/src/jni_compiler.cc
index dd7d5e5..f3d13c8 100644
--- a/src/jni_compiler.cc
+++ b/src/jni_compiler.cc
@@ -25,6 +25,9 @@
   JniCallingConvention jni_conv(native_method);
   ManagedRuntimeCallingConvention mr_conv(native_method);
   const bool is_static = native_method->IsStatic();
+  static Offset functions(OFFSETOF_MEMBER(JNIEnvExt, fns));
+  static Offset monitor_enter(OFFSETOF_MEMBER(JNINativeInterface, MonitorEnter));
+  static Offset monitor_exit(OFFSETOF_MEMBER(JNINativeInterface, MonitorExit));
 
   // 1. Build the frame
   const size_t frame_size(jni_conv.FrameSize());
@@ -136,9 +139,10 @@
       FrameOffset out_off = jni_conv.CurrentParamStackOffset();
       jni_asm->StoreRawPtr(out_off, jni_env_register);
     }
-    // Call JNIEnvExt::MonitorEnterHelper(JNIEnv*, object)
-    static Offset monitor_enter(OFFSETOF_MEMBER(JNIEnvExt, MonitorEnterHelper));
-    jni_asm->Call(jni_env_register, monitor_enter,
+    // Call JNIEnv->MonitorEnter(object)
+    ManagedRegister jni_fns_register = jni_conv.InterproceduralScratchRegister();
+    jni_asm->LoadRawPtr(jni_fns_register, jni_env_register, functions);
+    jni_asm->Call(jni_fns_register, monitor_enter,
                   jni_conv.InterproceduralScratchRegister());
     jni_asm->FillFromSpillArea(spill_regs, out_arg_size);
     jni_asm->ExceptionPoll(jni_conv.InterproceduralScratchRegister());
@@ -238,9 +242,10 @@
       FrameOffset out_off = jni_conv.CurrentParamStackOffset();
       jni_asm->StoreRawPtr(out_off, jni_env_register);
     }
-    // Call JNIEnvExt::MonitorExitHelper(JNIEnv*, object)
-    static Offset monitor_exit(OFFSETOF_MEMBER(JNIEnvExt, MonitorExitHelper));
-    jni_asm->Call(jni_env_register, monitor_exit,
+    // Call JNIEnv->MonitorExit(object)
+    ManagedRegister jni_fns_register = jni_conv.InterproceduralScratchRegister();
+    jni_asm->LoadRawPtr(jni_fns_register, jni_env_register, functions);
+    jni_asm->Call(jni_fns_register, monitor_exit,
                   jni_conv.InterproceduralScratchRegister());
     // Reload return value
     jni_asm->Load(jni_conv.ReturnRegister(), return_save_location,