mono_create_static_rgctx_trampoline (struct MonoMethod * m, void * addr)
{
  union mono_mutex_t * D.24813;
  _Bool D.24816;
  long int D.24817;
  long int D.24818;
  void * D.24821;
  struct GHashTable * D.24822;
  struct GHashTable * D.24825;
  _Bool D.24828;
  long int D.24829;
  long int D.24830;
  void * D.24835;
  int mono_aot_only.0;
  _Bool D.24842;
  long int D.24843;
  long int D.24844;
  _Bool D.24849;
  long int D.24850;
  long int D.24851;
  unsigned int static_rgctx_trampolines.1;
  unsigned int static_rgctx_trampolines.2;
  void * ctx;
  void * res;
  struct MonoDomain * domain;
  struct RgctxTrampInfo tmp_info;
  struct RgctxTrampInfo * info;

  try
    {
      ctx = mini_method_get_rgctx (m);
      domain = mono_domain_get ();
      {
        int ret;

        D.24813 = &domain->lock.mutex;
        ret = pthread_mutex_lock (D.24813);
        if (ret != 0) goto <D.24814>; else goto <D.24815>;
        <D.24814>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
        <D.24815>:
        D.24816 = ret != 0;
        D.24817 = (long int) D.24816;
        D.24818 = __builtin_expect (D.24817, 0);
        if (D.24818 != 0) goto <D.24819>; else goto <D.24820>;
        <D.24819>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 96, "ret == 0");
        <D.24820>:
      }
      D.24821 = domain->runtime_info;
      D.24822 = MEM[(struct MonoJitDomainInfo *)D.24821].static_rgctx_trampoline_hash;
      if (D.24822 == 0B) goto <D.24823>; else goto <D.24824>;
      <D.24823>:
      D.24821 = domain->runtime_info;
      D.24825 = monoeg_g_hash_table_new (rgctx_tramp_info_hash, rgctx_tramp_info_equal);
      MEM[(struct MonoJitDomainInfo *)D.24821].static_rgctx_trampoline_hash = D.24825;
      <D.24824>:
      tmp_info.m = m;
      tmp_info.addr = addr;
      D.24821 = domain->runtime_info;
      D.24822 = MEM[(struct MonoJitDomainInfo *)D.24821].static_rgctx_trampoline_hash;
      res = monoeg_g_hash_table_lookup (D.24822, &tmp_info);
      {
        int ret;

        D.24813 = &domain->lock.mutex;
        ret = pthread_mutex_unlock (D.24813);
        if (ret != 0) goto <D.24826>; else goto <D.24827>;
        <D.24826>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
        <D.24827>:
        D.24828 = ret != 0;
        D.24829 = (long int) D.24828;
        D.24830 = __builtin_expect (D.24829, 0);
        if (D.24830 != 0) goto <D.24831>; else goto <D.24832>;
        <D.24831>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 103, "ret == 0");
        <D.24832>:
      }
      if (res != 0B) goto <D.24833>; else goto <D.24834>;
      <D.24833>:
      D.24835 = res;
      return D.24835;
      <D.24834>:
      mono_aot_only.0 = mono_aot_only;
      if (mono_aot_only.0 != 0) goto <D.24837>; else goto <D.24838>;
      <D.24837>:
      res = mono_aot_get_static_rgctx_trampoline (ctx, addr);
      goto <D.24839>;
      <D.24838>:
      res = mono_arch_get_static_rgctx_trampoline (m, ctx, addr);
      <D.24839>:
      {
        int ret;

        D.24813 = &domain->lock.mutex;
        ret = pthread_mutex_lock (D.24813);
        if (ret != 0) goto <D.24840>; else goto <D.24841>;
        <D.24840>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
        <D.24841>:
        D.24842 = ret != 0;
        D.24843 = (long int) D.24842;
        D.24844 = __builtin_expect (D.24843, 0);
        if (D.24844 != 0) goto <D.24845>; else goto <D.24846>;
        <D.24845>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 112, "ret == 0");
        <D.24846>:
      }
      info = mono_domain_alloc (domain, 8);
      info->m = m;
      info->addr = addr;
      D.24821 = domain->runtime_info;
      D.24822 = MEM[(struct MonoJitDomainInfo *)D.24821].static_rgctx_trampoline_hash;
      monoeg_g_hash_table_insert_replace (D.24822, info, res, 0);
      {
        int ret;

        D.24813 = &domain->lock.mutex;
        ret = pthread_mutex_unlock (D.24813);
        if (ret != 0) goto <D.24847>; else goto <D.24848>;
        <D.24847>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
        <D.24848>:
        D.24849 = ret != 0;
        D.24850 = (long int) D.24849;
        D.24851 = __builtin_expect (D.24850, 0);
        if (D.24851 != 0) goto <D.24852>; else goto <D.24853>;
        <D.24852>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 118, "ret == 0");
        <D.24853>:
      }
      static_rgctx_trampolines.1 = static_rgctx_trampolines;
      static_rgctx_trampolines.2 = static_rgctx_trampolines.1 + 1;
      static_rgctx_trampolines = static_rgctx_trampolines.2;
      D.24835 = res;
      return D.24835;
    }
  finally
    {
      tmp_info = {CLOBBER};
    }
}


rgctx_tramp_info_equal (const void * ka, const void * kb)
{
  struct MonoMethod * D.24859;
  struct MonoMethod * D.24860;
  void * D.24862;
  void * D.24863;
  gint D.24865;
  const struct RgctxTrampInfo * i1;
  const struct RgctxTrampInfo * i2;

  i1 = ka;
  i2 = kb;
  D.24859 = i1->m;
  D.24860 = i2->m;
  if (D.24859 == D.24860) goto <D.24861>; else goto <D.24858>;
  <D.24861>:
  D.24862 = i1->addr;
  D.24863 = i2->addr;
  if (D.24862 == D.24863) goto <D.24864>; else goto <D.24858>;
  <D.24864>:
  D.24865 = 1;
  return D.24865;
  <D.24858>:
  D.24865 = 0;
  return D.24865;
}


rgctx_tramp_info_hash (const void * data)
{
  guint D.24867;
  struct MonoMethod * D.24868;
  unsigned int D.24869;
  void * D.24870;
  unsigned int D.24871;
  const struct RgctxTrampInfo * info;

  info = data;
  D.24868 = info->m;
  D.24869 = (unsigned int) D.24868;
  D.24870 = info->addr;
  D.24871 = (unsigned int) D.24870;
  D.24867 = D.24869 ^ D.24871;
  return D.24867;
}


mini_jit_info_is_gsharedvt (struct MonoJitInfo * ji)
{
  unsigned char D.24876;
  unsigned char D.24877;
  struct MonoGenericSharingContext * D.24879;
  gboolean * D.24880;
  struct MonoGenericSharingContext * D.24882;
  gboolean * D.24883;
  gboolean D.24884;

  if (ji != 0B) goto <D.24875>; else goto <D.24873>;
  <D.24875>:
  D.24876 = BIT_FIELD_REF <*ji, 8, 176>;
  D.24877 = D.24876 & 2;
  if (D.24877 != 0) goto <D.24878>; else goto <D.24873>;
  <D.24878>:
  D.24879 = mono_jit_info_get_generic_sharing_context (ji);
  D.24880 = D.24879->var_is_vt;
  if (D.24880 != 0B) goto <D.24874>; else goto <D.24881>;
  <D.24881>:
  D.24882 = mono_jit_info_get_generic_sharing_context (ji);
  D.24883 = D.24882->mvar_is_vt;
  if (D.24883 != 0B) goto <D.24874>; else goto <D.24873>;
  <D.24874>:
  D.24884 = 1;
  return D.24884;
  <D.24873>:
  D.24884 = 0;
  return D.24884;
}


mini_add_method_trampoline (struct MonoMethod * orig_method, struct MonoMethod * m, void * compiled_method, gboolean add_static_rgctx_tramp, gboolean add_unbox_tramp)
{
  struct MonoDomain * D.24886;
  void * D.24887;
  unsigned char D.24888;
  unsigned char D.24889;
  <unnamed type> D.24894;
  <unnamed type> D.24902;
  unsigned char D.24909;
  unsigned char D.24910;
  _Bool D.24911;
  long int D.24912;
  long int D.24913;
  int mono_aot_only.3;
  unsigned int unbox_trampolines.4;
  unsigned int unbox_trampolines.5;
  struct MonoMethodSignature * D.24928;
  int D.24929;
  _Bool D.24932;
  _Bool D.24933;
  _Bool D.24934;
  void * D.24937;
  void * addr;
  gboolean callee_gsharedvt;
  gboolean callee_array_helper;
  struct MonoMethod * jmethod;
  struct MonoJitInfo * ji;

  addr = compiled_method;
  jmethod = 0B;
  D.24886 = mono_domain_get ();
  D.24887 = mono_get_addr_from_ftnptr (compiled_method);
  ji = mini_jit_info_table_find (D.24886, D.24887, 0B);
  callee_gsharedvt = mini_jit_info_is_gsharedvt (ji);
  callee_array_helper = 0;
  D.24888 = BIT_FIELD_REF <*m, 8, 160>;
  D.24889 = D.24888 & 124;
  if (D.24889 == 28) goto <D.24890>; else goto <D.24891>;
  <D.24890>:
  {
    struct WrapperInfo * info;

    info = mono_marshal_get_wrapper_info (m);
    if (info != 0B) goto <D.24892>; else goto <D.24893>;
    <D.24892>:
    D.24894 = info->subtype;
    if (D.24894 == 21) goto <D.24895>; else goto <D.24896>;
    <D.24895>:
    callee_array_helper = 1;
    m = info->d.generic_array_helper.method;
    <D.24896>:
    <D.24893>:
  }
  goto <D.24897>;
  <D.24891>:
  D.24888 = BIT_FIELD_REF <*m, 8, 160>;
  D.24889 = D.24888 & 124;
  if (D.24889 == 100) goto <D.24898>; else goto <D.24899>;
  <D.24898>:
  {
    struct WrapperInfo * info;

    info = mono_marshal_get_wrapper_info (m);
    if (info != 0B) goto <D.24900>; else goto <D.24901>;
    <D.24900>:
    D.24902 = info->subtype;
    if (D.24902 == 17) goto <D.24903>; else goto <D.24904>;
    <D.24903>:
    m = info->d.synchronized_inner.method;
    <D.24904>:
    <D.24901>:
  }
  <D.24899>:
  <D.24897>:
  if (orig_method == 0B) goto <D.24905>; else goto <D.24906>;
  <D.24905>:
  orig_method = m;
  <D.24906>:
  if (callee_gsharedvt != 0) goto <D.24907>; else goto <D.24908>;
  <D.24907>:
  D.24909 = BIT_FIELD_REF <*m, 8, 168>;
  D.24910 = D.24909 & 16;
  D.24911 = D.24910 == 0;
  D.24912 = (long int) D.24911;
  D.24913 = __builtin_expect (D.24912, 0);
  if (D.24913 != 0) goto <D.24914>; else goto <D.24915>;
  <D.24914>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 324, "m->is_inflated");
  <D.24915>:
  <D.24908>:
  addr = compiled_method;
  if (add_unbox_tramp != 0) goto <D.24916>; else goto <D.24917>;
  <D.24916>:
  mono_aot_only.3 = mono_aot_only;
  if (mono_aot_only.3 != 0) goto <D.24919>; else goto <D.24920>;
  <D.24919>:
  addr = mono_aot_get_unbox_trampoline (m);
  goto <D.24921>;
  <D.24920>:
  unbox_trampolines.4 = unbox_trampolines;
  unbox_trampolines.5 = unbox_trampolines.4 + 1;
  unbox_trampolines = unbox_trampolines.5;
  addr = mono_arch_get_unbox_trampoline (m, addr);
  <D.24921>:
  <D.24917>:
  if (ji != 0B) goto <D.24924>; else goto <D.24925>;
  <D.24924>:
  jmethod = jinfo_get_method (ji);
  <D.24925>:
  if (callee_gsharedvt != 0) goto <D.24926>; else goto <D.24927>;
  <D.24926>:
  D.24928 = mono_method_signature (jmethod);
  D.24929 = mini_is_gsharedvt_variable_signature (D.24928);
  if (D.24929 != 0) goto <D.24930>; else goto <D.24931>;
  <D.24930>:
  {
    struct MonoGenericSharingContext * gsctx;
    struct MonoMethodSignature * sig;
    struct MonoMethodSignature * gsig;

    gsctx = mono_jit_info_get_generic_sharing_context (ji);
    sig = mono_method_signature (m);
    gsig = mono_method_signature (jmethod);
    addr = mini_get_gsharedvt_wrapper (1, addr, sig, gsig, gsctx, -1, 0);
  }
  <D.24931>:
  <D.24927>:
  D.24932 = add_static_rgctx_tramp != 0;
  D.24933 = callee_array_helper == 0;
  D.24934 = D.24932 & D.24933;
  if (D.24934 != 0) goto <D.24935>; else goto <D.24936>;
  <D.24935>:
  addr = mono_create_static_rgctx_trampoline (m, addr);
  <D.24936>:
  D.24937 = addr;
  return D.24937;
}


jinfo_get_method (struct MonoJitInfo * ji)
{
  struct MonoMethod * D.24939;

  D.24939 = mono_jit_info_get_method (ji);
  return D.24939;
}


mono_magic_trampoline (mgreg_t * regs, guint8 * code, void * arg, guint8 * tramp)
{
  unsigned int trampoline_calls.6;
  unsigned int trampoline_calls.7;
  void * D.24943;

  trampoline_calls.6 = trampoline_calls;
  trampoline_calls.7 = trampoline_calls.6 + 1;
  trampoline_calls = trampoline_calls.7;
  D.24943 = common_call_trampoline (regs, code, arg, tramp, 0B, 0B, 0);
  return D.24943;
}


common_call_trampoline (mgreg_t * regs, guint8 * code, struct MonoMethod * m, guint8 * tramp, struct MonoVTable * vt, void * * vtable_slot, gboolean need_rgctx_tramp)
{
  _Bool D.24945;
  _Bool D.24946;
  _Bool D.24947;
  _Bool D.24948;
  _Bool D.24951;
  long int D.24952;
  long int D.24953;
  struct MonoVTable * D.24956;
  struct MonoClass * D.24957;
  struct MonoClass * D.24958;
  unsigned char D.24964;
  unsigned char D.24965;
  struct MonoGenericInst * D.24967;
  int variance_used.8;
  struct MonoClass * D.24972;
  int D.24973;
  _Bool D.24976;
  _Bool D.24977;
  _Bool D.24978;
  void * addr.9;
  struct MonoDomain * D.24982;
  int D.24983;
  void * D.24986;
  struct MonoDomain * D.24987;
  int D.24991;
  struct MonoGenericClass * D.24996;
  struct MonoGenericInst * D.24999;
  struct MonoGenericContainer * D.25001;
  _Bool D.25002;
  long int D.25003;
  long int D.25004;
  unsigned char D.25009;
  unsigned char D.25010;
  _Bool D.25011;
  long int D.25012;
  long int D.25013;
  struct MonoGenericInst * D.25016;
  _Bool D.25019;
  long int D.25020;
  long int D.25021;
  struct MonoGenericContext * D.25027;
  struct MonoGenericInst * D.25028;
  struct MonoVTable * D.25030;
  short unsigned int D.25034;
  int D.25035;
  int D.25036;
  unsigned char D.25038;
  unsigned char D.25039;
  struct MonoVTable * D.25040;
  struct MonoClass * D.25041;
  unsigned char D.25042;
  unsigned char D.25043;
  _Bool D.25044;
  long int D.25045;
  long int D.25046;
  struct MonoClass * * D.25051;
  short unsigned int D.25052;
  sizetype D.25053;
  sizetype D.25054;
  sizetype D.25055;
  struct MonoClass * * D.25056;
  _Bool D.25057;
  _Bool D.25058;
  int D.25059;
  _Bool D.25060;
  long int D.25061;
  long int D.25062;
  int vtable_slot.10;
  int vt.11;
  int D.25069;
  _Bool D.25070;
  long int D.25071;
  long int D.25072;
  struct MonoClass * D.25075;
  struct MonoMethod * * D.25076;
  unsigned int displacement.12;
  unsigned int D.25078;
  struct MonoMethod * * D.25079;
  unsigned char D.25084;
  unsigned char D.25085;
  struct MonoGenericClass * D.25089;
  struct MonoGenericInst * D.25092;
  struct MonoGenericContainer * D.25094;
  struct MonoGenericInst * D.25097;
  long int D.25098;
  long int D.25099;
  _Bool D.25102;
  long int D.25103;
  long int D.25104;
  struct MonoClass * D.25107;
  _Bool D.25108;
  long int D.25109;
  long int D.25110;
  unsigned char D.25113;
  unsigned char D.25114;
  short unsigned int D.25118;
  int D.25119;
  int D.25120;
  int D.25125;
  _Bool D.25128;
  long int D.25129;
  long int D.25130;
  _Bool D.25133;
  _Bool D.25134;
  _Bool D.25135;
  struct MonoClass * D.25138;
  unsigned char D.25139;
  unsigned char D.25140;
  int need_rgctx_tramp.13;
  void * addr.14;
  struct MonoMethod * iftmp.15;
  struct MonoDomain * D.25158;
  void * D.25161;
  struct GHashTable * D.25162;
  union mono_mutex_t * D.25165;
  _Bool D.25168;
  long int D.25169;
  long int D.25170;
  _Bool D.25177;
  long int D.25178;
  long int D.25179;
  int D.25188;
  struct MonoDomain * D.25190;
  int D.25191;
  void * D.25192;
  _Bool D.25193;
  long int D.25194;
  long int D.25195;
  void * D.25198;
  struct MonoDomain * D.25204;
  void * D.25205;
  struct MonoDomain * D.25208;
  _Bool D.25209;
  _Bool D.25210;
  _Bool D.25211;
  unsigned char D.25216;
  unsigned char D.25217;
  unsigned char D.25220;
  unsigned char D.25221;
  struct MonoDomain * D.25231;
  void * D.25232;
  struct MonoDomain * D.25235;
  int D.25246;
  void * D.25249;
  void * addr;
  void * compiled_method;
  gboolean generic_shared;
  gboolean need_unbox_tramp;
  struct MonoMethod * declaring;
  struct MonoMethod * generic_virtual;
  struct MonoMethod * variant_iface;
  struct MonoMethod * orig_method;
  int context_used;
  gboolean virtual;
  gboolean variance_used;
  void * * orig_vtable_slot;
  void * * vtable_slot_to_patch;
  struct MonoJitInfo * ji;

  try
    {
      generic_shared = 0;
      need_unbox_tramp = 0;
      declaring = 0B;
      generic_virtual = 0B;
      variant_iface = 0B;
      orig_method = 0B;
      variance_used = 0;
      vtable_slot_to_patch = 0B;
      ji = 0B;
      D.24945 = vtable_slot > vt;
      virtual = (gboolean) D.24945;
      orig_vtable_slot = vtable_slot;
      vtable_slot_to_patch = vtable_slot;
      D.24946 = vt != 0B;
      D.24947 = vtable_slot < vt;
      D.24948 = D.24946 & D.24947;
      if (D.24948 != 0) goto <D.24949>; else goto <D.24950>;
      <D.24949>:
      {
        struct MonoMethod * impl_method;
        struct MonoObject * this_arg;

        try
          {
            impl_method = 0B;
            m = mono_arch_find_imt_method (regs, code);
            vtable_slot = orig_vtable_slot;
            D.24951 = vtable_slot == 0B;
            D.24952 = (long int) D.24951;
            D.24953 = __builtin_expect (D.24952, 0);
            if (D.24953 != 0) goto <D.24954>; else goto <D.24955>;
            <D.24954>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 401, "vtable_slot");
            <D.24955>:
            orig_method = m;
            this_arg = mono_arch_get_this_arg_from_call (regs, code);
            D.24956 = this_arg->vtable;
            D.24957 = D.24956->klass;
            D.24958 = mono_defaults.transparent_proxy_class;
            if (D.24957 == D.24958) goto <D.24959>; else goto <D.24960>;
            <D.24959>:
            m = mono_object_get_virtual_method (this_arg, m);
            vtable_slot_to_patch = 0B;
            goto <D.24961>;
            <D.24960>:
            {
              gboolean lookup_aot;

              D.24964 = BIT_FIELD_REF <*m, 8, 168>;
              D.24965 = D.24964 & 16;
              if (D.24965 != 0) goto <D.24966>; else goto <D.24962>;
              <D.24966>:
              D.24967 = MEM[(struct MonoMethodInflated *)m].context.method_inst;
              if (D.24967 != 0B) goto <D.24968>; else goto <D.24962>;
              <D.24968>:
              generic_virtual = m;
              need_rgctx_tramp = 1;
              goto <D.24963>;
              <D.24962>:
              variance_used.8 = variance_used;
              if (variance_used.8 != 0) goto <D.24970>; else goto <D.24971>;
              <D.24970>:
              D.24972 = m->klass;
              D.24973 = mono_class_has_variant_generic_params (D.24972);
              if (D.24973 != 0) goto <D.24974>; else goto <D.24975>;
              <D.24974>:
              variant_iface = m;
              <D.24975>:
              <D.24971>:
              <D.24963>:
              addr = 0B;
              D.24976 = generic_virtual == 0B;
              D.24977 = variant_iface == 0B;
              D.24978 = D.24976 & D.24977;
              lookup_aot = (gboolean) D.24978;
              vtable_slot = mono_convert_imt_slot_to_vtable_slot (vtable_slot, regs, code, m, lookup_aot, &impl_method, &need_rgctx_tramp, &variance_used, &addr);
              vtable_slot_to_patch = vtable_slot;
              addr.9 = addr;
              if (addr.9 != 0B) goto <D.24980>; else goto <D.24981>;
              <D.24980>:
              D.24982 = mono_domain_get ();
              D.24983 = mono_domain_owns_vtable_slot (D.24982, vtable_slot);
              if (D.24983 != 0) goto <D.24984>; else goto <D.24985>;
              <D.24984>:
              addr.9 = addr;
              *vtable_slot = addr.9;
              <D.24985>:
              D.24987 = mono_domain_get ();
              addr.9 = addr;
              D.24986 = mono_create_ftnptr (D.24987, addr.9);
              return D.24986;
              <D.24981>:
              m = impl_method;
            }
            <D.24961>:
          }
        finally
          {
            impl_method = {CLOBBER};
          }
      }
      <D.24950>:
      if (virtual != 0) goto <D.24990>; else goto <D.24988>;
      <D.24990>:
      D.24991 = is_generic_method_definition (m);
      if (D.24991 != 0) goto <D.24992>; else goto <D.24988>;
      <D.24992>:
      {
        struct MonoGenericContext context;
        struct MonoMethod * declaring;

        try
          {
            context.class_inst = 0B;
            context.method_inst = 0B;
            D.24964 = BIT_FIELD_REF <*m, 8, 168>;
            D.24965 = D.24964 & 16;
            if (D.24965 != 0) goto <D.24993>; else goto <D.24994>;
            <D.24993>:
            declaring = mono_method_get_declaring_generic_method (m);
            goto <D.24995>;
            <D.24994>:
            declaring = m;
            <D.24995>:
            D.24972 = m->klass;
            D.24996 = D.24972->generic_class;
            if (D.24996 != 0B) goto <D.24997>; else goto <D.24998>;
            <D.24997>:
            D.24972 = m->klass;
            D.24996 = D.24972->generic_class;
            D.24999 = D.24996->context.class_inst;
            context.class_inst = D.24999;
            goto <D.25000>;
            <D.24998>:
            D.24972 = m->klass;
            D.25001 = D.24972->generic_container;
            D.25002 = D.25001 != 0B;
            D.25003 = (long int) D.25002;
            D.25004 = __builtin_expect (D.25003, 0);
            if (D.25004 != 0) goto <D.25005>; else goto <D.25006>;
            <D.25005>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 464, "!m->klass->generic_container");
            <D.25006>:
            <D.25000>:
            generic_virtual = mono_arch_find_imt_method (regs, code);
            if (generic_virtual != 0B) goto <D.25007>; else goto <D.25008>;
            <D.25007>:
            D.25009 = BIT_FIELD_REF <*generic_virtual, 8, 168>;
            D.25010 = D.25009 & 16;
            D.25011 = D.25010 == 0;
            D.25012 = (long int) D.25011;
            D.25013 = __builtin_expect (D.25012, 0);
            if (D.25013 != 0) goto <D.25014>; else goto <D.25015>;
            <D.25014>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 470, "generic_virtual->is_inflated");
            <D.25015>:
            D.25016 = MEM[(struct MonoMethodInflated *)generic_virtual].context.method_inst;
            context.method_inst = D.25016;
            <D.25008>:
            m = mono_class_inflate_generic_method (declaring, &context);
            need_rgctx_tramp = 1;
          }
        finally
          {
            context = {CLOBBER};
          }
      }
      goto <D.24989>;
      <D.24988>:
      context_used = mono_method_check_context_used (m);
      if (context_used != 0) goto <D.25017>; else goto <D.25018>;
      <D.25017>:
      {
        struct MonoClass * klass;
        struct MonoMethod * actual_method;
        struct MonoVTable * vt;
        struct MonoGenericInst * method_inst;

        klass = 0B;
        actual_method = 0B;
        vt = 0B;
        method_inst = 0B;
        vtable_slot = 0B;
        generic_shared = 1;
        D.25019 = code == 0B;
        D.25020 = (long int) D.25019;
        D.25021 = __builtin_expect (D.25020, 0);
        if (D.25021 != 0) goto <D.25022>; else goto <D.25023>;
        <D.25022>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 486, "code");
        <D.25023>:
        D.24964 = BIT_FIELD_REF <*m, 8, 168>;
        D.24965 = D.24964 & 16;
        if (D.24965 != 0) goto <D.25026>; else goto <D.25024>;
        <D.25026>:
        D.25027 = mono_method_get_context (m);
        D.25028 = D.25027->method_inst;
        if (D.25028 != 0B) goto <D.25029>; else goto <D.25024>;
        <D.25029>:
        {
          struct MonoMethodRuntimeGenericContext * mrgctx;

          mrgctx = mono_arch_find_static_call_vtable (regs, code);
          D.25030 = mrgctx->class_vtable;
          klass = D.25030->klass;
          method_inst = mrgctx->method_inst;
        }
        goto <D.25025>;
        <D.25024>:
        D.25034 = m->flags;
        D.25035 = (int) D.25034;
        D.25036 = D.25035 & 16;
        if (D.25036 != 0) goto <D.25031>; else goto <D.25037>;
        <D.25037>:
        D.24972 = m->klass;
        D.25038 = BIT_FIELD_REF <*D.24972, 8, 160>;
        D.25039 = D.25038 & 8;
        if (D.25039 != 0) goto <D.25031>; else goto <D.25032>;
        <D.25031>:
        {
          struct MonoVTable * vtable;

          vtable = mono_arch_find_static_call_vtable (regs, code);
          klass = vtable->klass;
        }
        goto <D.25033>;
        <D.25032>:
        {
          struct MonoObject * this_argument;

          this_argument = mono_arch_get_this_arg_from_call (regs, code);
          vt = this_argument->vtable;
          vtable_slot = orig_vtable_slot;
          D.25040 = this_argument->vtable;
          D.25041 = D.25040->klass;
          D.25042 = BIT_FIELD_REF <*D.25041, 8, 160>;
          D.25043 = D.25042 & 1;
          D.25044 = D.25043 == 0;
          D.25045 = (long int) D.25044;
          D.25046 = __builtin_expect (D.25045, 0);
          if (D.25046 != 0) goto <D.25047>; else goto <D.25048>;
          <D.25047>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 512, "this_argument->vtable->klass->inited");
          <D.25048>:
          if (vtable_slot == 0B) goto <D.25049>; else goto <D.25050>;
          <D.25049>:
          D.25040 = this_argument->vtable;
          D.25041 = D.25040->klass;
          mono_class_setup_supertypes (D.25041);
          D.25040 = this_argument->vtable;
          D.25041 = D.25040->klass;
          D.25051 = D.25041->supertypes;
          D.24972 = m->klass;
          D.25052 = D.24972->idepth;
          D.25053 = (sizetype) D.25052;
          D.25054 = D.25053 + 1073741823;
          D.25055 = D.25054 * 4;
          D.25056 = D.25051 + D.25055;
          klass = *D.25056;
          <D.25050>:
        }
        <D.25033>:
        <D.25025>:
        D.24951 = vtable_slot == 0B;
        D.25057 = klass == 0B;
        D.25058 = D.24951 & D.25057;
        D.25059 = (int) D.25058;
        D.25060 = D.25059 != 0;
        D.25061 = (long int) D.25060;
        D.25062 = __builtin_expect (D.25061, 0);
        if (D.25062 != 0) goto <D.25063>; else goto <D.25064>;
        <D.25063>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 524, "vtable_slot || klass");
        <D.25064>:
        if (vtable_slot != 0B) goto <D.25065>; else goto <D.25066>;
        <D.25065>:
        {
          int displacement;

          vtable_slot.10 = (int) vtable_slot;
          vt.11 = (int) vt;
          D.25069 = vtable_slot.10 - vt.11;
          displacement = D.25069 /[ex] 4;
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "mini-trampolines.c", 529);
          D.25070 = displacement <= 0;
          D.25071 = (long int) D.25070;
          D.25072 = __builtin_expect (D.25071, 0);
          if (D.25072 != 0) goto <D.25073>; else goto <D.25074>;
          <D.25073>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 531, "displacement > 0");
          <D.25074>:
          D.25075 = vt->klass;
          D.25076 = D.25075->vtable;
          displacement.12 = (unsigned int) displacement;
          D.25078 = displacement.12 * 4;
          D.25079 = D.25076 + D.25078;
          actual_method = *D.25079;
        }
        <D.25066>:
        if (method_inst != 0B) goto <D.25080>; else goto <D.25083>;
        <D.25083>:
        D.25084 = BIT_FIELD_REF <*m, 8, 160>;
        D.25085 = D.25084 & 124;
        if (D.25085 != 0) goto <D.25080>; else goto <D.25081>;
        <D.25080>:
        {
          struct MonoGenericContext context;

          try
            {
              context.class_inst = 0B;
              context.method_inst = 0B;
              D.24964 = BIT_FIELD_REF <*m, 8, 168>;
              D.24965 = D.24964 & 16;
              if (D.24965 != 0) goto <D.25086>; else goto <D.25087>;
              <D.25086>:
              declaring = mono_method_get_declaring_generic_method (m);
              goto <D.25088>;
              <D.25087>:
              declaring = m;
              <D.25088>:
              D.25089 = klass->generic_class;
              if (D.25089 != 0B) goto <D.25090>; else goto <D.25091>;
              <D.25090>:
              D.25089 = klass->generic_class;
              D.25092 = D.25089->context.class_inst;
              context.class_inst = D.25092;
              goto <D.25093>;
              <D.25091>:
              D.25094 = klass->generic_container;
              if (D.25094 != 0B) goto <D.25095>; else goto <D.25096>;
              <D.25095>:
              D.25094 = klass->generic_container;
              D.25097 = D.25094->context.class_inst;
              context.class_inst = D.25097;
              <D.25096>:
              <D.25093>:
              context.method_inst = method_inst;
              actual_method = mono_class_inflate_generic_method (declaring, &context);
            }
          finally
            {
              context = {CLOBBER};
            }
        }
        goto <D.25082>;
        <D.25081>:
        actual_method = mono_class_get_method_generic (klass, m);
        <D.25082>:
        D.25057 = klass == 0B;
        D.25098 = (long int) D.25057;
        D.25099 = __builtin_expect (D.25098, 0);
        if (D.25099 != 0) goto <D.25100>; else goto <D.25101>;
        <D.25100>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 555, "klass");
        <D.25101>:
        D.25102 = actual_method == 0B;
        D.25103 = (long int) D.25102;
        D.25104 = __builtin_expect (D.25103, 0);
        if (D.25104 != 0) goto <D.25105>; else goto <D.25106>;
        <D.25105>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 556, "actual_method");
        <D.25106>:
        D.25107 = actual_method->klass;
        D.25108 = D.25107 != klass;
        D.25109 = (long int) D.25108;
        D.25110 = __builtin_expect (D.25109, 0);
        if (D.25110 != 0) goto <D.25111>; else goto <D.25112>;
        <D.25111>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 557, "actual_method->klass == klass");
        <D.25112>:
        D.25113 = BIT_FIELD_REF <*actual_method, 8, 168>;
        D.25114 = D.25113 & 16;
        if (D.25114 != 0) goto <D.25115>; else goto <D.25116>;
        <D.25115>:
        declaring = mono_method_get_declaring_generic_method (actual_method);
        goto <D.25117>;
        <D.25116>:
        declaring = 0B;
        <D.25117>:
        m = actual_method;
      }
      <D.25018>:
      <D.24989>:
      D.25118 = m->iflags;
      D.25119 = (int) D.25118;
      D.25120 = D.25119 & 32;
      if (D.25120 != 0) goto <D.25121>; else goto <D.25122>;
      <D.25121>:
      m = mono_marshal_get_synchronized_wrapper (m);
      need_rgctx_tramp = 0;
      <D.25122>:
      if (code == 0B) goto <D.25123>; else goto <D.25124>;
      <D.25123>:
      D.25125 = mono_method_needs_static_rgctx_invoke (m, 0);
      if (D.25125 != 0) goto <D.25126>; else goto <D.25127>;
      <D.25126>:
      need_rgctx_tramp = 1;
      <D.25127>:
      <D.25124>:
      compiled_method = mono_compile_method (m);
      addr = compiled_method;
      addr.9 = addr;
      D.25128 = addr.9 == 0B;
      D.25129 = (long int) D.25128;
      D.25130 = __builtin_expect (D.25129, 0);
      if (D.25130 != 0) goto <D.25131>; else goto <D.25132>;
      <D.25131>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 577, "addr");
      <D.25132>:
      D.25133 = generic_virtual != 0B;
      D.25134 = variant_iface != 0B;
      D.25135 = D.25133 | D.25134;
      if (D.25135 != 0) goto <D.25136>; else goto <D.25137>;
      <D.25136>:
      D.25138 = vt->klass;
      D.25139 = BIT_FIELD_REF <*D.25138, 8, 160>;
      D.25140 = D.25139 & 8;
      if (D.25140 != 0) goto <D.25141>; else goto <D.25142>;
      <D.25141>:
      need_unbox_tramp = 1;
      <D.25142>:
      goto <D.25143>;
      <D.25137>:
      if (orig_vtable_slot != 0B) goto <D.25144>; else goto <D.25145>;
      <D.25144>:
      D.24972 = m->klass;
      D.25038 = BIT_FIELD_REF <*D.24972, 8, 160>;
      D.25039 = D.25038 & 8;
      if (D.25039 != 0) goto <D.25146>; else goto <D.25147>;
      <D.25146>:
      need_unbox_tramp = 1;
      <D.25147>:
      <D.25145>:
      <D.25143>:
      need_rgctx_tramp.13 = need_rgctx_tramp;
      addr.14 = mini_add_method_trampoline (orig_method, m, compiled_method, need_rgctx_tramp.13, need_unbox_tramp);
      addr = addr.14;
      D.25133 = generic_virtual != 0B;
      D.25134 = variant_iface != 0B;
      D.25135 = D.25133 | D.25134;
      if (D.25135 != 0) goto <D.25150>; else goto <D.25151>;
      <D.25150>:
      {
        struct MonoMethod * target;

        if (generic_virtual != 0B) goto <D.25153>; else goto <D.25154>;
        <D.25153>:
        iftmp.15 = generic_virtual;
        goto <D.25155>;
        <D.25154>:
        iftmp.15 = variant_iface;
        <D.25155>:
        target = iftmp.15;
        vtable_slot = orig_vtable_slot;
        D.24951 = vtable_slot == 0B;
        D.24952 = (long int) D.24951;
        D.24953 = __builtin_expect (D.24952, 0);
        if (D.24953 != 0) goto <D.25156>; else goto <D.25157>;
        <D.25156>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 593, "vtable_slot");
        <D.25157>:
        D.25158 = mono_domain_get ();
        addr.9 = addr;
        mono_method_add_generic_virtual_invocation (D.25158, vt, vtable_slot, target, addr.9);
        D.24986 = addr;
        return D.24986;
      }
      <D.25151>:
      if (code == 0B) goto <D.25159>; else goto <D.25160>;
      <D.25159>:
      {
        struct MonoDomain * domain;

        domain = mono_domain_get ();
        D.25161 = domain->runtime_info;
        D.25162 = MEM[(struct MonoJitDomainInfo *)D.25161].jump_target_got_slot_hash;
        if (D.25162 != 0B) goto <D.25163>; else goto <D.25164>;
        <D.25163>:
        {
          struct GSList * list;
          struct GSList * tmp;

          {
            int ret;

            D.25165 = &domain->lock.mutex;
            ret = pthread_mutex_lock (D.25165);
            if (ret != 0) goto <D.25166>; else goto <D.25167>;
            <D.25166>:
            monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
            <D.25167>:
            D.25168 = ret != 0;
            D.25169 = (long int) D.25168;
            D.25170 = __builtin_expect (D.25169, 0);
            if (D.25170 != 0) goto <D.25171>; else goto <D.25172>;
            <D.25171>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 614, "ret == 0");
            <D.25172>:
          }
          D.25161 = domain->runtime_info;
          D.25162 = MEM[(struct MonoJitDomainInfo *)D.25161].jump_target_got_slot_hash;
          list = monoeg_g_hash_table_lookup (D.25162, m);
          if (list != 0B) goto <D.25173>; else goto <D.25174>;
          <D.25173>:
          tmp = list;
          goto <D.24543>;
          <D.24542>:
          {
            void * * got_slot;

            got_slot = tmp->data;
            addr.9 = addr;
            *got_slot = addr.9;
          }
          tmp = tmp->next;
          <D.24543>:
          if (tmp != 0B) goto <D.24542>; else goto <D.24544>;
          <D.24544>:
          D.25161 = domain->runtime_info;
          D.25162 = MEM[(struct MonoJitDomainInfo *)D.25161].jump_target_got_slot_hash;
          monoeg_g_hash_table_remove (D.25162, m);
          monoeg_g_slist_free (list);
          <D.25174>:
          {
            int ret;

            D.25165 = &domain->lock.mutex;
            ret = pthread_mutex_unlock (D.25165);
            if (ret != 0) goto <D.25175>; else goto <D.25176>;
            <D.25175>:
            monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
            <D.25176>:
            D.25177 = ret != 0;
            D.25178 = (long int) D.25177;
            D.25179 = __builtin_expect (D.25178, 0);
            if (D.25179 != 0) goto <D.25180>; else goto <D.25181>;
            <D.25180>:
            monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 624, "ret == 0");
            <D.25181>:
          }
        }
        <D.25164>:
        D.24986 = addr;
        return D.24986;
      }
      <D.25160>:
      vtable_slot = orig_vtable_slot;
      if (vtable_slot != 0B) goto <D.25182>; else goto <D.25183>;
      <D.25182>:
      if (vtable_slot_to_patch != 0B) goto <D.25186>; else goto <D.25187>;
      <D.25186>:
      D.25188 = mono_aot_is_got_entry (code, vtable_slot_to_patch);
      if (D.25188 != 0) goto <D.25184>; else goto <D.25189>;
      <D.25189>:
      D.25190 = mono_domain_get ();
      D.25191 = mono_domain_owns_vtable_slot (D.25190, vtable_slot_to_patch);
      if (D.25191 != 0) goto <D.25184>; else goto <D.25185>;
      <D.25184>:
      D.25192 = *vtable_slot_to_patch;
      D.25193 = D.25192 == 0B;
      D.25194 = (long int) D.25193;
      D.25195 = __builtin_expect (D.25194, 0);
      if (D.25195 != 0) goto <D.25196>; else goto <D.25197>;
      <D.25196>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 634, "*vtable_slot_to_patch");
      <D.25197>:
      addr.9 = addr;
      D.25198 = mono_get_addr_from_ftnptr (addr.9);
      *vtable_slot_to_patch = D.25198;
      <D.25185>:
      <D.25187>:
      goto <D.25199>;
      <D.25183>:
      {
        guint8 * plt_entry;
        gboolean no_patch;
        struct MonoJitInfo * target_ji;

        plt_entry = mono_aot_get_plt_entry (code);
        no_patch = 0;
        if (plt_entry != 0B) goto <D.25200>; else goto <D.25201>;
        <D.25200>:
        if (generic_shared != 0) goto <D.25202>; else goto <D.25203>;
        <D.25202>:
        D.25204 = mono_domain_get ();
        D.25205 = mono_get_addr_from_ftnptr (compiled_method);
        target_ji = mini_jit_info_table_find (D.25204, D.25205, 0B);
        if (ji == 0B) goto <D.25206>; else goto <D.25207>;
        <D.25206>:
        D.25208 = mono_domain_get ();
        ji = mini_jit_info_table_find (D.25208, code, 0B);
        <D.25207>:
        D.25209 = ji != 0B;
        D.25210 = target_ji != 0B;
        D.25211 = D.25209 & D.25210;
        if (D.25211 != 0) goto <D.25212>; else goto <D.25213>;
        <D.25212>:
        if (generic_shared != 0) goto <D.25214>; else goto <D.25215>;
        <D.25214>:
        D.25216 = BIT_FIELD_REF <*ji, 8, 176>;
        D.25217 = D.25216 & 2;
        if (D.25217 != 0) goto <D.25218>; else goto <D.25219>;
        <D.25218>:
        D.25220 = BIT_FIELD_REF <*target_ji, 8, 176>;
        D.25221 = D.25220 & 2;
        if (D.25221 == 0) goto <D.25222>; else goto <D.25223>;
        <D.25222>:
        no_patch = 1;
        <D.25223>:
        <D.25219>:
        <D.25215>:
        <D.25213>:
        <D.25203>:
        if (no_patch == 0) goto <D.25224>; else goto <D.25225>;
        <D.25224>:
        addr.9 = addr;
        mono_aot_patch_plt_entry (plt_entry, 0B, regs, addr.9);
        <D.25225>:
        goto <D.25226>;
        <D.25201>:
        if (generic_shared != 0) goto <D.25227>; else goto <D.25228>;
        <D.25227>:
        D.25084 = BIT_FIELD_REF <*m, 8, 160>;
        D.25085 = D.25084 & 124;
        if (D.25085 != 0) goto <D.25229>; else goto <D.25230>;
        <D.25229>:
        m = mono_marshal_method_from_wrapper (m);
        <D.25230>:
        <D.25228>:
        D.25231 = mono_domain_get ();
        D.25232 = mono_get_addr_from_ftnptr (compiled_method);
        target_ji = mini_jit_info_table_find (D.25231, D.25232, 0B);
        if (ji == 0B) goto <D.25233>; else goto <D.25234>;
        <D.25233>:
        D.25235 = mono_domain_get ();
        ji = mini_jit_info_table_find (D.25235, code, 0B);
        <D.25234>:
        D.25209 = ji != 0B;
        D.25210 = target_ji != 0B;
        D.25211 = D.25209 & D.25210;
        if (D.25211 != 0) goto <D.25236>; else goto <D.25237>;
        <D.25236>:
        if (generic_shared != 0) goto <D.25238>; else goto <D.25239>;
        <D.25238>:
        D.25216 = BIT_FIELD_REF <*ji, 8, 176>;
        D.25217 = D.25216 & 2;
        if (D.25217 != 0) goto <D.25240>; else goto <D.25241>;
        <D.25240>:
        D.25220 = BIT_FIELD_REF <*target_ji, 8, 176>;
        D.25221 = D.25220 & 2;
        if (D.25221 == 0) goto <D.25242>; else goto <D.25243>;
        <D.25242>:
        no_patch = 1;
        <D.25243>:
        <D.25241>:
        <D.25239>:
        <D.25237>:
        if (no_patch == 0) goto <D.25244>; else goto <D.25245>;
        <D.25244>:
        D.25246 = mono_method_same_domain (ji, target_ji);
        if (D.25246 != 0) goto <D.25247>; else goto <D.25248>;
        <D.25247>:
        D.25249 = ji->code_start;
        addr.9 = addr;
        mono_arch_patch_callsite (D.25249, code, addr.9);
        <D.25248>:
        <D.25245>:
        <D.25226>:
      }
      <D.25199>:
      D.24986 = addr;
      return D.24986;
    }
  finally
    {
      addr = {CLOBBER};
      variance_used = {CLOBBER};
    }
}


mono_convert_imt_slot_to_vtable_slot (void * * slot, mgreg_t * regs, guint8 * code, struct MonoMethod * method, gboolean lookup_aot, struct MonoMethod * * impl_method, gboolean * need_rgctx_tramp, gboolean * variance_used, void * * aot_addr)
{
  int slot.16;
  int vt.17;
  int D.25256;
  void * * D.25259;
  struct MonoClass * D.25260;
  struct MonoClass * D.25261;
  struct MonoType * D.25264;
  char * D.25265;
  struct MonoType * D.25266;
  char * D.25267;
  unsigned int D.25268;
  int D.25269;
  unsigned char D.25272;
  unsigned char D.25273;
  struct MonoGenericInst * D.25275;
  struct MonoMethod * D.25277;
  short int D.25278;
  int D.25279;
  int D.25280;
  struct MonoClass * D.25281;
  struct MonoGenericClass * D.25282;
  struct MonoGenericInst * D.25285;
  unsigned char D.25289;
  unsigned char D.25290;
  struct MonoDomain * D.25292;
  int D.25293;
  int D.25294;
  void * D.25295;
  void * D.25296;
  int D.25300;
  int D.25301;
  int D.25304;
  unsigned char D.25309;
  unsigned char D.25310;
  <unnamed type> D.25315;
  _Bool D.25318;
  long int D.25319;
  long int D.25320;
  unsigned int D.25323;
  int D.25324;
  unsigned int D.25325;
  unsigned int D.25326;
  _Bool D.25329;
  long int D.25330;
  long int D.25331;
  struct MonoObject * this_argument;
  struct MonoVTable * vt;
  int displacement;

  this_argument = mono_arch_get_this_arg_from_call (regs, code);
  vt = this_argument->vtable;
  slot.16 = (int) slot;
  vt.17 = (int) vt;
  D.25256 = slot.16 - vt.17;
  displacement = D.25256 /[ex] 4;
  if (displacement > 0) goto <D.25257>; else goto <D.25258>;
  <D.25257>:
  D.25259 = slot;
  return D.25259;
  <D.25258>:
  {
    struct MonoMethod * imt_method;
    struct MonoMethod * impl;
    int interface_offset;
    int imt_slot;

    imt_method = mono_arch_find_imt_method (regs, code);
    imt_slot = displacement + 19;
    D.25260 = vt->klass;
    D.25261 = imt_method->klass;
    interface_offset = mono_class_interface_offset_with_variance (D.25260, D.25261, variance_used);
    if (interface_offset < 0) goto <D.25262>; else goto <D.25263>;
    <D.25262>:
    D.25260 = vt->klass;
    D.25264 = &D.25260->byval_arg;
    D.25265 = mono_type_get_name_full (D.25264, 0);
    D.25261 = imt_method->klass;
    D.25266 = &D.25261->byval_arg;
    D.25267 = mono_type_get_name_full (D.25266, 0);
    monoeg_g_log (0B, 4, "%s doesn\'t implement interface %s\n", D.25265, D.25267);
    <D.24469>:
    goto <D.24469>;
    <D.25263>:
    D.25268 = mono_method_get_imt_slot (imt_method);
    D.25269 = (int) D.25268;
    mono_vtable_build_imt_slot (vt, D.25269);
    D.25272 = BIT_FIELD_REF <*imt_method, 8, 168>;
    D.25273 = D.25272 & 16;
    if (D.25273 != 0) goto <D.25274>; else goto <D.25270>;
    <D.25274>:
    D.25275 = MEM[(struct MonoMethodInflated *)imt_method].context.method_inst;
    if (D.25275 != 0B) goto <D.25276>; else goto <D.25270>;
    <D.25276>:
    {
      struct MonoGenericContext context;

      try
        {
          context.class_inst = 0B;
          context.method_inst = 0B;
          D.25260 = vt->klass;
          D.25277 = mono_method_get_declaring_generic_method (imt_method);
          D.25278 = D.25277->slot;
          D.25279 = (int) D.25278;
          D.25280 = D.25279 + interface_offset;
          impl = mono_class_get_vtable_entry (D.25260, D.25280);
          D.25281 = impl->klass;
          D.25282 = D.25281->generic_class;
          if (D.25282 != 0B) goto <D.25283>; else goto <D.25284>;
          <D.25283>:
          D.25281 = impl->klass;
          D.25282 = D.25281->generic_class;
          D.25285 = D.25282->context.class_inst;
          context.class_inst = D.25285;
          <D.25284>:
          D.25275 = MEM[(struct MonoMethodInflated *)imt_method].context.method_inst;
          context.method_inst = D.25275;
          impl = mono_class_inflate_generic_method (impl, &context);
        }
      finally
        {
          context = {CLOBBER};
        }
    }
    goto <D.25271>;
    <D.25270>:
    if (lookup_aot != 0) goto <D.25288>; else goto <D.25286>;
    <D.25288>:
    D.25260 = vt->klass;
    D.25289 = BIT_FIELD_REF <*D.25260, 8, 160>;
    D.25290 = D.25289 & 8;
    if (D.25290 == 0) goto <D.25291>; else goto <D.25286>;
    <D.25291>:
    D.25292 = mono_domain_get ();
    D.25293 = mono_method_get_vtable_slot (imt_method);
    D.25294 = D.25293 + interface_offset;
    D.25295 = mono_aot_get_method_from_vt_slot (D.25292, vt, D.25294);
    *aot_addr = D.25295;
    goto <D.25287>;
    <D.25286>:
    *aot_addr = 0B;
    <D.25287>:
    D.25296 = *aot_addr;
    if (D.25296 != 0B) goto <D.25297>; else goto <D.25298>;
    <D.25297>:
    impl = 0B;
    goto <D.25299>;
    <D.25298>:
    D.25260 = vt->klass;
    D.25300 = mono_method_get_vtable_slot (imt_method);
    D.25301 = D.25300 + interface_offset;
    impl = mono_class_get_vtable_entry (D.25260, D.25301);
    <D.25299>:
    <D.25271>:
    if (impl != 0B) goto <D.25302>; else goto <D.25303>;
    <D.25302>:
    D.25304 = mono_method_needs_static_rgctx_invoke (impl, 0);
    if (D.25304 != 0) goto <D.25305>; else goto <D.25306>;
    <D.25305>:
    *need_rgctx_tramp = 1;
    <D.25306>:
    <D.25303>:
    if (impl != 0B) goto <D.25307>; else goto <D.25308>;
    <D.25307>:
    D.25309 = BIT_FIELD_REF <*impl, 8, 160>;
    D.25310 = D.25309 & 124;
    if (D.25310 == 28) goto <D.25311>; else goto <D.25312>;
    <D.25311>:
    {
      struct WrapperInfo * info;

      info = mono_marshal_get_wrapper_info (impl);
      if (info != 0B) goto <D.25313>; else goto <D.25314>;
      <D.25313>:
      D.25315 = info->subtype;
      if (D.25315 == 21) goto <D.25316>; else goto <D.25317>;
      <D.25316>:
      *need_rgctx_tramp = 1;
      <D.25317>:
      <D.25314>:
    }
    <D.25312>:
    <D.25308>:
    *impl_method = impl;
    D.25318 = imt_slot > 18;
    D.25319 = (long int) D.25318;
    D.25320 = __builtin_expect (D.25319, 0);
    if (D.25320 != 0) goto <D.25321>; else goto <D.25322>;
    <D.25321>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 223, "imt_slot < MONO_IMT_SIZE");
    <D.25322>:
    D.25323 = vt->imt_collisions_bitmap;
    D.25324 = 1 << imt_slot;
    D.25325 = (unsigned int) D.25324;
    D.25326 = D.25323 & D.25325;
    if (D.25326 != 0) goto <D.25327>; else goto <D.25328>;
    <D.25327>:
    {
      int slot;
      int vtable_offset;
      void * * vtable_slot;

      slot = mono_method_get_vtable_index (imt_method);
      D.25329 = slot == -1;
      D.25330 = (long int) D.25329;
      D.25331 = __builtin_expect (D.25330, 0);
      if (D.25331 != 0) goto <D.25332>; else goto <D.25333>;
      <D.25332>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 229, "slot != -1");
      <D.25333>:
      vtable_offset = interface_offset + slot;
      vtable_slot = &vt->vtable[vtable_offset];
      D.25259 = vtable_slot;
      return D.25259;
    }
    <D.25328>:
    D.25259 = slot;
    return D.25259;
  }
}


is_generic_method_definition (struct MonoMethod * m)
{
  unsigned char D.25335;
  unsigned char D.25336;
  gboolean D.25339;
  unsigned char D.25340;
  struct MonoGenericInst * D.25343;
  struct MonoMethod * D.25346;
  struct MonoGenericContainer * D.25347;
  struct MonoGenericInst * D.25348;
  struct MonoGenericContext * context;

  D.25335 = BIT_FIELD_REF <*m, 8, 168>;
  D.25336 = D.25335 & 8;
  if (D.25336 != 0) goto <D.25337>; else goto <D.25338>;
  <D.25337>:
  D.25339 = 1;
  return D.25339;
  <D.25338>:
  D.25335 = BIT_FIELD_REF <*m, 8, 168>;
  D.25340 = D.25335 & 16;
  if (D.25340 == 0) goto <D.25341>; else goto <D.25342>;
  <D.25341>:
  D.25339 = 0;
  return D.25339;
  <D.25342>:
  context = mono_method_get_context (m);
  D.25343 = context->method_inst;
  if (D.25343 == 0B) goto <D.25344>; else goto <D.25345>;
  <D.25344>:
  D.25339 = 0;
  return D.25339;
  <D.25345>:
  D.25343 = context->method_inst;
  D.25346 = MEM[(struct MonoMethodInflated *)m].declaring;
  D.25347 = mono_method_get_generic_container (D.25346);
  D.25348 = D.25347->context.method_inst;
  if (D.25343 == D.25348) goto <D.25349>; else goto <D.25350>;
  <D.25349>:
  D.25339 = 1;
  return D.25339;
  <D.25350>:
  D.25339 = 0;
  return D.25339;
}


mono_generic_virtual_remoting_trampoline (mgreg_t * regs, guint8 * code, struct MonoMethod * m, guint8 * tramp)
{
  unsigned int trampoline_calls.18;
  unsigned int trampoline_calls.19;
  unsigned char D.25354;
  unsigned char D.25355;
  _Bool D.25356;
  long int D.25357;
  long int D.25358;
  unsigned char D.25361;
  struct MonoClass * D.25365;
  struct MonoGenericClass * D.25366;
  struct MonoGenericInst * D.25369;
  struct MonoGenericContainer * D.25371;
  _Bool D.25372;
  long int D.25373;
  long int D.25374;
  unsigned char D.25377;
  unsigned char D.25378;
  struct MonoGenericInst * D.25381;
  _Bool D.25382;
  long int D.25383;
  long int D.25384;
  void * D.25387;
  struct MonoGenericContext context;
  struct MonoMethod * imt_method;
  struct MonoMethod * declaring;
  void * addr;

  try
    {
      context.class_inst = 0B;
      context.method_inst = 0B;
      trampoline_calls.18 = trampoline_calls;
      trampoline_calls.19 = trampoline_calls.18 + 1;
      trampoline_calls = trampoline_calls.19;
      D.25354 = BIT_FIELD_REF <*m, 8, 168>;
      D.25355 = D.25354 & 8;
      D.25356 = D.25355 == 0;
      D.25357 = (long int) D.25356;
      D.25358 = __builtin_expect (D.25357, 0);
      if (D.25358 != 0) goto <D.25359>; else goto <D.25360>;
      <D.25359>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 786, "m->is_generic");
      <D.25360>:
      D.25354 = BIT_FIELD_REF <*m, 8, 168>;
      D.25361 = D.25354 & 16;
      if (D.25361 != 0) goto <D.25362>; else goto <D.25363>;
      <D.25362>:
      declaring = mono_method_get_declaring_generic_method (m);
      goto <D.25364>;
      <D.25363>:
      declaring = m;
      <D.25364>:
      D.25365 = m->klass;
      D.25366 = D.25365->generic_class;
      if (D.25366 != 0B) goto <D.25367>; else goto <D.25368>;
      <D.25367>:
      D.25365 = m->klass;
      D.25366 = D.25365->generic_class;
      D.25369 = D.25366->context.class_inst;
      context.class_inst = D.25369;
      goto <D.25370>;
      <D.25368>:
      D.25365 = m->klass;
      D.25371 = D.25365->generic_container;
      D.25372 = D.25371 != 0B;
      D.25373 = (long int) D.25372;
      D.25374 = __builtin_expect (D.25373, 0);
      if (D.25374 != 0) goto <D.25375>; else goto <D.25376>;
      <D.25375>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 796, "!m->klass->generic_container");
      <D.25376>:
      <D.25370>:
      imt_method = mono_arch_find_imt_method (regs, code);
      D.25377 = BIT_FIELD_REF <*imt_method, 8, 168>;
      D.25378 = D.25377 & 16;
      if (D.25378 != 0) goto <D.25379>; else goto <D.25380>;
      <D.25379>:
      D.25381 = MEM[(struct MonoMethodInflated *)imt_method].context.method_inst;
      context.method_inst = D.25381;
      <D.25380>:
      m = mono_class_inflate_generic_method (declaring, &context);
      m = mono_marshal_get_remoting_invoke_with_check (m);
      addr = mono_compile_method (m);
      D.25382 = addr == 0B;
      D.25383 = (long int) D.25382;
      D.25384 = __builtin_expect (D.25383, 0);
      if (D.25384 != 0) goto <D.25385>; else goto <D.25386>;
      <D.25385>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 807, "addr");
      <D.25386>:
      D.25387 = addr;
      return D.25387;
    }
  finally
    {
      context = {CLOBBER};
    }
}


mono_aot_trampoline (mgreg_t * regs, guint8 * code, guint8 * token_info, guint8 * tramp)
{
  unsigned int trampoline_calls.20;
  unsigned int trampoline_calls.21;
  struct MonoDomain * D.25392;
  _Bool D.25395;
  long int D.25396;
  long int D.25397;
  void * D.25400;
  struct MonoDomain * D.25401;
  _Bool D.25402;
  long int D.25403;
  long int D.25404;
  struct MonoImage * image;
  guint32 token;
  struct MonoMethod * method;
  void * addr;
  guint8 * plt_entry;

  method = 0B;
  trampoline_calls.20 = trampoline_calls;
  trampoline_calls.21 = trampoline_calls.20 + 1;
  trampoline_calls = trampoline_calls.21;
  image = MEM[(void * *)token_info];
  token_info = token_info + 4;
  token = MEM[(guint32 *)token_info];
  D.25392 = mono_domain_get ();
  addr = mono_aot_get_method_from_token (D.25392, image, token);
  if (addr == 0B) goto <D.25393>; else goto <D.25394>;
  <D.25393>:
  method = mono_get_method (image, token, 0B);
  D.25395 = method == 0B;
  D.25396 = (long int) D.25395;
  D.25397 = __builtin_expect (D.25396, 0);
  if (D.25397 != 0) goto <D.25398>; else goto <D.25399>;
  <D.25398>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 839, "method");
  <D.25399>:
  D.25400 = mono_magic_trampoline (regs, code, method, tramp);
  return D.25400;
  <D.25394>:
  D.25401 = mono_domain_get ();
  addr = mono_create_ftnptr (D.25401, addr);
  plt_entry = mono_aot_get_plt_entry (code);
  D.25402 = plt_entry == 0B;
  D.25403 = (long int) D.25402;
  D.25404 = __builtin_expect (D.25403, 0);
  if (D.25404 != 0) goto <D.25405>; else goto <D.25406>;
  <D.25405>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 849, "plt_entry");
  <D.25406>:
  mono_aot_patch_plt_entry (plt_entry, 0B, regs, addr);
  D.25400 = addr;
  return D.25400;
}


mono_aot_plt_trampoline (mgreg_t * regs, guint8 * code, guint8 * aot_module, guint8 * tramp)
{
  unsigned int trampoline_calls.22;
  unsigned int trampoline_calls.23;
  struct MonoLoaderError * D.25412;
  struct MonoLoaderError * D.25415;
  struct MonoException * D.25416;
  _Bool D.25417;
  long int D.25418;
  long int D.25419;
  void * D.25422;
  guint32 plt_info_offset;
  void * res;

  plt_info_offset = mono_aot_get_plt_info_offset (regs, code);
  trampoline_calls.22 = trampoline_calls;
  trampoline_calls.23 = trampoline_calls.22 + 1;
  trampoline_calls = trampoline_calls.23;
  res = mono_aot_plt_resolve (aot_module, plt_info_offset, code);
  if (res == 0B) goto <D.25410>; else goto <D.25411>;
  <D.25410>:
  D.25412 = mono_loader_get_last_error ();
  if (D.25412 != 0B) goto <D.25413>; else goto <D.25414>;
  <D.25413>:
  D.25415 = mono_loader_get_last_error ();
  D.25416 = mono_loader_error_prepare_exception (D.25415);
  mono_raise_exception (D.25416);
  <D.25414>:
  D.25417 = res == 0B;
  D.25418 = (long int) D.25417;
  D.25419 = __builtin_expect (D.25418, 0);
  if (D.25419 != 0) goto <D.25420>; else goto <D.25421>;
  <D.25420>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 875, "res");
  <D.25421>:
  <D.25411>:
  D.25422 = res;
  return D.25422;
}


mono_class_init_trampoline (mgreg_t * regs, guint8 * code, struct MonoVTable * vtable, guint8 * tramp)
{
  unsigned int trampoline_calls.24;
  unsigned int trampoline_calls.25;
  unsigned char D.25426;
  unsigned char D.25427;
  guint8 * plt_entry;

  plt_entry = mono_aot_get_plt_entry (code);
  trampoline_calls.24 = trampoline_calls;
  trampoline_calls.25 = trampoline_calls.24 + 1;
  trampoline_calls = trampoline_calls.25;
  mono_runtime_class_init (vtable);
  D.25426 = BIT_FIELD_REF <*vtable, 8, 184>;
  D.25427 = D.25426 & 2;
  if (D.25427 != 0) goto <D.25428>; else goto <D.25429>;
  <D.25428>:
  if (plt_entry != 0B) goto <D.25430>; else goto <D.25431>;
  <D.25430>:
  mono_arch_nullify_plt_entry (plt_entry, regs);
  goto <D.25432>;
  <D.25431>:
  mono_arch_nullify_class_init_trampoline (code, regs);
  <D.25432>:
  <D.25429>:
}


mono_generic_class_init_trampoline (mgreg_t * regs, guint8 * code, struct MonoVTable * vtable, guint8 * tramp)
{
  unsigned int trampoline_calls.26;
  unsigned int trampoline_calls.27;

  trampoline_calls.26 = trampoline_calls;
  trampoline_calls.27 = trampoline_calls.26 + 1;
  trampoline_calls = trampoline_calls.27;
  mono_runtime_class_init (vtable);
}


mono_monitor_enter_trampoline (mgreg_t * regs, guint8 * code, struct MonoObject * obj, guint8 * tramp)
{
  mono_monitor_enter (obj);
}


mono_monitor_exit_trampoline (mgreg_t * regs, guint8 * code, struct MonoObject * obj, guint8 * tramp)
{
  mono_monitor_exit (obj);
}


mono_delegate_trampoline (mgreg_t * regs, guint8 * code, void * * tramp_data, guint8 * tramp)
{
  unsigned int trampoline_calls.28;
  unsigned int trampoline_calls.29;
  struct MonoMethod * D.25437;
  struct MonoObject * D.25442;
  struct MonoVTable * D.25444;
  struct MonoClass * D.25445;
  struct MonoClass * D.25446;
  struct MonoRemoteClass * D.25448;
  struct MonoClass * D.25449;
  struct MonoClass * D.25450;
  unsigned char D.25453;
  unsigned char D.25454;
  unsigned char D.25459;
  unsigned char D.25460;
  struct MonoClass * D.25463;
  unsigned char D.25464;
  unsigned char D.25465;
  int mono_aot_only.30;
  void * D.25473;
  void * D.25474;
  int iftmp.31;
  short unsigned int D.25488;
  unsigned int D.25489;
  unsigned int D.25490;
  unsigned int D.25493;
  unsigned int D.25494;
  short unsigned int D.25499;
  int D.25500;
  int D.25501;
  int D.25506;
  _Bool D.25509;
  _Bool D.25510;
  _Bool D.25511;
  guint8 * * D.25517;
  guint8 * D.25519;
  void * D.25528;
  struct MonoMulticastDelegate * D.25529;
  _Bool D.25530;
  int D.25531;
  int D.25537;
  int D.25538;
  struct MonoMethodSignature * D.25540;
  short unsigned int D.25541;
  int D.25542;
  struct MonoMethodSignature * D.25543;
  short unsigned int D.25544;
  int D.25545;
  int D.25546;
  guint8 * iftmp.32;
  void * D.25554;
  void * D.25555;
  int D.25556;
  void * D.25557;
  struct MonoDomain * domain;
  struct MonoDelegate * delegate;
  struct MonoJitInfo * ji;
  struct MonoMethod * m;
  struct MonoMethod * method;
  gboolean multicast;
  gboolean callvirt;
  gboolean need_rgctx_tramp;
  gboolean need_unbox_tramp;
  gboolean enable_caching;
  struct MonoMethod * invoke;
  guint8 * impl_this;
  guint8 * impl_nothis;
  struct MonoError err;
  struct MonoMethodSignature * sig;
  void * addr;
  void * compiled_method;

  try
    {
      domain = mono_domain_get ();
      method = 0B;
      callvirt = 0;
      need_rgctx_tramp = 0;
      need_unbox_tramp = 0;
      enable_caching = 1;
      invoke = *tramp_data;
      impl_this = MEM[(void * *)tramp_data + 4B];
      impl_nothis = MEM[(void * *)tramp_data + 8B];
      trampoline_calls.28 = trampoline_calls;
      trampoline_calls.29 = trampoline_calls.28 + 1;
      trampoline_calls = trampoline_calls.29;
      delegate = mono_arch_get_this_arg_from_call (regs, code);
      D.25437 = delegate->method;
      if (D.25437 != 0B) goto <D.25438>; else goto <D.25439>;
      <D.25438>:
      method = delegate->method;
      D.25442 = delegate->target;
      if (D.25442 != 0B) goto <D.25443>; else goto <D.25440>;
      <D.25443>:
      D.25442 = delegate->target;
      D.25444 = D.25442->vtable;
      D.25445 = D.25444->klass;
      D.25446 = mono_defaults.transparent_proxy_class;
      if (D.25445 == D.25446) goto <D.25447>; else goto <D.25440>;
      <D.25447>:
      D.25442 = delegate->target;
      D.25448 = MEM[(struct MonoTransparentProxy *)D.25442].remote_class;
      D.25449 = D.25448->proxy_class;
      D.25450 = mono_class_get_com_object_class ();
      if (D.25449 != D.25450) goto <D.25451>; else goto <D.25452>;
      <D.25451>:
      D.25442 = delegate->target;
      D.25448 = MEM[(struct MonoTransparentProxy *)D.25442].remote_class;
      D.25449 = D.25448->proxy_class;
      D.25453 = BIT_FIELD_REF <*D.25449, 8, 184>;
      D.25454 = D.25453 & 64;
      if (D.25454 == 0) goto <D.25455>; else goto <D.25456>;
      <D.25455>:
      method = mono_marshal_get_remoting_invoke (method);
      <D.25456>:
      <D.25452>:
      goto <D.25441>;
      <D.25440>:
      mono_error_init (&err);
      sig = mono_method_signature_checked (method, &err);
      if (sig == 0B) goto <D.25457>; else goto <D.25458>;
      <D.25457>:
      mono_error_raise_exception (&err);
      <D.25458>:
      D.25459 = BIT_FIELD_REF <*sig, 8, 80>;
      D.25460 = D.25459 & 64;
      if (D.25460 != 0) goto <D.25461>; else goto <D.25462>;
      <D.25461>:
      D.25463 = method->klass;
      D.25464 = BIT_FIELD_REF <*D.25463, 8, 160>;
      D.25465 = D.25464 & 8;
      if (D.25465 != 0) goto <D.25466>; else goto <D.25467>;
      <D.25466>:
      mono_aot_only.30 = mono_aot_only;
      if (mono_aot_only.30 != 0) goto <D.25469>; else goto <D.25470>;
      <D.25469>:
      need_unbox_tramp = 1;
      goto <D.25471>;
      <D.25470>:
      method = mono_marshal_get_unbox_wrapper (method);
      <D.25471>:
      <D.25467>:
      <D.25462>:
      <D.25441>:
      goto <D.25472>;
      <D.25439>:
      D.25473 = delegate->method_ptr;
      D.25474 = mono_get_addr_from_ftnptr (D.25473);
      ji = mono_jit_info_table_find (domain, D.25474);
      if (ji != 0B) goto <D.25475>; else goto <D.25476>;
      <D.25475>:
      method = jinfo_get_method (ji);
      <D.25476>:
      <D.25472>:
      if (method != 0B) goto <D.25477>; else goto <D.25478>;
      <D.25477>:
      mono_error_init (&err);
      sig = mono_method_signature_checked (method, &err);
      if (sig == 0B) goto <D.25479>; else goto <D.25480>;
      <D.25479>:
      mono_error_raise_exception (&err);
      <D.25480>:
      D.25442 = delegate->target;
      if (D.25442 == 0B) goto <D.25484>; else goto <D.25482>;
      <D.25484>:
      D.25459 = BIT_FIELD_REF <*sig, 8, 80>;
      D.25460 = D.25459 & 64;
      if (D.25460 != 0) goto <D.25485>; else goto <D.25482>;
      <D.25485>:
      iftmp.31 = 1;
      goto <D.25483>;
      <D.25482>:
      iftmp.31 = 0;
      <D.25483>:
      callvirt = iftmp.31;
      D.25442 = delegate->target;
      if (D.25442 != 0B) goto <D.25486>; else goto <D.25487>;
      <D.25486>:
      D.25488 = method->flags;
      D.25489 = (unsigned int) D.25488;
      D.25490 = D.25489 & 1088;
      if (D.25490 == 1088) goto <D.25491>; else goto <D.25492>;
      <D.25491>:
      D.25463 = method->klass;
      D.25493 = D.25463->flags;
      D.25494 = D.25493 & 128;
      if (D.25494 != 0) goto <D.25495>; else goto <D.25496>;
      <D.25495>:
      D.25442 = delegate->target;
      method = mono_object_get_virtual_method (D.25442, method);
      enable_caching = 0;
      <D.25496>:
      <D.25492>:
      <D.25487>:
      <D.25478>:
      if (method != 0B) goto <D.25497>; else goto <D.25498>;
      <D.25497>:
      D.25499 = method->iflags;
      D.25500 = (int) D.25499;
      D.25501 = D.25500 & 32;
      if (D.25501 != 0) goto <D.25502>; else goto <D.25503>;
      <D.25502>:
      method = mono_marshal_get_synchronized_wrapper (method);
      <D.25503>:
      <D.25498>:
      if (method != 0B) goto <D.25504>; else goto <D.25505>;
      <D.25504>:
      D.25506 = mono_method_needs_static_rgctx_invoke (method, 0);
      if (D.25506 != 0) goto <D.25507>; else goto <D.25508>;
      <D.25507>:
      need_rgctx_tramp = 1;
      <D.25508>:
      <D.25505>:
      D.25509 = method != 0B;
      D.25510 = callvirt == 0;
      D.25511 = D.25509 & D.25510;
      if (D.25511 != 0) goto <D.25512>; else goto <D.25513>;
      <D.25512>:
      if (enable_caching != 0) goto <D.25516>; else goto <D.25514>;
      <D.25516>:
      D.25517 = delegate->method_code;
      if (D.25517 != 0B) goto <D.25518>; else goto <D.25514>;
      <D.25518>:
      D.25517 = delegate->method_code;
      D.25519 = *D.25517;
      if (D.25519 != 0B) goto <D.25520>; else goto <D.25514>;
      <D.25520>:
      D.25517 = delegate->method_code;
      D.25519 = *D.25517;
      delegate->method_ptr = D.25519;
      goto <D.25515>;
      <D.25514>:
      addr = mono_compile_method (method);
      compiled_method = addr;
      addr = mini_add_method_trampoline (0B, method, compiled_method, need_rgctx_tramp, need_unbox_tramp);
      delegate->method_ptr = addr;
      if (enable_caching != 0) goto <D.25521>; else goto <D.25522>;
      <D.25521>:
      D.25517 = delegate->method_code;
      if (D.25517 != 0B) goto <D.25523>; else goto <D.25524>;
      <D.25523>:
      D.25517 = delegate->method_code;
      D.25473 = delegate->method_ptr;
      *D.25517 = D.25473;
      <D.25524>:
      <D.25522>:
      <D.25515>:
      goto <D.25525>;
      <D.25513>:
      if (need_rgctx_tramp != 0) goto <D.25526>; else goto <D.25527>;
      <D.25526>:
      D.25473 = delegate->method_ptr;
      D.25528 = mono_create_static_rgctx_trampoline (method, D.25473);
      delegate->method_ptr = D.25528;
      <D.25527>:
      <D.25525>:
      D.25529 = MEM[(struct MonoMulticastDelegate *)delegate].prev;
      D.25530 = D.25529 != 0B;
      multicast = (gboolean) D.25530;
      D.25531 = multicast | callvirt;
      if (D.25531 == 0) goto <D.25532>; else goto <D.25533>;
      <D.25532>:
      if (method != 0B) goto <D.25536>; else goto <D.25534>;
      <D.25536>:
      D.25488 = method->flags;
      D.25537 = (int) D.25488;
      D.25538 = D.25537 & 16;
      if (D.25538 != 0) goto <D.25539>; else goto <D.25534>;
      <D.25539>:
      D.25540 = mono_method_signature (method);
      D.25541 = D.25540->param_count;
      D.25542 = (int) D.25541;
      D.25543 = mono_method_signature (invoke);
      D.25544 = D.25543->param_count;
      D.25545 = (int) D.25544;
      D.25546 = D.25545 + 1;
      if (D.25542 == D.25546) goto <D.25547>; else goto <D.25534>;
      <D.25547>:
      code = impl_this;
      goto <D.25535>;
      <D.25534>:
      D.25442 = delegate->target;
      if (D.25442 != 0B) goto <D.25549>; else goto <D.25550>;
      <D.25549>:
      iftmp.32 = impl_this;
      goto <D.25551>;
      <D.25550>:
      iftmp.32 = impl_nothis;
      <D.25551>:
      code = iftmp.32;
      <D.25535>:
      if (code != 0B) goto <D.25552>; else goto <D.25553>;
      <D.25552>:
      D.25554 = mono_get_addr_from_ftnptr (code);
      delegate->invoke_impl = D.25554;
      D.25555 = code;
      return D.25555;
      <D.25553>:
      <D.25533>:
      m = mono_marshal_get_delegate_invoke (invoke, delegate);
      code = mono_compile_method (m);
      D.25556 = mono_method_needs_static_rgctx_invoke (m, 0);
      code = mini_add_method_trampoline (0B, m, code, D.25556, 0);
      D.25557 = mono_get_addr_from_ftnptr (code);
      delegate->invoke_impl = D.25557;
      D.25555 = code;
      return D.25555;
    }
  finally
    {
      err = {CLOBBER};
    }
}


mono_get_trampoline_func (MonoTrampolineType tramp_type)
{
  const void * D.25560;

  switch (tramp_type) <default: <D.24673>, case 0: <D.24660>, case 1: <D.24661>, case 2: <D.24662>, case 3: <D.24663>, case 4: <D.24664>, case 5: <D.24665>, case 6: <D.24666>, case 7: <D.24667>, case 8: <D.24668>, case 9: <D.24669>, case 10: <D.24670>, case 11: <D.24671>, case 12: <D.24672>>
  <D.24660>:
  <D.24661>:
  D.25560 = mono_magic_trampoline;
  return D.25560;
  <D.24662>:
  D.25560 = mono_class_init_trampoline;
  return D.25560;
  <D.24663>:
  D.25560 = mono_generic_class_init_trampoline;
  return D.25560;
  <D.24664>:
  D.25560 = mono_rgctx_lazy_fetch_trampoline;
  return D.25560;
  <D.24665>:
  D.25560 = mono_aot_trampoline;
  return D.25560;
  <D.24666>:
  D.25560 = mono_aot_plt_trampoline;
  return D.25560;
  <D.24667>:
  D.25560 = mono_delegate_trampoline;
  return D.25560;
  <D.24668>:
  D.25560 = mono_altstack_restore_prot;
  return D.25560;
  <D.24669>:
  D.25560 = mono_generic_virtual_remoting_trampoline;
  return D.25560;
  <D.24670>:
  D.25560 = mono_monitor_enter_trampoline;
  return D.25560;
  <D.24671>:
  D.25560 = mono_monitor_exit_trampoline;
  return D.25560;
  <D.24672>:
  D.25560 = mono_vcall_trampoline;
  return D.25560;
  <D.24673>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "mini-trampolines.c", 1200);
  D.25560 = 0B;
  return D.25560;
}


mono_vcall_trampoline (mgreg_t * regs, guint8 * code, int slot, guint8 * tramp)
{
  unsigned int trampoline_calls.33;
  unsigned int trampoline_calls.34;
  _Bool D.25564;
  long int D.25565;
  long int D.25566;
  struct MonoDomain * D.25571;
  struct MonoClass * D.25574;
  unsigned char D.25575;
  unsigned char D.25576;
  struct MonoDomain * D.25579;
  int D.25580;
  void * D.25583;
  struct MonoDomain * D.25584;
  unsigned int slot.35;
  unsigned int D.25587;
  struct MonoObject * this;
  struct MonoVTable * vt;
  void * * vtable_slot;
  struct MonoMethod * m;
  gboolean need_rgctx_tramp;
  void * addr;

  need_rgctx_tramp = 0;
  trampoline_calls.33 = trampoline_calls;
  trampoline_calls.34 = trampoline_calls.33 + 1;
  trampoline_calls = trampoline_calls.34;
  this = mono_arch_get_this_arg_from_call (regs, code);
  D.25564 = this == 0B;
  D.25565 = (long int) D.25564;
  D.25566 = __builtin_expect (D.25565, 0);
  if (D.25566 != 0) goto <D.25567>; else goto <D.25568>;
  <D.25567>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 732, "this");
  <D.25568>:
  vt = this->vtable;
  if (slot >= 0) goto <D.25569>; else goto <D.25570>;
  <D.25569>:
  vtable_slot = &vt->vtable[slot];
  D.25571 = mono_domain_get ();
  addr = mono_aot_get_method_from_vt_slot (D.25571, vt, slot);
  if (addr != 0B) goto <D.25572>; else goto <D.25573>;
  <D.25572>:
  D.25574 = vt->klass;
  D.25575 = BIT_FIELD_REF <*D.25574, 8, 160>;
  D.25576 = D.25575 & 8;
  if (D.25576 == 0) goto <D.25577>; else goto <D.25578>;
  <D.25577>:
  D.25579 = mono_domain_get ();
  D.25580 = mono_domain_owns_vtable_slot (D.25579, vtable_slot);
  if (D.25580 != 0) goto <D.25581>; else goto <D.25582>;
  <D.25581>:
  *vtable_slot = addr;
  <D.25582>:
  D.25584 = mono_domain_get ();
  D.25583 = mono_create_ftnptr (D.25584, addr);
  return D.25583;
  <D.25578>:
  <D.25573>:
  D.25574 = vt->klass;
  m = mono_class_get_vtable_entry (D.25574, slot);
  need_rgctx_tramp = mono_method_needs_static_rgctx_invoke (m, 0);
  goto <D.25585>;
  <D.25570>:
  slot.35 = (unsigned int) slot;
  D.25587 = slot.35 * 4;
  vtable_slot = vt + D.25587;
  m = 0B;
  need_rgctx_tramp = 0;
  <D.25585>:
  D.25583 = common_call_trampoline (regs, code, m, tramp, vt, vtable_slot, need_rgctx_tramp);
  return D.25583;
}


mono_rgctx_lazy_fetch_trampoline (mgreg_t * regs, guint8 * code, void * data, guint8 * tramp)
{
  int D.25589;
  signed int slot.36;
  _Bool D.25591;
  unsigned int trampoline_calls.37;
  unsigned int trampoline_calls.38;
  int inited.39;
  int num_lookups.40;
  int num_lookups.41;
  void * D.25601;
  static gboolean inited = 0;
  static int num_lookups = 0;
  guint32 slot;
  mgreg_t * r;
  void * arg;
  guint32 index;
  gboolean mrgctx;

  slot = (guint32) data;
  r = regs;
  D.25589 = *r;
  arg = (void *) D.25589;
  index = slot & 2147483647;
  slot.36 = (signed int) slot;
  D.25591 = slot.36 < 0;
  mrgctx = (gboolean) D.25591;
  trampoline_calls.37 = trampoline_calls;
  trampoline_calls.38 = trampoline_calls.37 + 1;
  trampoline_calls = trampoline_calls.38;
  inited.39 = inited;
  if (inited.39 == 0) goto <D.25595>; else goto <D.25596>;
  <D.25595>:
  mono_counters_register ("RGCTX unmanaged lookups", 2048, &num_lookups);
  inited = 1;
  <D.25596>:
  num_lookups.40 = num_lookups;
  num_lookups.41 = num_lookups.40 + 1;
  num_lookups = num_lookups.41;
  if (mrgctx != 0) goto <D.25599>; else goto <D.25600>;
  <D.25599>:
  D.25601 = mono_method_fill_runtime_generic_context (arg, code, index);
  return D.25601;
  <D.25600>:
  D.25601 = mono_class_fill_runtime_generic_context (arg, code, index);
  return D.25601;
}


mono_trampolines_init ()
{
  int mono_aot_only.42;
  guchar * D.25606;
  guchar * D.25607;
  guchar * D.25608;
  guchar * D.25609;
  guchar * D.25610;
  guchar * D.25611;
  guchar * D.25612;
  guchar * D.25613;
  guchar * D.25614;
  guchar * D.25615;
  guchar * D.25616;
  guchar * D.25617;
  guchar * D.25618;

  InitializeCriticalSection (&trampolines_mutex);
  mono_aot_only.42 = mono_aot_only;
  if (mono_aot_only.42 != 0) goto <D.25604>; else goto <D.25605>;
  <D.25604>:
  return;
  <D.25605>:
  D.25606 = create_trampoline_code (0);
  mono_trampoline_code[0] = D.25606;
  D.25607 = create_trampoline_code (1);
  mono_trampoline_code[1] = D.25607;
  D.25608 = create_trampoline_code (2);
  mono_trampoline_code[2] = D.25608;
  D.25609 = create_trampoline_code (3);
  mono_trampoline_code[3] = D.25609;
  D.25610 = create_trampoline_code (4);
  mono_trampoline_code[4] = D.25610;
  D.25611 = create_trampoline_code (5);
  mono_trampoline_code[5] = D.25611;
  D.25612 = create_trampoline_code (6);
  mono_trampoline_code[6] = D.25612;
  D.25613 = create_trampoline_code (7);
  mono_trampoline_code[7] = D.25613;
  D.25614 = create_trampoline_code (8);
  mono_trampoline_code[8] = D.25614;
  D.25615 = create_trampoline_code (9);
  mono_trampoline_code[9] = D.25615;
  D.25616 = create_trampoline_code (10);
  mono_trampoline_code[10] = D.25616;
  D.25617 = create_trampoline_code (11);
  mono_trampoline_code[11] = D.25617;
  D.25618 = create_trampoline_code (12);
  mono_trampoline_code[12] = D.25618;
  mono_counters_register ("Calls to trampolines", 256, &trampoline_calls);
  mono_counters_register ("JIT trampolines", 256, &jit_trampolines);
  mono_counters_register ("Unbox trampolines", 256, &unbox_trampolines);
  mono_counters_register ("Static rgctx trampolines", 256, &static_rgctx_trampolines);
}


create_trampoline_code (MonoTrampolineType tramp_type)
{
  struct MonoTrampInfo * info.43;
  guchar * D.25621;
  struct MonoTrampInfo * info;
  guchar * code;

  try
    {
      code = mono_arch_create_generic_trampoline (tramp_type, &info, 0);
      info.43 = info;
      mono_tramp_info_register (info.43);
      D.25621 = code;
      return D.25621;
    }
  finally
    {
      info = {CLOBBER};
    }
}


mono_trampolines_cleanup ()
{
  struct GHashTable * class_init_hash_addr.44;
  struct GHashTable * rgctx_lazy_fetch_trampoline_hash.45;
  struct GHashTable * rgctx_lazy_fetch_trampoline_hash_addr.46;

  class_init_hash_addr.44 = class_init_hash_addr;
  if (class_init_hash_addr.44 != 0B) goto <D.25625>; else goto <D.25626>;
  <D.25625>:
  class_init_hash_addr.44 = class_init_hash_addr;
  monoeg_g_hash_table_destroy (class_init_hash_addr.44);
  <D.25626>:
  rgctx_lazy_fetch_trampoline_hash.45 = rgctx_lazy_fetch_trampoline_hash;
  if (rgctx_lazy_fetch_trampoline_hash.45 != 0B) goto <D.25628>; else goto <D.25629>;
  <D.25628>:
  rgctx_lazy_fetch_trampoline_hash.45 = rgctx_lazy_fetch_trampoline_hash;
  monoeg_g_hash_table_destroy (rgctx_lazy_fetch_trampoline_hash.45);
  <D.25629>:
  rgctx_lazy_fetch_trampoline_hash_addr.46 = rgctx_lazy_fetch_trampoline_hash_addr;
  if (rgctx_lazy_fetch_trampoline_hash_addr.46 != 0B) goto <D.25631>; else goto <D.25632>;
  <D.25631>:
  rgctx_lazy_fetch_trampoline_hash_addr.46 = rgctx_lazy_fetch_trampoline_hash_addr;
  monoeg_g_hash_table_destroy (rgctx_lazy_fetch_trampoline_hash_addr.46);
  <D.25632>:
  DeleteCriticalSection (&trampolines_mutex);
}


mono_get_trampoline_code (MonoTrampolineType tramp_type)
{
  guint8 * D.25633;
  _Bool D.25634;
  long int D.25635;
  long int D.25636;
  guint8 * D.25639;

  D.25633 = mono_trampoline_code[tramp_type];
  D.25634 = D.25633 == 0B;
  D.25635 = (long int) D.25634;
  D.25636 = __builtin_expect (D.25635, 0);
  if (D.25636 != 0) goto <D.25637>; else goto <D.25638>;
  <D.25637>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1271, "mono_trampoline_code [tramp_type]");
  <D.25638>:
  D.25639 = mono_trampoline_code[tramp_type];
  return D.25639;
}


mono_create_specific_trampoline (void * arg1, MonoTrampolineType tramp_type, struct MonoDomain * domain, guint32 * code_len)
{
  int mono_aot_only.47;
  void * D.25644;
  struct MonoImage * D.25645;

  mono_aot_only.47 = mono_aot_only;
  if (mono_aot_only.47 != 0) goto <D.25642>; else goto <D.25643>;
  <D.25642>:
  D.25645 = mono_defaults.corlib;
  D.25644 = mono_aot_create_specific_trampoline (D.25645, arg1, tramp_type, domain, code_len);
  return D.25644;
  <D.25643>:
  D.25644 = mono_arch_create_specific_trampoline (arg1, tramp_type, domain, code_len);
  return D.25644;
}


mono_create_class_init_trampoline (struct MonoVTable * vtable)
{
  struct MonoClass * D.25647;
  struct MonoGenericContainer * D.25648;
  _Bool D.25649;
  long int D.25650;
  long int D.25651;
  union mono_mutex_t * D.25654;
  _Bool D.25657;
  long int D.25658;
  long int D.25659;
  void * D.25662;
  struct GHashTable * D.25663;
  _Bool D.25666;
  long int D.25667;
  long int D.25668;
  void * D.25673;
  _Bool D.25676;
  long int D.25677;
  long int D.25678;
  _Bool D.25683;
  long int D.25684;
  long int D.25685;
  _Bool D.25690;
  long int D.25691;
  long int D.25692;
  struct GHashTable * class_init_hash_addr.48;
  struct GHashTable * class_init_hash_addr.49;
  _Bool D.25701;
  long int D.25702;
  long int D.25703;
  void * code;
  void * ptr;
  struct MonoDomain * domain;

  domain = vtable->domain;
  D.25647 = vtable->klass;
  D.25648 = D.25647->generic_container;
  D.25649 = D.25648 != 0B;
  D.25650 = (long int) D.25649;
  D.25651 = __builtin_expect (D.25650, 0);
  if (D.25651 != 0) goto <D.25652>; else goto <D.25653>;
  <D.25652>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1291, "!vtable->klass->generic_container");
  <D.25653>:
  {
    int ret;

    D.25654 = &domain->lock.mutex;
    ret = pthread_mutex_lock (D.25654);
    if (ret != 0) goto <D.25655>; else goto <D.25656>;
    <D.25655>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
    <D.25656>:
    D.25657 = ret != 0;
    D.25658 = (long int) D.25657;
    D.25659 = __builtin_expect (D.25658, 0);
    if (D.25659 != 0) goto <D.25660>; else goto <D.25661>;
    <D.25660>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1294, "ret == 0");
    <D.25661>:
  }
  D.25662 = domain->runtime_info;
  D.25663 = MEM[(struct MonoJitDomainInfo *)D.25662].class_init_trampoline_hash;
  ptr = monoeg_g_hash_table_lookup (D.25663, vtable);
  {
    int ret;

    D.25654 = &domain->lock.mutex;
    ret = pthread_mutex_unlock (D.25654);
    if (ret != 0) goto <D.25664>; else goto <D.25665>;
    <D.25664>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
    <D.25665>:
    D.25666 = ret != 0;
    D.25667 = (long int) D.25666;
    D.25668 = __builtin_expect (D.25667, 0);
    if (D.25668 != 0) goto <D.25669>; else goto <D.25670>;
    <D.25669>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1298, "ret == 0");
    <D.25670>:
  }
  if (ptr != 0B) goto <D.25671>; else goto <D.25672>;
  <D.25671>:
  D.25673 = ptr;
  return D.25673;
  <D.25672>:
  code = mono_create_specific_trampoline (vtable, 2, domain, 0B);
  ptr = mono_create_ftnptr (domain, code);
  {
    int ret;

    D.25654 = &domain->lock.mutex;
    ret = pthread_mutex_lock (D.25654);
    if (ret != 0) goto <D.25674>; else goto <D.25675>;
    <D.25674>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
    <D.25675>:
    D.25676 = ret != 0;
    D.25677 = (long int) D.25676;
    D.25678 = __builtin_expect (D.25677, 0);
    if (D.25678 != 0) goto <D.25679>; else goto <D.25680>;
    <D.25679>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1307, "ret == 0");
    <D.25680>:
  }
  D.25662 = domain->runtime_info;
  D.25663 = MEM[(struct MonoJitDomainInfo *)D.25662].class_init_trampoline_hash;
  monoeg_g_hash_table_insert_replace (D.25663, vtable, ptr, 0);
  {
    int ret;

    D.25654 = &domain->lock.mutex;
    ret = pthread_mutex_unlock (D.25654);
    if (ret != 0) goto <D.25681>; else goto <D.25682>;
    <D.25681>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
    <D.25682>:
    D.25683 = ret != 0;
    D.25684 = (long int) D.25683;
    D.25685 = __builtin_expect (D.25684, 0);
    if (D.25685 != 0) goto <D.25686>; else goto <D.25687>;
    <D.25686>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1310, "ret == 0");
    <D.25687>:
  }
  {
    int ret;

    ret = pthread_mutex_lock (&trampolines_mutex.mutex);
    if (ret != 0) goto <D.25688>; else goto <D.25689>;
    <D.25688>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
    <D.25689>:
    D.25690 = ret != 0;
    D.25691 = (long int) D.25690;
    D.25692 = __builtin_expect (D.25691, 0);
    if (D.25692 != 0) goto <D.25693>; else goto <D.25694>;
    <D.25693>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1312, "ret == 0");
    <D.25694>:
  }
  class_init_hash_addr.48 = class_init_hash_addr;
  if (class_init_hash_addr.48 == 0B) goto <D.25696>; else goto <D.25697>;
  <D.25696>:
  class_init_hash_addr.49 = monoeg_g_hash_table_new (0B, 0B);
  class_init_hash_addr = class_init_hash_addr.49;
  <D.25697>:
  class_init_hash_addr.48 = class_init_hash_addr;
  monoeg_g_hash_table_insert_replace (class_init_hash_addr.48, ptr, vtable, 0);
  {
    int ret;

    ret = pthread_mutex_unlock (&trampolines_mutex.mutex);
    if (ret != 0) goto <D.25699>; else goto <D.25700>;
    <D.25699>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
    <D.25700>:
    D.25701 = ret != 0;
    D.25702 = (long int) D.25701;
    D.25703 = __builtin_expect (D.25702, 0);
    if (D.25703 != 0) goto <D.25704>; else goto <D.25705>;
    <D.25704>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1316, "ret == 0");
    <D.25705>:
  }
  D.25673 = ptr;
  return D.25673;
}


mono_create_generic_class_init_trampoline ()
{
  _Bool D.25709;
  long int D.25710;
  long int D.25711;
  void * code.50;
  int mono_aot_only.51;
  void * D.25720;
  void * code.52;
  void * code.53;
  struct MonoTrampInfo * info.54;
  _Bool D.25727;
  long int D.25728;
  long int D.25729;
  void * D.25732;
  static void * code;
  struct MonoTrampInfo * info;

  try
    {
      {
        int ret;

        ret = pthread_mutex_lock (&trampolines_mutex.mutex);
        if (ret != 0) goto <D.25707>; else goto <D.25708>;
        <D.25707>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
        <D.25708>:
        D.25709 = ret != 0;
        D.25710 = (long int) D.25709;
        D.25711 = __builtin_expect (D.25710, 0);
        if (D.25711 != 0) goto <D.25712>; else goto <D.25713>;
        <D.25712>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1328, "ret == 0");
        <D.25713>:
      }
      code.50 = code;
      if (code.50 == 0B) goto <D.25715>; else goto <D.25716>;
      <D.25715>:
      mono_aot_only.51 = mono_aot_only;
      if (mono_aot_only.51 != 0) goto <D.25718>; else goto <D.25719>;
      <D.25718>:
      D.25720 = mono_aot_get_trampoline ("generic_class_init_trampoline");
      code.52 = mono_get_addr_from_ftnptr (D.25720);
      code = code.52;
      goto <D.25722>;
      <D.25719>:
      code.53 = mono_arch_create_generic_class_init_trampoline (&info, 0);
      code = code.53;
      info.54 = info;
      mono_tramp_info_register (info.54);
      <D.25722>:
      <D.25716>:
      {
        int ret;

        ret = pthread_mutex_unlock (&trampolines_mutex.mutex);
        if (ret != 0) goto <D.25725>; else goto <D.25726>;
        <D.25725>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
        <D.25726>:
        D.25727 = ret != 0;
        D.25728 = (long int) D.25727;
        D.25729 = __builtin_expect (D.25728, 0);
        if (D.25729 != 0) goto <D.25730>; else goto <D.25731>;
        <D.25730>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1340, "ret == 0");
        <D.25731>:
      }
      D.25732 = code;
      return D.25732;
    }
  finally
    {
      info = {CLOBBER};
    }
}


mono_create_jump_trampoline (struct MonoDomain * domain, struct MonoMethod * method, gboolean add_sync_wrapper)
{
  struct MonoJitInfo * ji.55;
  unsigned char D.25738;
  unsigned char D.25739;
  short unsigned int D.25742;
  int D.25743;
  int D.25744;
  void * D.25747;
  union mono_mutex_t * D.25748;
  _Bool D.25751;
  long int D.25752;
  long int D.25753;
  void * D.25756;
  struct GHashTable * D.25757;
  _Bool D.25760;
  long int D.25761;
  long int D.25762;
  struct MonoDomain * D.25767;
  unsigned int code_size.56;
  _Bool D.25769;
  long int D.25770;
  long int D.25771;
  void * ji.57;
  int code_size.58;
  _Bool D.25778;
  long int D.25779;
  long int D.25780;
  void * D.25783;
  _Bool D.25786;
  long int D.25787;
  long int D.25788;
  struct MonoJitInfo * ji;
  void * code;
  guint32 code_size;

  try
    {
      code_size = 0;
      code = mono_jit_find_compiled_method_with_jit_info (domain, method, &ji);
      if (code != 0B) goto <D.25735>; else goto <D.25736>;
      <D.25735>:
      ji.55 = ji;
      D.25738 = BIT_FIELD_REF <*ji.55, 8, 176>;
      D.25739 = D.25738 & 2;
      if (D.25739 == 0) goto <D.25740>; else goto <D.25741>;
      <D.25740>:
      D.25742 = method->iflags;
      D.25743 = (int) D.25742;
      D.25744 = D.25743 & 32;
      if (D.25744 == 0) goto <D.25745>; else goto <D.25746>;
      <D.25745>:
      D.25747 = code;
      return D.25747;
      <D.25746>:
      <D.25741>:
      <D.25736>:
      {
        int ret;

        D.25748 = &domain->lock.mutex;
        ret = pthread_mutex_lock (D.25748);
        if (ret != 0) goto <D.25749>; else goto <D.25750>;
        <D.25749>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
        <D.25750>:
        D.25751 = ret != 0;
        D.25752 = (long int) D.25751;
        D.25753 = __builtin_expect (D.25752, 0);
        if (D.25753 != 0) goto <D.25754>; else goto <D.25755>;
        <D.25754>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1365, "ret == 0");
        <D.25755>:
      }
      D.25756 = domain->runtime_info;
      D.25757 = MEM[(struct MonoJitDomainInfo *)D.25756].jump_trampoline_hash;
      code = monoeg_g_hash_table_lookup (D.25757, method);
      {
        int ret;

        D.25748 = &domain->lock.mutex;
        ret = pthread_mutex_unlock (D.25748);
        if (ret != 0) goto <D.25758>; else goto <D.25759>;
        <D.25758>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
        <D.25759>:
        D.25760 = ret != 0;
        D.25761 = (long int) D.25760;
        D.25762 = __builtin_expect (D.25761, 0);
        if (D.25762 != 0) goto <D.25763>; else goto <D.25764>;
        <D.25763>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1367, "ret == 0");
        <D.25764>:
      }
      if (code != 0B) goto <D.25765>; else goto <D.25766>;
      <D.25765>:
      D.25747 = code;
      return D.25747;
      <D.25766>:
      D.25767 = mono_domain_get ();
      code = mono_create_specific_trampoline (method, 1, D.25767, &code_size);
      code_size.56 = code_size;
      D.25769 = code_size.56 == 0;
      D.25770 = (long int) D.25769;
      D.25771 = __builtin_expect (D.25770, 0);
      if (D.25771 != 0) goto <D.25772>; else goto <D.25773>;
      <D.25772>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1372, "code_size");
      <D.25773>:
      ji.57 = mono_domain_alloc0 (domain, 28);
      ji = ji.57;
      ji.55 = ji;
      ji.55->code_start = code;
      ji.55 = ji;
      code_size.56 = code_size;
      code_size.58 = (int) code_size.56;
      ji.55->code_size = code_size.58;
      ji.55 = ji;
      ji.55->d.method = method;
      ji.55 = ji;
      mono_jit_info_table_add (domain, ji.55);
      {
        int ret;

        D.25748 = &domain->lock.mutex;
        ret = pthread_mutex_lock (D.25748);
        if (ret != 0) goto <D.25776>; else goto <D.25777>;
        <D.25776>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
        <D.25777>:
        D.25778 = ret != 0;
        D.25779 = (long int) D.25778;
        D.25780 = __builtin_expect (D.25779, 0);
        if (D.25780 != 0) goto <D.25781>; else goto <D.25782>;
        <D.25781>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1386, "ret == 0");
        <D.25782>:
      }
      D.25756 = domain->runtime_info;
      D.25757 = MEM[(struct MonoJitDomainInfo *)D.25756].jump_trampoline_hash;
      ji.55 = ji;
      D.25783 = ji.55->code_start;
      monoeg_g_hash_table_insert_replace (D.25757, method, D.25783, 0);
      {
        int ret;

        D.25748 = &domain->lock.mutex;
        ret = pthread_mutex_unlock (D.25748);
        if (ret != 0) goto <D.25784>; else goto <D.25785>;
        <D.25784>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
        <D.25785>:
        D.25786 = ret != 0;
        D.25787 = (long int) D.25786;
        D.25788 = __builtin_expect (D.25787, 0);
        if (D.25788 != 0) goto <D.25789>; else goto <D.25790>;
        <D.25789>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1388, "ret == 0");
        <D.25790>:
      }
      ji.55 = ji;
      D.25747 = ji.55->code_start;
      return D.25747;
    }
  finally
    {
      ji = {CLOBBER};
      code_size = {CLOBBER};
    }
}


mono_create_jit_trampoline_in_domain (struct MonoDomain * domain, struct MonoMethod * method)
{
  int mono_aot_only.59;
  void * D.25798;
  union mono_mutex_t * D.25799;
  _Bool D.25802;
  long int D.25803;
  long int D.25804;
  void * D.25807;
  struct GHashTable * D.25808;
  _Bool D.25811;
  long int D.25812;
  long int D.25813;
  _Bool D.25820;
  long int D.25821;
  long int D.25822;
  _Bool D.25827;
  long int D.25828;
  long int D.25829;
  unsigned int jit_trampolines.60;
  unsigned int jit_trampolines.61;
  void * tramp;

  mono_aot_only.59 = mono_aot_only;
  if (mono_aot_only.59 != 0) goto <D.25794>; else goto <D.25795>;
  <D.25794>:
  {
    void * code;

    code = mono_jit_find_compiled_method (domain, method);
    if (code != 0B) goto <D.25796>; else goto <D.25797>;
    <D.25796>:
    D.25798 = code;
    return D.25798;
    <D.25797>:
  }
  <D.25795>:
  {
    int ret;

    D.25799 = &domain->lock.mutex;
    ret = pthread_mutex_lock (D.25799);
    if (ret != 0) goto <D.25800>; else goto <D.25801>;
    <D.25800>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
    <D.25801>:
    D.25802 = ret != 0;
    D.25803 = (long int) D.25802;
    D.25804 = __builtin_expect (D.25803, 0);
    if (D.25804 != 0) goto <D.25805>; else goto <D.25806>;
    <D.25805>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1406, "ret == 0");
    <D.25806>:
  }
  D.25807 = domain->runtime_info;
  D.25808 = MEM[(struct MonoJitDomainInfo *)D.25807].jit_trampoline_hash;
  tramp = monoeg_g_hash_table_lookup (D.25808, method);
  {
    int ret;

    D.25799 = &domain->lock.mutex;
    ret = pthread_mutex_unlock (D.25799);
    if (ret != 0) goto <D.25809>; else goto <D.25810>;
    <D.25809>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
    <D.25810>:
    D.25811 = ret != 0;
    D.25812 = (long int) D.25811;
    D.25813 = __builtin_expect (D.25812, 0);
    if (D.25813 != 0) goto <D.25814>; else goto <D.25815>;
    <D.25814>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1408, "ret == 0");
    <D.25815>:
  }
  if (tramp != 0B) goto <D.25816>; else goto <D.25817>;
  <D.25816>:
  D.25798 = tramp;
  return D.25798;
  <D.25817>:
  tramp = mono_create_specific_trampoline (method, 0, domain, 0B);
  {
    int ret;

    D.25799 = &domain->lock.mutex;
    ret = pthread_mutex_lock (D.25799);
    if (ret != 0) goto <D.25818>; else goto <D.25819>;
    <D.25818>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
    <D.25819>:
    D.25820 = ret != 0;
    D.25821 = (long int) D.25820;
    D.25822 = __builtin_expect (D.25821, 0);
    if (D.25822 != 0) goto <D.25823>; else goto <D.25824>;
    <D.25823>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1414, "ret == 0");
    <D.25824>:
  }
  D.25807 = domain->runtime_info;
  D.25808 = MEM[(struct MonoJitDomainInfo *)D.25807].jit_trampoline_hash;
  monoeg_g_hash_table_insert_replace (D.25808, method, tramp, 0);
  {
    int ret;

    D.25799 = &domain->lock.mutex;
    ret = pthread_mutex_unlock (D.25799);
    if (ret != 0) goto <D.25825>; else goto <D.25826>;
    <D.25825>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
    <D.25826>:
    D.25827 = ret != 0;
    D.25828 = (long int) D.25827;
    D.25829 = __builtin_expect (D.25828, 0);
    if (D.25829 != 0) goto <D.25830>; else goto <D.25831>;
    <D.25830>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1416, "ret == 0");
    <D.25831>:
  }
  jit_trampolines.60 = jit_trampolines;
  jit_trampolines.61 = jit_trampolines.60 + 1;
  jit_trampolines = jit_trampolines.61;
  D.25798 = tramp;
  return D.25798;
}


mono_create_jit_trampoline (struct MonoMethod * method)
{
  void * D.25835;
  struct MonoDomain * D.25836;

  D.25836 = mono_domain_get ();
  D.25835 = mono_create_jit_trampoline_in_domain (D.25836, method);
  return D.25835;
}


mono_create_jit_trampoline_from_token (struct MonoImage * image, guint32 token)
{
  unsigned int jit_trampolines.62;
  unsigned int jit_trampolines.63;
  void * D.25840;
  void * tramp;
  struct MonoDomain * domain;
  guint8 * buf;
  guint8 * start;

  domain = mono_domain_get ();
  start = mono_domain_alloc0 (domain, 8);
  buf = start;
  MEM[(void * *)buf] = image;
  buf = buf + 4;
  MEM[(guint32 *)buf] = token;
  tramp = mono_create_specific_trampoline (start, 5, domain, 0B);
  jit_trampolines.62 = jit_trampolines;
  jit_trampolines.63 = jit_trampolines.62 + 1;
  jit_trampolines = jit_trampolines.63;
  D.25840 = tramp;
  return D.25840;
}


mono_create_delegate_trampoline (struct MonoDomain * domain, struct MonoClass * klass)
{
  union mono_mutex_t * D.25842;
  _Bool D.25845;
  long int D.25846;
  long int D.25847;
  void * D.25850;
  struct GHashTable * D.25851;
  _Bool D.25854;
  long int D.25855;
  long int D.25856;
  void * D.25861;
  _Bool D.25862;
  long int D.25863;
  long int D.25864;
  void * * D.25867;
  struct MonoMethodSignature * D.25868;
  void * D.25869;
  void * * D.25870;
  struct MonoMethodSignature * D.25871;
  void * D.25872;
  unsigned int code_size.64;
  _Bool D.25874;
  long int D.25875;
  long int D.25876;
  _Bool D.25881;
  long int D.25882;
  long int D.25883;
  _Bool D.25888;
  long int D.25889;
  long int D.25890;
  void * ptr;
  guint32 code_size;
  void * * tramp_data;
  struct MonoMethod * invoke;

  try
    {
      code_size = 0;
      {
        int ret;

        D.25842 = &domain->lock.mutex;
        ret = pthread_mutex_lock (D.25842);
        if (ret != 0) goto <D.25843>; else goto <D.25844>;
        <D.25843>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
        <D.25844>:
        D.25845 = ret != 0;
        D.25846 = (long int) D.25845;
        D.25847 = __builtin_expect (D.25846, 0);
        if (D.25847 != 0) goto <D.25848>; else goto <D.25849>;
        <D.25848>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1459, "ret == 0");
        <D.25849>:
      }
      D.25850 = domain->runtime_info;
      D.25851 = MEM[(struct MonoJitDomainInfo *)D.25850].delegate_trampoline_hash;
      ptr = monoeg_g_hash_table_lookup (D.25851, klass);
      {
        int ret;

        D.25842 = &domain->lock.mutex;
        ret = pthread_mutex_unlock (D.25842);
        if (ret != 0) goto <D.25852>; else goto <D.25853>;
        <D.25852>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
        <D.25853>:
        D.25854 = ret != 0;
        D.25855 = (long int) D.25854;
        D.25856 = __builtin_expect (D.25855, 0);
        if (D.25856 != 0) goto <D.25857>; else goto <D.25858>;
        <D.25857>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1461, "ret == 0");
        <D.25858>:
      }
      if (ptr != 0B) goto <D.25859>; else goto <D.25860>;
      <D.25859>:
      D.25861 = ptr;
      return D.25861;
      <D.25860>:
      invoke = mono_get_delegate_invoke (klass);
      D.25862 = invoke == 0B;
      D.25863 = (long int) D.25862;
      D.25864 = __builtin_expect (D.25863, 0);
      if (D.25864 != 0) goto <D.25865>; else goto <D.25866>;
      <D.25865>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1467, "invoke");
      <D.25866>:
      tramp_data = mono_domain_alloc (domain, 12);
      *tramp_data = invoke;
      D.25867 = tramp_data + 4;
      D.25868 = mono_method_signature (invoke);
      D.25869 = mono_arch_get_delegate_invoke_impl (D.25868, 1);
      *D.25867 = D.25869;
      D.25870 = tramp_data + 8;
      D.25871 = mono_method_signature (invoke);
      D.25872 = mono_arch_get_delegate_invoke_impl (D.25871, 0);
      *D.25870 = D.25872;
      ptr = mono_create_specific_trampoline (tramp_data, 7, domain, &code_size);
      code_size.64 = code_size;
      D.25874 = code_size.64 == 0;
      D.25875 = (long int) D.25874;
      D.25876 = __builtin_expect (D.25875, 0);
      if (D.25876 != 0) goto <D.25877>; else goto <D.25878>;
      <D.25877>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1475, "code_size");
      <D.25878>:
      {
        int ret;

        D.25842 = &domain->lock.mutex;
        ret = pthread_mutex_lock (D.25842);
        if (ret != 0) goto <D.25879>; else goto <D.25880>;
        <D.25879>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
        <D.25880>:
        D.25881 = ret != 0;
        D.25882 = (long int) D.25881;
        D.25883 = __builtin_expect (D.25882, 0);
        if (D.25883 != 0) goto <D.25884>; else goto <D.25885>;
        <D.25884>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1478, "ret == 0");
        <D.25885>:
      }
      D.25850 = domain->runtime_info;
      D.25851 = MEM[(struct MonoJitDomainInfo *)D.25850].delegate_trampoline_hash;
      monoeg_g_hash_table_insert_replace (D.25851, klass, ptr, 0);
      {
        int ret;

        D.25842 = &domain->lock.mutex;
        ret = pthread_mutex_unlock (D.25842);
        if (ret != 0) goto <D.25886>; else goto <D.25887>;
        <D.25886>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
        <D.25887>:
        D.25888 = ret != 0;
        D.25889 = (long int) D.25888;
        D.25890 = __builtin_expect (D.25889, 0);
        if (D.25890 != 0) goto <D.25891>; else goto <D.25892>;
        <D.25891>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1481, "ret == 0");
        <D.25892>:
      }
      D.25861 = ptr;
      return D.25861;
    }
  finally
    {
      code_size = {CLOBBER};
    }
}


mono_create_rgctx_lazy_fetch_trampoline (guint32 offset)
{
  _Bool D.25897;
  long int D.25898;
  long int D.25899;
  struct GHashTable * rgctx_lazy_fetch_trampoline_hash.65;
  const void * offset.66;
  _Bool D.25909;
  long int D.25910;
  long int D.25911;
  void * D.25916;
  int mono_aot_only.67;
  struct MonoTrampInfo * info.68;
  struct MonoDomain * D.25922;
  _Bool D.25925;
  long int D.25926;
  long int D.25927;
  struct GHashTable * rgctx_lazy_fetch_trampoline_hash.69;
  struct GHashTable * rgctx_lazy_fetch_trampoline_hash_addr.70;
  void * offset.71;
  _Bool D.25935;
  long int D.25936;
  long int D.25937;
  struct GHashTable * rgctx_lazy_fetch_trampoline_hash_addr.72;
  unsigned int D.25941;
  void * D.25942;
  _Bool D.25945;
  long int D.25946;
  long int D.25947;
  int inited.73;
  int num_trampolines.74;
  int num_trampolines.75;
  static gboolean inited = 0;
  static int num_trampolines = 0;
  struct MonoTrampInfo * info;
  void * tramp;
  void * ptr;

  try
    {
      {
        int ret;

        ret = pthread_mutex_lock (&trampolines_mutex.mutex);
        if (ret != 0) goto <D.25895>; else goto <D.25896>;
        <D.25895>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
        <D.25896>:
        D.25897 = ret != 0;
        D.25898 = (long int) D.25897;
        D.25899 = __builtin_expect (D.25898, 0);
        if (D.25899 != 0) goto <D.25900>; else goto <D.25901>;
        <D.25900>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1498, "ret == 0");
        <D.25901>:
      }
      rgctx_lazy_fetch_trampoline_hash.65 = rgctx_lazy_fetch_trampoline_hash;
      if (rgctx_lazy_fetch_trampoline_hash.65 != 0B) goto <D.25903>; else goto <D.25904>;
      <D.25903>:
      rgctx_lazy_fetch_trampoline_hash.65 = rgctx_lazy_fetch_trampoline_hash;
      offset.66 = (const void *) offset;
      tramp = monoeg_g_hash_table_lookup (rgctx_lazy_fetch_trampoline_hash.65, offset.66);
      goto <D.25906>;
      <D.25904>:
      tramp = 0B;
      <D.25906>:
      {
        int ret;

        ret = pthread_mutex_unlock (&trampolines_mutex.mutex);
        if (ret != 0) goto <D.25907>; else goto <D.25908>;
        <D.25907>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
        <D.25908>:
        D.25909 = ret != 0;
        D.25910 = (long int) D.25909;
        D.25911 = __builtin_expect (D.25910, 0);
        if (D.25911 != 0) goto <D.25912>; else goto <D.25913>;
        <D.25912>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1503, "ret == 0");
        <D.25913>:
      }
      if (tramp != 0B) goto <D.25914>; else goto <D.25915>;
      <D.25914>:
      D.25916 = tramp;
      return D.25916;
      <D.25915>:
      mono_aot_only.67 = mono_aot_only;
      if (mono_aot_only.67 != 0) goto <D.25918>; else goto <D.25919>;
      <D.25918>:
      ptr = mono_aot_get_lazy_fetch_trampoline (offset);
      goto <D.25920>;
      <D.25919>:
      tramp = mono_arch_create_rgctx_lazy_fetch_trampoline (offset, &info, 0);
      info.68 = info;
      mono_tramp_info_register (info.68);
      D.25922 = mono_get_root_domain ();
      ptr = mono_create_ftnptr (D.25922, tramp);
      <D.25920>:
      {
        int ret;

        ret = pthread_mutex_lock (&trampolines_mutex.mutex);
        if (ret != 0) goto <D.25923>; else goto <D.25924>;
        <D.25923>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
        <D.25924>:
        D.25925 = ret != 0;
        D.25926 = (long int) D.25925;
        D.25927 = __builtin_expect (D.25926, 0);
        if (D.25927 != 0) goto <D.25928>; else goto <D.25929>;
        <D.25928>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1515, "ret == 0");
        <D.25929>:
      }
      rgctx_lazy_fetch_trampoline_hash.65 = rgctx_lazy_fetch_trampoline_hash;
      if (rgctx_lazy_fetch_trampoline_hash.65 == 0B) goto <D.25930>; else goto <D.25931>;
      <D.25930>:
      rgctx_lazy_fetch_trampoline_hash.69 = monoeg_g_hash_table_new (0B, 0B);
      rgctx_lazy_fetch_trampoline_hash = rgctx_lazy_fetch_trampoline_hash.69;
      rgctx_lazy_fetch_trampoline_hash_addr.70 = monoeg_g_hash_table_new (0B, 0B);
      rgctx_lazy_fetch_trampoline_hash_addr = rgctx_lazy_fetch_trampoline_hash_addr.70;
      <D.25931>:
      rgctx_lazy_fetch_trampoline_hash.65 = rgctx_lazy_fetch_trampoline_hash;
      offset.71 = (void *) offset;
      monoeg_g_hash_table_insert_replace (rgctx_lazy_fetch_trampoline_hash.65, offset.71, ptr, 0);
      D.25935 = offset == 4294967295;
      D.25936 = (long int) D.25935;
      D.25937 = __builtin_expect (D.25936, 0);
      if (D.25937 != 0) goto <D.25938>; else goto <D.25939>;
      <D.25938>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1521, "offset != -1");
      <D.25939>:
      rgctx_lazy_fetch_trampoline_hash_addr.72 = rgctx_lazy_fetch_trampoline_hash_addr;
      D.25941 = offset + 1;
      D.25942 = (void *) D.25941;
      monoeg_g_hash_table_insert_replace (rgctx_lazy_fetch_trampoline_hash_addr.72, ptr, D.25942, 0);
      {
        int ret;

        ret = pthread_mutex_unlock (&trampolines_mutex.mutex);
        if (ret != 0) goto <D.25943>; else goto <D.25944>;
        <D.25943>:
        monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
        <D.25944>:
        D.25945 = ret != 0;
        D.25946 = (long int) D.25945;
        D.25947 = __builtin_expect (D.25946, 0);
        if (D.25947 != 0) goto <D.25948>; else goto <D.25949>;
        <D.25948>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1523, "ret == 0");
        <D.25949>:
      }
      inited.73 = inited;
      if (inited.73 == 0) goto <D.25951>; else goto <D.25952>;
      <D.25951>:
      mono_counters_register ("RGCTX num lazy fetch trampolines", 2048, &num_trampolines);
      inited = 1;
      <D.25952>:
      num_trampolines.74 = num_trampolines;
      num_trampolines.75 = num_trampolines.74 + 1;
      num_trampolines = num_trampolines.75;
      D.25916 = ptr;
      return D.25916;
    }
  finally
    {
      info = {CLOBBER};
    }
}


mono_create_monitor_enter_trampoline ()
{
  int mono_aot_only.76;
  void * code.77;
  void * code.78;
  void * D.25964;
  static void * code;

  mono_aot_only.76 = mono_aot_only;
  if (mono_aot_only.76 != 0) goto <D.25958>; else goto <D.25959>;
  <D.25958>:
  code.77 = code;
  if (code.77 == 0B) goto <D.25961>; else goto <D.25962>;
  <D.25961>:
  code.78 = mono_aot_get_trampoline ("monitor_enter_trampoline");
  code = code.78;
  <D.25962>:
  D.25964 = code;
  return D.25964;
  <D.25959>:
  code = 0B;
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "mini-trampolines.c", 1559);
  D.25964 = code;
  return D.25964;
}


mono_create_monitor_exit_trampoline ()
{
  int mono_aot_only.79;
  void * code.80;
  void * code.81;
  void * D.25973;
  static void * code;

  mono_aot_only.79 = mono_aot_only;
  if (mono_aot_only.79 != 0) goto <D.25967>; else goto <D.25968>;
  <D.25967>:
  code.80 = code;
  if (code.80 == 0B) goto <D.25970>; else goto <D.25971>;
  <D.25970>:
  code.81 = mono_aot_get_trampoline ("monitor_exit_trampoline");
  code = code.81;
  <D.25971>:
  D.25973 = code;
  return D.25973;
  <D.25968>:
  code = 0B;
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "mini-trampolines.c", 1589);
  D.25973 = code;
  return D.25973;
}


mono_create_llvm_imt_trampoline (struct MonoDomain * domain, struct MonoMethod * m, int vt_offset)
{
  void * D.25975;

  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "mini-trampolines.c", 1608);
  D.25975 = 0B;
  return D.25975;
}


mono_find_class_init_trampoline_by_addr (const void * addr)
{
  _Bool D.25979;
  long int D.25980;
  long int D.25981;
  struct GHashTable * class_init_hash_addr.82;
  _Bool D.25990;
  long int D.25991;
  long int D.25992;
  struct MonoVTable * D.25995;
  struct MonoVTable * res;

  {
    int ret;

    ret = pthread_mutex_lock (&trampolines_mutex.mutex);
    if (ret != 0) goto <D.25977>; else goto <D.25978>;
    <D.25977>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
    <D.25978>:
    D.25979 = ret != 0;
    D.25980 = (long int) D.25979;
    D.25981 = __builtin_expect (D.25980, 0);
    if (D.25981 != 0) goto <D.25982>; else goto <D.25983>;
    <D.25982>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1619, "ret == 0");
    <D.25983>:
  }
  class_init_hash_addr.82 = class_init_hash_addr;
  if (class_init_hash_addr.82 != 0B) goto <D.25985>; else goto <D.25986>;
  <D.25985>:
  class_init_hash_addr.82 = class_init_hash_addr;
  res = monoeg_g_hash_table_lookup (class_init_hash_addr.82, addr);
  goto <D.25987>;
  <D.25986>:
  res = 0B;
  <D.25987>:
  {
    int ret;

    ret = pthread_mutex_unlock (&trampolines_mutex.mutex);
    if (ret != 0) goto <D.25988>; else goto <D.25989>;
    <D.25988>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
    <D.25989>:
    D.25990 = ret != 0;
    D.25991 = (long int) D.25990;
    D.25992 = __builtin_expect (D.25991, 0);
    if (D.25992 != 0) goto <D.25993>; else goto <D.25994>;
    <D.25993>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1624, "ret == 0");
    <D.25994>:
  }
  D.25995 = res;
  return D.25995;
}


mono_find_rgctx_lazy_fetch_trampoline_by_addr (const void * addr)
{
  _Bool D.25999;
  long int D.26000;
  long int D.26001;
  struct GHashTable * rgctx_lazy_fetch_trampoline_hash_addr.83;
  void * D.26007;
  _Bool D.26014;
  long int D.26015;
  long int D.26016;
  guint32 D.26019;
  int offset;

  {
    int ret;

    ret = pthread_mutex_lock (&trampolines_mutex.mutex);
    if (ret != 0) goto <D.25997>; else goto <D.25998>;
    <D.25997>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
    <D.25998>:
    D.25999 = ret != 0;
    D.26000 = (long int) D.25999;
    D.26001 = __builtin_expect (D.26000, 0);
    if (D.26001 != 0) goto <D.26002>; else goto <D.26003>;
    <D.26002>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1633, "ret == 0");
    <D.26003>:
  }
  rgctx_lazy_fetch_trampoline_hash_addr.83 = rgctx_lazy_fetch_trampoline_hash_addr;
  if (rgctx_lazy_fetch_trampoline_hash_addr.83 != 0B) goto <D.26005>; else goto <D.26006>;
  <D.26005>:
  rgctx_lazy_fetch_trampoline_hash_addr.83 = rgctx_lazy_fetch_trampoline_hash_addr;
  D.26007 = monoeg_g_hash_table_lookup (rgctx_lazy_fetch_trampoline_hash_addr.83, addr);
  offset = (int) D.26007;
  if (offset != 0) goto <D.26008>; else goto <D.26009>;
  <D.26008>:
  offset = offset + -1;
  goto <D.26010>;
  <D.26009>:
  offset = -1;
  <D.26010>:
  goto <D.26011>;
  <D.26006>:
  offset = -1;
  <D.26011>:
  {
    int ret;

    ret = pthread_mutex_unlock (&trampolines_mutex.mutex);
    if (ret != 0) goto <D.26012>; else goto <D.26013>;
    <D.26012>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
    <D.26013>:
    D.26014 = ret != 0;
    D.26015 = (long int) D.26014;
    D.26016 = __builtin_expect (D.26015, 0);
    if (D.26016 != 0) goto <D.26017>; else goto <D.26018>;
    <D.26017>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "mini-trampolines.c", 1644, "ret == 0");
    <D.26018>:
  }
  D.26019 = (guint32) offset;
  return D.26019;
}


mono_get_generic_trampoline_name (MonoTrampolineType tramp_type)
{
  char * D.26021;
  const char * D.26022;

  D.26022 = tramp_names[tramp_type];
  D.26021 = monoeg_g_strdup_printf ("generic_trampoline_%s", D.26022);
  return D.26021;
}


mono_get_rgctx_fetch_trampoline_name (int slot)
{
  _Bool D.26024;
  char * D.26025;
  const char * iftmp.84;
  gboolean mrgctx;
  int index;

  D.26024 = slot < 0;
  mrgctx = (gboolean) D.26024;
  index = slot & 2147483647;
  if (mrgctx != 0) goto <D.26027>; else goto <D.26028>;
  <D.26027>:
  iftmp.84 = "mrgctx";
  goto <D.26029>;
  <D.26028>:
  iftmp.84 = "rgctx";
  <D.26029>:
  D.26025 = monoeg_g_strdup_printf ("rgctx_fetch_trampoline_%s_%d", iftmp.84, index);
  return D.26025;
}


mini_get_nullified_class_init_trampoline ()
{
  void * nullified_class_init_trampoline.85;
  int mono_aot_only.86;
  struct MonoTrampInfo * info.87;
  void * D.26039;
  static void * nullified_class_init_trampoline;

  nullified_class_init_trampoline.85 = nullified_class_init_trampoline;
  if (nullified_class_init_trampoline.85 == 0B) goto <D.26032>; else goto <D.26033>;
  <D.26032>:
  {
    void * tramp;
    struct MonoTrampInfo * info;

    try
      {
        mono_aot_only.86 = mono_aot_only;
        if (mono_aot_only.86 != 0) goto <D.26035>; else goto <D.26036>;
        <D.26035>:
        tramp = mono_aot_get_trampoline ("nullified_class_init_trampoline");
        goto <D.26037>;
        <D.26036>:
        tramp = mono_arch_get_nullified_class_init_trampoline (&info);
        info.87 = info;
        mono_tramp_info_register (info.87);
        <D.26037>:
        mono_memory_barrier ();
        nullified_class_init_trampoline = tramp;
      }
    finally
      {
        info = {CLOBBER};
      }
  }
  <D.26033>:
  D.26039 = nullified_class_init_trampoline;
  return D.26039;
}


mono_memory_barrier ()
{
  __sync_synchronize ();
}


