Don't use System.Environment.Exit to finish a sdb session on iOS.
[mono.git] / mono / mini / tramp-alpha.c
index 48966289cfcedaa6d58531032c9e6688bd201c3a..cab03d65ec5f8a8af8a17cf9e0edfff7e320d826 100644 (file)
@@ -18,9 +18,6 @@
 /*------------------------------------------------------------------*/
 /*                 D e f i n e s                                    */
 /*------------------------------------------------------------------*/
-#define NOT_IMPLEMENTED(x) \
-        g_error ("FIXME: %s is not yet implemented.", x);
-
 #define ALPHA_DEBUG(x) \
        if (mini_alpha_verbose_level) \
                g_debug ("ALPHA_DEBUG: %s is called.", x);
@@ -184,7 +181,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
       }
     
     // alpha_at points to start of this method !!!
-    alpha_ldq(code, alpha_r0, alpha_at, off);
+    alpha_ldq(code, alpha_pv, alpha_at, off);
     alpha_br(code, alpha_zero, 2);
     
     *code = (unsigned int)(((unsigned long)mono_get_lmf_addr) & 0xFFFFFFFF);
@@ -196,7 +193,7 @@ mono_arch_create_trampoline_code (MonoTrampolineType tramp_type)
      * The call might clobber argument registers, but they are already
      * saved to the stack/global regs.
      */
-    alpha_jsr(code, alpha_ra, alpha_r0, 0);
+    alpha_jsr(code, alpha_ra, alpha_pv, 0);
     
     // Save lmf_addr
     alpha_stq(code, alpha_r0, alpha_sp,
@@ -383,7 +380,7 @@ mono_arch_create_jump_trampoline (MonoMethod *method)
 {
        ALPHA_DEBUG("mono_arch_create_jump_trampoline");
 
-       NOT_IMPLEMENTED("mono_arch_create_jump_trampoline");
+       NOT_IMPLEMENTED;
        
         return 0;
 }
@@ -475,14 +472,12 @@ mono_arch_create_specific_trampoline (gpointer arg1,
   alpha_jmp(code, alpha_zero, alpha_at, 0);
   
   g_assert (((char *)code - (char *)buf) <= TRAMPOLINE_SIZE);
-  mono_domain_lock (domain);
   /*
    * FIXME: Changing the size to code - buf causes strange crashes during
    * mcs bootstrap.
    */
-  real_code = mono_code_manager_reserve (domain->code_mp, TRAMPOLINE_SIZE);
+  real_code = mono_domain_code_reserve (domain, TRAMPOLINE_SIZE);
   size = (char *)code - (char *)buf;
-  mono_domain_unlock (domain);
   
   memcpy (real_code, buf, size);
  
@@ -490,8 +485,6 @@ mono_arch_create_specific_trampoline (gpointer arg1,
        g_debug("mono_arch_create_specific_trampoline: Target: %p, Arg1: %p",
         real_code, arg1);
   
-  mono_jit_stats.method_trampolines++;
-  
   if (code_len)
     *code_len = size;
   
@@ -502,24 +495,31 @@ mono_arch_create_specific_trampoline (gpointer arg1,
 /*========================= End of Function ========================*/
 
 void
-mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
+mono_arch_nullify_class_init_trampoline (guint8 *code, mgreg_t *regs)
 {
   unsigned int *pcode = (unsigned int *)code;
 
   ALPHA_DEBUG("mono_arch_nullify_class_init_trampoline");
 
-}
-
+  // pcode[-2] ldq     t12,n(gp)
+  // pcode[-1] jsr     ra,(t12),0x20003efcb40
+  if ((pcode[-2] & 0xFFFF0000) == 0xa77d0000 &&
+       pcode[-1] == 0x6b5b4000)
+  {
+      // Put "unop" into call inst
+      pcode--;
+      alpha_nop(pcode);
+      alpha_nop(pcode);
+      alpha_nop(pcode);
 
-void
-mono_arch_patch_delegate_trampoline (guint8 *code, guint8 *tramp,
-                                    gssize *regs, guint8 *addr)
-{
-  ALPHA_DEBUG("mono_arch_patch_delegate_trampoline");
+      mono_arch_flush_icache ((code-4), 3*4);
+  }
+  else
+      g_assert_not_reached ();
 }
 
 void
-mono_arch_patch_callsite (guint8 *code, guint8 *addr)
+mono_arch_patch_callsite (guint8 *method_start, guint8 *code, guint8 *addr)
 {
   unsigned long *p = (unsigned int *)(code-12);
   
@@ -566,6 +566,7 @@ mono_arch_patch_callsite (guint8 *code, guint8 *addr)
 
 /*
  * mono_arch_get_unbox_trampoline:
+ * @gsctx: the generic sharing context
  * @m: method pointer
  * @addr: pointer to native code for @m
  *
@@ -574,7 +575,7 @@ mono_arch_patch_callsite (guint8 *code, guint8 *addr)
  * unboxing before calling the method
  */
 gpointer
-mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
+mono_arch_get_unbox_trampoline (MonoGenericSharingContext *gsctx, MonoMethod *m, gpointer addr)
 {
   unsigned int *code, *start_code;
   int this_reg = 16; //R16
@@ -583,13 +584,10 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
 
   ALPHA_DEBUG("mono_arch_get_unbox_trampoline");
 
-  if (!mono_method_signature (m)->ret->byref &&
-      MONO_TYPE_ISSTRUCT (mono_method_signature (m)->ret))
+  if (MONO_TYPE_ISSTRUCT (mono_method_signature (m)->ret))
     this_reg = 17; //R17
 
-  mono_domain_lock (domain);
-  start_code = code = (unsigned int *)mono_code_manager_reserve (domain->code_mp, 32);
-  mono_domain_unlock (domain);
+  start_code = code = (unsigned int *)mono_domain_code_reserve (domain, 32);
 
   // Adjust this by size of MonoObject
   alpha_addq_(code, this_reg, sizeof(MonoObject), this_reg);  // 0
@@ -614,36 +612,21 @@ mono_arch_get_unbox_trampoline (MonoMethod *m, gpointer addr)
 }
 
 void
-mono_arch_nullify_plt_entry (guint8 *code)
+mono_arch_nullify_plt_entry (guint8 *code, mgreg_t *regs)
 {
         g_assert_not_reached ();
 }
 
 void
-mono_arch_patch_plt_entry (guint8 *code, guint8 *addr)
+mono_arch_patch_plt_entry (guint8 *code, gpointer *got, mgreg_t *regs, guint8 *addr)
 {
         g_assert_not_reached ();
 }
 
-/*
- * This method is only called when running in the Mono Debugger.
- */
-guint8 *
-mono_debugger_create_notification_function (MonoCodeManager *codeman)
+gpointer
+mono_arch_create_rgctx_lazy_fetch_trampoline (guint32 encoded_offset)
 {
-  guint8 *code;
-  unsigned int *buf;
-
-  code = mono_code_manager_reserve (codeman, 16);
-  buf = (unsigned int *)code;
-
-  *buf = 0;
-
-  alpha_call_pal(buf, 0x80);
-  alpha_ret(buf, alpha_ra, 1);
-  //x86_breakpoint (buf);
-  //x86_ret (buf);
-
-  return code;
+       /* FIXME: implement! */
+       g_assert_not_reached ();
+       return NULL;
 }
-