mono_security_core_clr_set_options (MonoSecurityCoreCLROptions options)
{
  security_core_clr_options = options;
}


mono_security_core_clr_get_options ()
{
  MonoSecurityCoreCLROptions D.17532;

  D.17532 = security_core_clr_options;
  return D.17532;
}


mono_security_core_clr_determine_platform_image (struct MonoImage * image)
{
  gboolean D.17534;
  mono_bool (*<Tb30>) (const char *) platform_callback.0;
  char * D.17536;

  platform_callback.0 = platform_callback;
  D.17536 = image->name;
  D.17534 = platform_callback.0 (D.17536);
  return D.17534;
}


default_platform_check (const char * image_name)
{
  struct MonoImage * D.17538;
  gboolean D.17541;
  int D.17121;
  char * D.17542;
  _Bool D.17543;
  unsigned int D.17544;
  unsigned int D.17545;
  int iftmp.1;
  int D.17133;
  int iftmp.2;
  int D.17129;
  sizetype ilen.3;
  sizetype clen.4;
  sizetype D.17555;
  const char[13] * D.17556;
  unsigned char D.17557;
  int D.17558;
  unsigned char D.17559;
  int D.17560;
  _Bool D.17561;
  _Bool D.17562;
  _Bool D.17563;
  const unsigned char * D.17566;
  unsigned char D.17567;
  int D.17568;
  const unsigned char * D.17569;
  unsigned char D.17570;
  int D.17571;
  _Bool D.17572;
  _Bool D.17573;
  const unsigned char * D.17576;
  unsigned char D.17577;
  int D.17578;
  const unsigned char * D.17579;
  unsigned char D.17580;
  int D.17581;
  _Bool D.17582;
  _Bool D.17583;
  const unsigned char * D.17586;
  unsigned char D.17587;
  int D.17588;
  const unsigned char * D.17589;
  unsigned char D.17590;
  int D.17591;
  const char * D.17593;

  D.17538 = mono_defaults.corlib;
  if (D.17538 != 0B) goto <D.17539>; else goto <D.17540>;
  <D.17539>:
  {
    size_t __s1_len;
    size_t __s2_len;

    D.17538 = mono_defaults.corlib;
    D.17542 = D.17538->name;
    D.17121 = __builtin_strcmp (D.17542, image_name);
  }
  D.17543 = D.17121 == 0;
  D.17541 = (gboolean) D.17543;
  return D.17541;
  <D.17540>:
  {
    const char * corlib;
    int ilen;
    int clen;

    corlib = "mscorlib.dll";
    D.17544 = strlen (image_name);
    ilen = (int) D.17544;
    D.17545 = strlen (corlib);
    clen = (int) D.17545;
    if (ilen >= clen) goto <D.17549>; else goto <D.17547>;
    <D.17549>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s1_len = 12;
      if (__s1_len <= 3) goto <D.17551>; else goto <D.17552>;
      <D.17551>:
      {
        const unsigned char * __s2;
        int __result;

        ilen.3 = (sizetype) ilen;
        clen.4 = (sizetype) clen;
        D.17555 = ilen.3 - clen.4;
        __s2 = image_name + D.17555;
        D.17556 = "mscorlib.dll";
        D.17557 = MEM[(const unsigned char *)D.17556];
        D.17558 = (int) D.17557;
        D.17559 = *__s2;
        D.17560 = (int) D.17559;
        __result = D.17558 - D.17560;
        {
          D.17561 = __s1_len != 0;
          D.17562 = __result == 0;
          D.17563 = D.17561 & D.17562;
          if (D.17563 != 0) goto <D.17564>; else goto <D.17565>;
          <D.17564>:
          D.17566 = &MEM[(void *)"mscorlib.dll" + 1B];
          D.17567 = *D.17566;
          D.17568 = (int) D.17567;
          D.17569 = __s2 + 1;
          D.17570 = *D.17569;
          D.17571 = (int) D.17570;
          __result = D.17568 - D.17571;
          D.17572 = __s1_len > 1;
          D.17562 = __result == 0;
          D.17573 = D.17572 & D.17562;
          if (D.17573 != 0) goto <D.17574>; else goto <D.17575>;
          <D.17574>:
          D.17576 = &MEM[(void *)"mscorlib.dll" + 2B];
          D.17577 = *D.17576;
          D.17578 = (int) D.17577;
          D.17579 = __s2 + 2;
          D.17580 = *D.17579;
          D.17581 = (int) D.17580;
          __result = D.17578 - D.17581;
          D.17582 = __s1_len > 2;
          D.17562 = __result == 0;
          D.17583 = D.17582 & D.17562;
          if (D.17583 != 0) goto <D.17584>; else goto <D.17585>;
          <D.17584>:
          D.17586 = &MEM[(void *)"mscorlib.dll" + 3B];
          D.17587 = *D.17586;
          D.17588 = (int) D.17587;
          D.17589 = __s2 + 3;
          D.17590 = *D.17589;
          D.17591 = (int) D.17590;
          __result = D.17588 - D.17591;
          <D.17585>:
          <D.17575>:
          <D.17565>:
        }
        D.17129 = __result;
      }
      iftmp.2 = D.17129;
      goto <D.17592>;
      <D.17552>:
      ilen.3 = (sizetype) ilen;
      clen.4 = (sizetype) clen;
      D.17555 = ilen.3 - clen.4;
      D.17593 = image_name + D.17555;
      iftmp.2 = __builtin_strcmp ("mscorlib.dll", D.17593);
      <D.17592>:
      D.17133 = iftmp.2;
    }
    if (D.17133 == 0) goto <D.17594>; else goto <D.17547>;
    <D.17594>:
    iftmp.1 = 1;
    goto <D.17548>;
    <D.17547>:
    iftmp.1 = 0;
    <D.17548>:
    D.17541 = iftmp.1;
    return D.17541;
  }
}


mono_security_set_core_clr_platform_callback (mono_bool (*MonoCoreClrPlatformCB) (const char *) callback)
{
  platform_callback = callback;
}


mono_security_core_clr_is_platform_image (struct MonoImage * image)
{
  gboolean D.17596;
  <unnamed-unsigned:1> D.17597;

  D.17597 = image->core_clr_platform_code;
  D.17596 = (gboolean) D.17597;
  return D.17596;
}


mono_security_core_clr_check_inheritance (struct MonoClass * class)
{
  short unsigned int D.17606;
  int D.17607;
  int D.17608;
  struct MonoMethod * D.17611;
  MonoSecurityCoreCLRLevel class_level;
  MonoSecurityCoreCLRLevel parent_level;
  struct MonoClass * parent;

  parent = class->parent;
  if (parent == 0B) goto <D.17599>; else goto <D.17600>;
  <D.17599>:
  return;
  <D.17600>:
  class_level = mono_security_core_clr_class_level (class);
  parent_level = mono_security_core_clr_class_level (parent);
  if (class_level < parent_level) goto <D.17601>; else goto <D.17602>;
  <D.17601>:
  set_type_load_exception_type ("Inheritance failure for type %s. Parent class %s is more restricted.", class);
  goto <D.17603>;
  <D.17602>:
  {
    struct MonoMethod * parent_ctor;

    parent_ctor = get_default_ctor (parent);
    if (parent_ctor != 0B) goto <D.17604>; else goto <D.17605>;
    <D.17604>:
    D.17606 = parent_ctor->flags;
    D.17607 = (int) D.17606;
    D.17608 = D.17607 & 6;
    if (D.17608 != 0) goto <D.17609>; else goto <D.17610>;
    <D.17609>:
    D.17611 = get_default_ctor (class);
    class_level = mono_security_core_clr_method_level (D.17611, 0);
    parent_level = mono_security_core_clr_method_level (parent_ctor, 0);
    if (class_level < parent_level) goto <D.17612>; else goto <D.17613>;
    <D.17612>:
    set_type_load_exception_type ("Inheritance failure for type %s. Default constructor security mismatch with %s.", class);
    <D.17613>:
    <D.17610>:
    <D.17605>:
  }
  <D.17603>:
}


get_default_ctor (struct MonoClass * klass)
{
  struct MonoMethod * * D.17615;
  struct MonoMethod * D.17618;
  unsigned int i.5;
  unsigned int D.17620;
  struct MonoMethod * * D.17621;
  short unsigned int D.17624;
  int D.17625;
  int D.17626;
  const char * D.17631;
  char D.17632;
  int D.17185;
  int iftmp.6;
  int D.17181;
  const char[6] * D.17637;
  unsigned char D.17638;
  int D.17639;
  unsigned char D.17640;
  int D.17641;
  _Bool D.17642;
  _Bool D.17643;
  _Bool D.17644;
  const unsigned char * D.17647;
  unsigned char D.17648;
  int D.17649;
  const unsigned char * D.17650;
  unsigned char D.17651;
  int D.17652;
  _Bool D.17653;
  _Bool D.17654;
  const unsigned char * D.17657;
  unsigned char D.17658;
  int D.17659;
  const unsigned char * D.17660;
  unsigned char D.17661;
  int D.17662;
  _Bool D.17663;
  _Bool D.17664;
  const unsigned char * D.17667;
  unsigned char D.17668;
  int D.17669;
  const unsigned char * D.17670;
  unsigned char D.17671;
  int D.17672;
  short unsigned int D.17676;
  unsigned int i.7;
  unsigned int D.17680;
  int i;

  mono_class_setup_methods (klass);
  D.17615 = klass->methods;
  if (D.17615 == 0B) goto <D.17616>; else goto <D.17617>;
  <D.17616>:
  D.17618 = 0B;
  return D.17618;
  <D.17617>:
  i = 0;
  goto <D.17187>;
  <D.17186>:
  {
    struct MonoMethodSignature * sig;
    struct MonoMethod * method;

    D.17615 = klass->methods;
    i.5 = (unsigned int) i;
    D.17620 = i.5 * 4;
    D.17621 = D.17615 + D.17620;
    method = *D.17621;
    if (method == 0B) goto <D.17622>; else goto <D.17623>;
    <D.17622>:
    // predicted unlikely by continue predictor.
    goto <D.17176>;
    <D.17623>:
    D.17624 = method->flags;
    D.17625 = (int) D.17624;
    D.17626 = D.17625 & 2048;
    if (D.17626 == 0) goto <D.17627>; else goto <D.17628>;
    <D.17627>:
    // predicted unlikely by continue predictor.
    goto <D.17176>;
    <D.17628>:
    D.17631 = method->name;
    D.17632 = *D.17631;
    if (D.17632 != 46) goto <D.17629>; else goto <D.17633>;
    <D.17633>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s1_len = 5;
      if (__s1_len <= 3) goto <D.17635>; else goto <D.17636>;
      <D.17635>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = method->name;
        D.17637 = ".ctor";
        D.17638 = MEM[(const unsigned char *)D.17637];
        D.17639 = (int) D.17638;
        D.17640 = *__s2;
        D.17641 = (int) D.17640;
        __result = D.17639 - D.17641;
        {
          D.17642 = __s1_len != 0;
          D.17643 = __result == 0;
          D.17644 = D.17642 & D.17643;
          if (D.17644 != 0) goto <D.17645>; else goto <D.17646>;
          <D.17645>:
          D.17647 = &MEM[(void *)".ctor" + 1B];
          D.17648 = *D.17647;
          D.17649 = (int) D.17648;
          D.17650 = __s2 + 1;
          D.17651 = *D.17650;
          D.17652 = (int) D.17651;
          __result = D.17649 - D.17652;
          D.17653 = __s1_len > 1;
          D.17643 = __result == 0;
          D.17654 = D.17653 & D.17643;
          if (D.17654 != 0) goto <D.17655>; else goto <D.17656>;
          <D.17655>:
          D.17657 = &MEM[(void *)".ctor" + 2B];
          D.17658 = *D.17657;
          D.17659 = (int) D.17658;
          D.17660 = __s2 + 2;
          D.17661 = *D.17660;
          D.17662 = (int) D.17661;
          __result = D.17659 - D.17662;
          D.17663 = __s1_len > 2;
          D.17643 = __result == 0;
          D.17664 = D.17663 & D.17643;
          if (D.17664 != 0) goto <D.17665>; else goto <D.17666>;
          <D.17665>:
          D.17667 = &MEM[(void *)".ctor" + 3B];
          D.17668 = *D.17667;
          D.17669 = (int) D.17668;
          D.17670 = __s2 + 3;
          D.17671 = *D.17670;
          D.17672 = (int) D.17671;
          __result = D.17669 - D.17672;
          <D.17666>:
          <D.17656>:
          <D.17646>:
        }
        D.17181 = __result;
      }
      iftmp.6 = D.17181;
      goto <D.17673>;
      <D.17636>:
      D.17631 = method->name;
      iftmp.6 = __builtin_strcmp (".ctor", D.17631);
      <D.17673>:
      D.17185 = iftmp.6;
    }
    if (D.17185 != 0) goto <D.17629>; else goto <D.17630>;
    <D.17629>:
    // predicted unlikely by continue predictor.
    goto <D.17176>;
    <D.17630>:
    sig = mono_method_signature (method);
    if (sig != 0B) goto <D.17674>; else goto <D.17675>;
    <D.17674>:
    D.17676 = sig->param_count;
    if (D.17676 == 0) goto <D.17677>; else goto <D.17678>;
    <D.17677>:
    D.17618 = method;
    return D.17618;
    <D.17678>:
    <D.17675>:
  }
  <D.17176>:
  i = i + 1;
  <D.17187>:
  i.7 = (unsigned int) i;
  D.17680 = klass->method.count;
  if (i.7 < D.17680) goto <D.17186>; else goto <D.17188>;
  <D.17188>:
  D.17618 = 0B;
  return D.17618;
}


set_type_load_exception_type (const char * format, struct MonoClass * class)
{
  struct MonoClass * D.17682;
  char * type_name;
  char * parent_name;
  char * message;

  type_name = mono_type_get_full_name (class);
  D.17682 = class->parent;
  parent_name = mono_type_get_full_name (D.17682);
  message = monoeg_g_strdup_printf (format, type_name, parent_name);
  monoeg_g_free (parent_name);
  monoeg_g_free (type_name);
  mono_trace (16, 64, message);
  mono_class_set_failure (class, 7, message);
}


mono_security_core_clr_check_override (struct MonoClass * class, struct MonoMethod * override, struct MonoMethod * base)
{
  MonoSecurityCoreCLRLevel base_level;
  MonoSecurityCoreCLRLevel override_level;

  base_level = mono_security_core_clr_method_level (base, 0);
  override_level = mono_security_core_clr_method_level (override, 0);
  if (base_level == 2) goto <D.17683>; else goto <D.17684>;
  <D.17683>:
  if (override_level != 2) goto <D.17685>; else goto <D.17686>;
  <D.17685>:
  set_type_load_exception_methods ("Override failure for %s over %s. Override MUST be [SecurityCritical].", override, base);
  <D.17686>:
  goto <D.17687>;
  <D.17684>:
  if (override_level == 2) goto <D.17688>; else goto <D.17689>;
  <D.17688>:
  set_type_load_exception_methods ("Override failure for %s over %s. Override must NOT be [SecurityCritical].", override, base);
  <D.17689>:
  <D.17687>:
}


set_type_load_exception_methods (const char * format, struct MonoMethod * override, struct MonoMethod * base)
{
  struct MonoClass * D.17690;
  char * method_name;
  char * base_name;
  char * message;

  method_name = get_method_full_name (override);
  base_name = get_method_full_name (base);
  message = monoeg_g_strdup_printf (format, method_name, base_name);
  monoeg_g_free (base_name);
  monoeg_g_free (method_name);
  mono_trace (16, 64, message);
  D.17690 = override->klass;
  mono_class_set_failure (D.17690, 7, message);
}


get_method_full_name (struct MonoMethod * method)
{
  char * D.17691;
  char * iftmp.8;

  if (method != 0B) goto <D.17693>; else goto <D.17694>;
  <D.17693>:
  iftmp.8 = mono_method_full_name (method, 1);
  goto <D.17695>;
  <D.17694>:
  iftmp.8 = monoeg_strdup ("\'no caller found\'");
  <D.17695>:
  D.17691 = iftmp.8;
  return D.17691;
}


monoeg_strdup (const gchar * str)
{
  gchar * D.17699;

  if (str != 0B) goto <D.17697>; else goto <D.17698>;
  <D.17697>:
  D.17699 = __strdup (str);
  return D.17699;
  <D.17698>:
  D.17699 = 0B;
  return D.17699;
}


mono_security_core_clr_require_elevated_permissions ()
{
  struct MonoMethod * D.17703;
  int D.17705;
  gboolean D.17706;
  <unnamed type> D.17707;
  _Bool D.17708;
  struct ElevatedTrustCookie cookie;

  try
    {
      cookie.depth = 0;
      cookie.caller = 0B;
      mono_stack_walk_no_il (get_caller_of_elevated_trust_code, &cookie);
      D.17703 = cookie.caller;
      if (D.17703 == 0B) goto <D.17701>; else goto <D.17704>;
      <D.17704>:
      D.17705 = cookie.depth;
      if (D.17705 <= 2) goto <D.17701>; else goto <D.17702>;
      <D.17701>:
      D.17706 = 1;
      return D.17706;
      <D.17702>:
      D.17703 = cookie.caller;
      D.17707 = mono_security_core_clr_method_level (D.17703, 1);
      D.17708 = D.17707 == 0;
      D.17706 = (gboolean) D.17708;
      return D.17706;
    }
  finally
    {
      cookie = {CLOBBER};
    }
}


get_caller_of_elevated_trust_code (struct MonoMethod * m, gint32 no, gint32 ilo, gboolean managed, void * data)
{
  unsigned char D.17714;
  unsigned char D.17715;
  gboolean D.17716;
  struct MonoClass * D.17717;
  struct MonoImage * D.17718;
  int D.17719;
  int D.17722;
  int D.17328;
  int iftmp.9;
  int D.17327;
  const char[16] * D.17726;
  unsigned char D.17727;
  int D.17728;
  unsigned char D.17729;
  int D.17730;
  _Bool D.17731;
  _Bool D.17732;
  _Bool D.17733;
  const unsigned char * D.17736;
  unsigned char D.17737;
  int D.17738;
  const unsigned char * D.17739;
  unsigned char D.17740;
  int D.17741;
  _Bool D.17742;
  _Bool D.17743;
  const unsigned char * D.17746;
  unsigned char D.17747;
  int D.17748;
  const unsigned char * D.17749;
  unsigned char D.17750;
  int D.17751;
  _Bool D.17752;
  _Bool D.17753;
  const unsigned char * D.17756;
  unsigned char D.17757;
  int D.17758;
  const unsigned char * D.17759;
  unsigned char D.17760;
  int D.17761;
  const char * D.17763;
  int D.17337;
  int iftmp.10;
  int D.17336;
  const char[16] * D.17769;
  unsigned char D.17770;
  int D.17771;
  unsigned char D.17772;
  int D.17773;
  _Bool D.17774;
  _Bool D.17775;
  _Bool D.17776;
  const unsigned char * D.17779;
  unsigned char D.17780;
  int D.17781;
  const unsigned char * D.17782;
  unsigned char D.17783;
  int D.17784;
  _Bool D.17785;
  _Bool D.17786;
  const unsigned char * D.17789;
  unsigned char D.17790;
  int D.17791;
  const unsigned char * D.17792;
  unsigned char D.17793;
  int D.17794;
  _Bool D.17795;
  _Bool D.17796;
  const unsigned char * D.17799;
  unsigned char D.17800;
  int D.17801;
  const unsigned char * D.17802;
  unsigned char D.17803;
  int D.17804;
  const char * D.17806;
  int D.17346;
  int iftmp.11;
  int D.17345;
  const char[26] * D.17812;
  unsigned char D.17813;
  int D.17814;
  unsigned char D.17815;
  int D.17816;
  _Bool D.17817;
  _Bool D.17818;
  _Bool D.17819;
  const unsigned char * D.17822;
  unsigned char D.17823;
  int D.17824;
  const unsigned char * D.17825;
  unsigned char D.17826;
  int D.17827;
  _Bool D.17828;
  _Bool D.17829;
  const unsigned char * D.17832;
  unsigned char D.17833;
  int D.17834;
  const unsigned char * D.17835;
  unsigned char D.17836;
  int D.17837;
  _Bool D.17838;
  _Bool D.17839;
  const unsigned char * D.17842;
  unsigned char D.17843;
  int D.17844;
  const unsigned char * D.17845;
  unsigned char D.17846;
  int D.17847;
  const char * D.17849;
  int D.17355;
  int iftmp.12;
  int D.17354;
  const char[25] * D.17855;
  unsigned char D.17856;
  int D.17857;
  unsigned char D.17858;
  int D.17859;
  _Bool D.17860;
  _Bool D.17861;
  _Bool D.17862;
  const unsigned char * D.17865;
  unsigned char D.17866;
  int D.17867;
  const unsigned char * D.17868;
  unsigned char D.17869;
  int D.17870;
  _Bool D.17871;
  _Bool D.17872;
  const unsigned char * D.17875;
  unsigned char D.17876;
  int D.17877;
  const unsigned char * D.17878;
  unsigned char D.17879;
  int D.17880;
  _Bool D.17881;
  _Bool D.17882;
  const unsigned char * D.17885;
  unsigned char D.17886;
  int D.17887;
  const unsigned char * D.17888;
  unsigned char D.17889;
  int D.17890;
  int D.17894;
  <unnamed type> D.17895;
  struct ElevatedTrustCookie * cookie;

  cookie = data;
  if (managed == 0) goto <D.17711>; else goto <D.17713>;
  <D.17713>:
  D.17714 = BIT_FIELD_REF <*m, 8, 160>;
  D.17715 = D.17714 & 124;
  if (D.17715 != 0) goto <D.17711>; else goto <D.17712>;
  <D.17711>:
  D.17716 = 0;
  return D.17716;
  <D.17712>:
  D.17717 = m->klass;
  D.17718 = D.17717->image;
  D.17719 = mono_security_core_clr_is_platform_image (D.17718);
  if (D.17719 == 0) goto <D.17720>; else goto <D.17721>;
  <D.17720>:
  cookie->caller = m;
  D.17716 = 1;
  return D.17716;
  <D.17721>:
  D.17722 = cookie->depth;
  switch (D.17722) <default: <D.17358>, case 0: <D.17319>, case 1: <D.17357>>
  <D.17319>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 15;
    if (__s2_len <= 3) goto <D.17724>; else goto <D.17725>;
    <D.17724>:
    {
      const unsigned char * __s2;
      int __result;

      D.17717 = m->klass;
      __s2 = D.17717->name_space;
      D.17726 = "System.Security";
      D.17727 = MEM[(const unsigned char *)D.17726];
      D.17728 = (int) D.17727;
      D.17729 = *__s2;
      D.17730 = (int) D.17729;
      __result = D.17728 - D.17730;
      {
        D.17731 = __s2_len != 0;
        D.17732 = __result == 0;
        D.17733 = D.17731 & D.17732;
        if (D.17733 != 0) goto <D.17734>; else goto <D.17735>;
        <D.17734>:
        D.17736 = &MEM[(void *)"System.Security" + 1B];
        D.17737 = *D.17736;
        D.17738 = (int) D.17737;
        D.17739 = __s2 + 1;
        D.17740 = *D.17739;
        D.17741 = (int) D.17740;
        __result = D.17738 - D.17741;
        D.17742 = __s2_len > 1;
        D.17732 = __result == 0;
        D.17743 = D.17742 & D.17732;
        if (D.17743 != 0) goto <D.17744>; else goto <D.17745>;
        <D.17744>:
        D.17746 = &MEM[(void *)"System.Security" + 2B];
        D.17747 = *D.17746;
        D.17748 = (int) D.17747;
        D.17749 = __s2 + 2;
        D.17750 = *D.17749;
        D.17751 = (int) D.17750;
        __result = D.17748 - D.17751;
        D.17752 = __s2_len > 2;
        D.17732 = __result == 0;
        D.17753 = D.17752 & D.17732;
        if (D.17753 != 0) goto <D.17754>; else goto <D.17755>;
        <D.17754>:
        D.17756 = &MEM[(void *)"System.Security" + 3B];
        D.17757 = *D.17756;
        D.17758 = (int) D.17757;
        D.17759 = __s2 + 3;
        D.17760 = *D.17759;
        D.17761 = (int) D.17760;
        __result = D.17758 - D.17761;
        <D.17755>:
        <D.17745>:
        <D.17735>:
      }
      D.17327 = __result;
    }
    iftmp.9 = -D.17327;
    goto <D.17762>;
    <D.17725>:
    D.17717 = m->klass;
    D.17763 = D.17717->name_space;
    iftmp.9 = __builtin_strcmp (D.17763, "System.Security");
    <D.17762>:
    D.17328 = iftmp.9;
  }
  if (D.17328 != 0) goto <D.17764>; else goto <D.17765>;
  <D.17764>:
  D.17716 = 0;
  return D.17716;
  <D.17765>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 15;
    if (__s2_len <= 3) goto <D.17767>; else goto <D.17768>;
    <D.17767>:
    {
      const unsigned char * __s2;
      int __result;

      D.17717 = m->klass;
      __s2 = D.17717->name;
      D.17769 = "SecurityManager";
      D.17770 = MEM[(const unsigned char *)D.17769];
      D.17771 = (int) D.17770;
      D.17772 = *__s2;
      D.17773 = (int) D.17772;
      __result = D.17771 - D.17773;
      {
        D.17774 = __s2_len != 0;
        D.17775 = __result == 0;
        D.17776 = D.17774 & D.17775;
        if (D.17776 != 0) goto <D.17777>; else goto <D.17778>;
        <D.17777>:
        D.17779 = &MEM[(void *)"SecurityManager" + 1B];
        D.17780 = *D.17779;
        D.17781 = (int) D.17780;
        D.17782 = __s2 + 1;
        D.17783 = *D.17782;
        D.17784 = (int) D.17783;
        __result = D.17781 - D.17784;
        D.17785 = __s2_len > 1;
        D.17775 = __result == 0;
        D.17786 = D.17785 & D.17775;
        if (D.17786 != 0) goto <D.17787>; else goto <D.17788>;
        <D.17787>:
        D.17789 = &MEM[(void *)"SecurityManager" + 2B];
        D.17790 = *D.17789;
        D.17791 = (int) D.17790;
        D.17792 = __s2 + 2;
        D.17793 = *D.17792;
        D.17794 = (int) D.17793;
        __result = D.17791 - D.17794;
        D.17795 = __s2_len > 2;
        D.17775 = __result == 0;
        D.17796 = D.17795 & D.17775;
        if (D.17796 != 0) goto <D.17797>; else goto <D.17798>;
        <D.17797>:
        D.17799 = &MEM[(void *)"SecurityManager" + 3B];
        D.17800 = *D.17799;
        D.17801 = (int) D.17800;
        D.17802 = __s2 + 3;
        D.17803 = *D.17802;
        D.17804 = (int) D.17803;
        __result = D.17801 - D.17804;
        <D.17798>:
        <D.17788>:
        <D.17778>:
      }
      D.17336 = __result;
    }
    iftmp.10 = -D.17336;
    goto <D.17805>;
    <D.17768>:
    D.17717 = m->klass;
    D.17806 = D.17717->name;
    iftmp.10 = __builtin_strcmp (D.17806, "SecurityManager");
    <D.17805>:
    D.17337 = iftmp.10;
  }
  if (D.17337 != 0) goto <D.17807>; else goto <D.17808>;
  <D.17807>:
  D.17716 = 0;
  return D.17716;
  <D.17808>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 25;
    if (__s2_len <= 3) goto <D.17810>; else goto <D.17811>;
    <D.17810>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = m->name;
      D.17812 = "EnsureElevatedPermissions";
      D.17813 = MEM[(const unsigned char *)D.17812];
      D.17814 = (int) D.17813;
      D.17815 = *__s2;
      D.17816 = (int) D.17815;
      __result = D.17814 - D.17816;
      {
        D.17817 = __s2_len != 0;
        D.17818 = __result == 0;
        D.17819 = D.17817 & D.17818;
        if (D.17819 != 0) goto <D.17820>; else goto <D.17821>;
        <D.17820>:
        D.17822 = &MEM[(void *)"EnsureElevatedPermissions" + 1B];
        D.17823 = *D.17822;
        D.17824 = (int) D.17823;
        D.17825 = __s2 + 1;
        D.17826 = *D.17825;
        D.17827 = (int) D.17826;
        __result = D.17824 - D.17827;
        D.17828 = __s2_len > 1;
        D.17818 = __result == 0;
        D.17829 = D.17828 & D.17818;
        if (D.17829 != 0) goto <D.17830>; else goto <D.17831>;
        <D.17830>:
        D.17832 = &MEM[(void *)"EnsureElevatedPermissions" + 2B];
        D.17833 = *D.17832;
        D.17834 = (int) D.17833;
        D.17835 = __s2 + 2;
        D.17836 = *D.17835;
        D.17837 = (int) D.17836;
        __result = D.17834 - D.17837;
        D.17838 = __s2_len > 2;
        D.17818 = __result == 0;
        D.17839 = D.17838 & D.17818;
        if (D.17839 != 0) goto <D.17840>; else goto <D.17841>;
        <D.17840>:
        D.17842 = &MEM[(void *)"EnsureElevatedPermissions" + 3B];
        D.17843 = *D.17842;
        D.17844 = (int) D.17843;
        D.17845 = __s2 + 3;
        D.17846 = *D.17845;
        D.17847 = (int) D.17846;
        __result = D.17844 - D.17847;
        <D.17841>:
        <D.17831>:
        <D.17821>:
      }
      D.17345 = __result;
    }
    iftmp.11 = -D.17345;
    goto <D.17848>;
    <D.17811>:
    D.17849 = m->name;
    iftmp.11 = __builtin_strcmp (D.17849, "EnsureElevatedPermissions");
    <D.17848>:
    D.17346 = iftmp.11;
  }
  if (D.17346 != 0) goto <D.17850>; else goto <D.17851>;
  <D.17850>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 24;
    if (__s2_len <= 3) goto <D.17853>; else goto <D.17854>;
    <D.17853>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = m->name;
      D.17855 = "CheckElevatedPermissions";
      D.17856 = MEM[(const unsigned char *)D.17855];
      D.17857 = (int) D.17856;
      D.17858 = *__s2;
      D.17859 = (int) D.17858;
      __result = D.17857 - D.17859;
      {
        D.17860 = __s2_len != 0;
        D.17861 = __result == 0;
        D.17862 = D.17860 & D.17861;
        if (D.17862 != 0) goto <D.17863>; else goto <D.17864>;
        <D.17863>:
        D.17865 = &MEM[(void *)"CheckElevatedPermissions" + 1B];
        D.17866 = *D.17865;
        D.17867 = (int) D.17866;
        D.17868 = __s2 + 1;
        D.17869 = *D.17868;
        D.17870 = (int) D.17869;
        __result = D.17867 - D.17870;
        D.17871 = __s2_len > 1;
        D.17861 = __result == 0;
        D.17872 = D.17871 & D.17861;
        if (D.17872 != 0) goto <D.17873>; else goto <D.17874>;
        <D.17873>:
        D.17875 = &MEM[(void *)"CheckElevatedPermissions" + 2B];
        D.17876 = *D.17875;
        D.17877 = (int) D.17876;
        D.17878 = __s2 + 2;
        D.17879 = *D.17878;
        D.17880 = (int) D.17879;
        __result = D.17877 - D.17880;
        D.17881 = __s2_len > 2;
        D.17861 = __result == 0;
        D.17882 = D.17881 & D.17861;
        if (D.17882 != 0) goto <D.17883>; else goto <D.17884>;
        <D.17883>:
        D.17885 = &MEM[(void *)"CheckElevatedPermissions" + 3B];
        D.17886 = *D.17885;
        D.17887 = (int) D.17886;
        D.17888 = __s2 + 3;
        D.17889 = *D.17888;
        D.17890 = (int) D.17889;
        __result = D.17887 - D.17890;
        <D.17884>:
        <D.17874>:
        <D.17864>:
      }
      D.17354 = __result;
    }
    iftmp.12 = -D.17354;
    goto <D.17891>;
    <D.17854>:
    D.17849 = m->name;
    iftmp.12 = __builtin_strcmp (D.17849, "CheckElevatedPermissions");
    <D.17891>:
    D.17355 = iftmp.12;
  }
  if (D.17355 != 0) goto <D.17892>; else goto <D.17893>;
  <D.17892>:
  D.17716 = 0;
  return D.17716;
  <D.17893>:
  <D.17851>:
  cookie->depth = 1;
  goto <D.17356>;
  <D.17357>:
  cookie->depth = 2;
  goto <D.17356>;
  <D.17358>:
  D.17722 = cookie->depth;
  D.17894 = D.17722 + 1;
  cookie->depth = D.17894;
  D.17895 = mono_security_core_clr_method_level (m, 1);
  if (D.17895 == 0) goto <D.17356>; else goto <D.17896>;
  <D.17896>:
  cookie->caller = m;
  D.17716 = 1;
  return D.17716;
  <D.17356>:
  D.17716 = 0;
  return D.17716;
}


mono_security_core_clr_ensure_reflection_access_field (struct MonoClassField * field)
{
  <unnamed type> D.17898;
  <unnamed type> D.17901;
  unsigned int D.17902;
  struct MonoClass * D.17905;
  struct MonoImage * D.17906;
  int D.17907;
  struct MonoClass * D.17910;
  <unnamed type> D.17911;
  struct MonoException * D.17914;
  int D.17915;
  struct MonoException * D.17918;
  struct MonoMethod * caller;

  caller = get_reflection_caller ();
  D.17898 = mono_security_core_clr_method_level (caller, 1);
  if (D.17898 != 0) goto <D.17899>; else goto <D.17900>;
  <D.17899>:
  return;
  <D.17900>:
  D.17901 = mono_security_core_clr_get_options ();
  D.17902 = D.17901 & 1;
  if (D.17902 != 0) goto <D.17903>; else goto <D.17904>;
  <D.17903>:
  D.17905 = mono_field_get_parent (field);
  D.17906 = D.17905->image;
  D.17907 = mono_security_core_clr_is_platform_image (D.17906);
  if (D.17907 == 0) goto <D.17908>; else goto <D.17909>;
  <D.17908>:
  return;
  <D.17909>:
  <D.17904>:
  D.17910 = mono_field_get_parent (field);
  D.17911 = mono_security_core_clr_class_level (D.17910);
  if (D.17911 == 2) goto <D.17912>; else goto <D.17913>;
  <D.17912>:
  D.17914 = get_field_access_exception ("Transparent method %s cannot get or set Critical field %s.", caller, field);
  mono_raise_exception (D.17914);
  <D.17913>:
  D.17915 = check_field_access (caller, field);
  if (D.17915 == 0) goto <D.17916>; else goto <D.17917>;
  <D.17916>:
  D.17918 = get_field_access_exception ("Transparent method %s cannot get or set private/internal field %s.", caller, field);
  mono_raise_exception (D.17918);
  <D.17917>:
}


get_reflection_caller ()
{
  struct MonoMethod * m.13;
  _Bool D.17921;
  long int D.17922;
  long int D.17923;
  struct MonoMethod * D.17926;
  struct MonoMethod * m;

  try
    {
      m = 0B;
      mono_stack_walk_no_il (get_caller_no_reflection_related, &m);
      m.13 = m;
      D.17921 = m.13 == 0B;
      D.17922 = (long int) D.17921;
      D.17923 = __builtin_expect (D.17922, 0);
      if (D.17923 != 0) goto <D.17924>; else goto <D.17925>;
      <D.17924>:
      mono_trace (16, 64, "No caller outside reflection was found");
      <D.17925>:
      D.17926 = m;
      return D.17926;
    }
  finally
    {
      m = {CLOBBER};
    }
}


get_caller_no_reflection_related (struct MonoMethod * m, gint32 no, gint32 ilo, gboolean managed, void * data)
{
  gboolean D.17931;
  unsigned char D.17932;
  unsigned char D.17933;
  struct MonoClass * D.17936;
  char D.17940;
  struct MonoImage * D.17941;
  int D.17942;
  int D.17220;
  int iftmp.14;
  int D.17219;
  const char[18] * D.17948;
  unsigned char D.17949;
  int D.17950;
  unsigned char D.17951;
  int D.17952;
  _Bool D.17953;
  _Bool D.17954;
  _Bool D.17955;
  const unsigned char * D.17958;
  unsigned char D.17959;
  int D.17960;
  const unsigned char * D.17961;
  unsigned char D.17962;
  int D.17963;
  _Bool D.17964;
  _Bool D.17965;
  const unsigned char * D.17968;
  unsigned char D.17969;
  int D.17970;
  const unsigned char * D.17971;
  unsigned char D.17972;
  int D.17973;
  _Bool D.17974;
  _Bool D.17975;
  const unsigned char * D.17978;
  unsigned char D.17979;
  int D.17980;
  const unsigned char * D.17981;
  unsigned char D.17982;
  int D.17983;
  int D.17229;
  int iftmp.15;
  int D.17228;
  const char[23] * D.17990;
  unsigned char D.17991;
  int D.17992;
  unsigned char D.17993;
  int D.17994;
  _Bool D.17995;
  _Bool D.17996;
  _Bool D.17997;
  const unsigned char * D.18000;
  unsigned char D.18001;
  int D.18002;
  const unsigned char * D.18003;
  unsigned char D.18004;
  int D.18005;
  _Bool D.18006;
  _Bool D.18007;
  const unsigned char * D.18010;
  unsigned char D.18011;
  int D.18012;
  const unsigned char * D.18013;
  unsigned char D.18014;
  int D.18015;
  _Bool D.18016;
  _Bool D.18017;
  const unsigned char * D.18020;
  unsigned char D.18021;
  int D.18022;
  const unsigned char * D.18023;
  unsigned char D.18024;
  int D.18025;
  int D.17238;
  int iftmp.16;
  int D.17237;
  const char[7] * D.18032;
  unsigned char D.18033;
  int D.18034;
  unsigned char D.18035;
  int D.18036;
  _Bool D.18037;
  _Bool D.18038;
  _Bool D.18039;
  const unsigned char * D.18042;
  unsigned char D.18043;
  int D.18044;
  const unsigned char * D.18045;
  unsigned char D.18046;
  int D.18047;
  _Bool D.18048;
  _Bool D.18049;
  const unsigned char * D.18052;
  unsigned char D.18053;
  int D.18054;
  const unsigned char * D.18055;
  unsigned char D.18056;
  int D.18057;
  _Bool D.18058;
  _Bool D.18059;
  const unsigned char * D.18062;
  unsigned char D.18063;
  int D.18064;
  const unsigned char * D.18065;
  unsigned char D.18066;
  int D.18067;
  char D.18071;
  int D.17248;
  int iftmp.17;
  int D.17247;
  const char[10] * D.18077;
  unsigned char D.18078;
  int D.18079;
  unsigned char D.18080;
  int D.18081;
  _Bool D.18082;
  _Bool D.18083;
  _Bool D.18084;
  const unsigned char * D.18087;
  unsigned char D.18088;
  int D.18089;
  const unsigned char * D.18090;
  unsigned char D.18091;
  int D.18092;
  _Bool D.18093;
  _Bool D.18094;
  const unsigned char * D.18097;
  unsigned char D.18098;
  int D.18099;
  const unsigned char * D.18100;
  unsigned char D.18101;
  int D.18102;
  _Bool D.18103;
  _Bool D.18104;
  const unsigned char * D.18107;
  unsigned char D.18108;
  int D.18109;
  const unsigned char * D.18110;
  unsigned char D.18111;
  int D.18112;
  int D.17257;
  int iftmp.18;
  int D.17256;
  const char[5] * D.18123;
  unsigned char D.18124;
  int D.18125;
  unsigned char D.18126;
  int D.18127;
  _Bool D.18128;
  _Bool D.18129;
  _Bool D.18130;
  const unsigned char * D.18133;
  unsigned char D.18134;
  int D.18135;
  const unsigned char * D.18136;
  unsigned char D.18137;
  int D.18138;
  _Bool D.18139;
  _Bool D.18140;
  const unsigned char * D.18143;
  unsigned char D.18144;
  int D.18145;
  const unsigned char * D.18146;
  unsigned char D.18147;
  int D.18148;
  _Bool D.18149;
  _Bool D.18150;
  const unsigned char * D.18153;
  unsigned char D.18154;
  int D.18155;
  const unsigned char * D.18156;
  unsigned char D.18157;
  int D.18158;
  int D.17266;
  int iftmp.19;
  int D.17265;
  const char[9] * D.18164;
  unsigned char D.18165;
  int D.18166;
  unsigned char D.18167;
  int D.18168;
  _Bool D.18169;
  _Bool D.18170;
  _Bool D.18171;
  const unsigned char * D.18174;
  unsigned char D.18175;
  int D.18176;
  const unsigned char * D.18177;
  unsigned char D.18178;
  int D.18179;
  _Bool D.18180;
  _Bool D.18181;
  const unsigned char * D.18184;
  unsigned char D.18185;
  int D.18186;
  const unsigned char * D.18187;
  unsigned char D.18188;
  int D.18189;
  _Bool D.18190;
  _Bool D.18191;
  const unsigned char * D.18194;
  unsigned char D.18195;
  int D.18196;
  const unsigned char * D.18197;
  unsigned char D.18198;
  int D.18199;
  int D.17275;
  int iftmp.20;
  int D.17274;
  const char[13] * D.18204;
  unsigned char D.18205;
  int D.18206;
  unsigned char D.18207;
  int D.18208;
  _Bool D.18209;
  _Bool D.18210;
  _Bool D.18211;
  const unsigned char * D.18214;
  unsigned char D.18215;
  int D.18216;
  const unsigned char * D.18217;
  unsigned char D.18218;
  int D.18219;
  _Bool D.18220;
  _Bool D.18221;
  const unsigned char * D.18224;
  unsigned char D.18225;
  int D.18226;
  const unsigned char * D.18227;
  unsigned char D.18228;
  int D.18229;
  _Bool D.18230;
  _Bool D.18231;
  const unsigned char * D.18234;
  unsigned char D.18235;
  int D.18236;
  const unsigned char * D.18237;
  unsigned char D.18238;
  int D.18239;
  const char * D.18241;
  int D.17284;
  int iftmp.21;
  int D.17283;
  const char[9] * D.18251;
  unsigned char D.18252;
  int D.18253;
  unsigned char D.18254;
  int D.18255;
  _Bool D.18256;
  _Bool D.18257;
  _Bool D.18258;
  const unsigned char * D.18261;
  unsigned char D.18262;
  int D.18263;
  const unsigned char * D.18264;
  unsigned char D.18265;
  int D.18266;
  _Bool D.18267;
  _Bool D.18268;
  const unsigned char * D.18271;
  unsigned char D.18272;
  int D.18273;
  const unsigned char * D.18274;
  unsigned char D.18275;
  int D.18276;
  _Bool D.18277;
  _Bool D.18278;
  const unsigned char * D.18281;
  unsigned char D.18282;
  int D.18283;
  const unsigned char * D.18284;
  unsigned char D.18285;
  int D.18286;
  int D.17293;
  int iftmp.22;
  int D.17292;
  const char[18] * D.18292;
  unsigned char D.18293;
  int D.18294;
  unsigned char D.18295;
  int D.18296;
  _Bool D.18297;
  _Bool D.18298;
  _Bool D.18299;
  const unsigned char * D.18302;
  unsigned char D.18303;
  int D.18304;
  const unsigned char * D.18305;
  unsigned char D.18306;
  int D.18307;
  _Bool D.18308;
  _Bool D.18309;
  const unsigned char * D.18312;
  unsigned char D.18313;
  int D.18314;
  const unsigned char * D.18315;
  unsigned char D.18316;
  int D.18317;
  _Bool D.18318;
  _Bool D.18319;
  const unsigned char * D.18322;
  unsigned char D.18323;
  int D.18324;
  const unsigned char * D.18325;
  unsigned char D.18326;
  int D.18327;
  int D.17302;
  int iftmp.23;
  int D.17301;
  const char[14] * D.18332;
  unsigned char D.18333;
  int D.18334;
  unsigned char D.18335;
  int D.18336;
  _Bool D.18337;
  _Bool D.18338;
  _Bool D.18339;
  const unsigned char * D.18342;
  unsigned char D.18343;
  int D.18344;
  const unsigned char * D.18345;
  unsigned char D.18346;
  int D.18347;
  _Bool D.18348;
  _Bool D.18349;
  const unsigned char * D.18352;
  unsigned char D.18353;
  int D.18354;
  const unsigned char * D.18355;
  unsigned char D.18356;
  int D.18357;
  _Bool D.18358;
  _Bool D.18359;
  const unsigned char * D.18362;
  unsigned char D.18363;
  int D.18364;
  const unsigned char * D.18365;
  unsigned char D.18366;
  int D.18367;
  struct MonoMethod * D.18371;
  struct MonoMethod * * dest;
  const char * ns;

  dest = data;
  if (managed == 0) goto <D.17929>; else goto <D.17930>;
  <D.17929>:
  D.17931 = 0;
  return D.17931;
  <D.17930>:
  D.17932 = BIT_FIELD_REF <*m, 8, 160>;
  D.17933 = D.17932 & 124;
  if (D.17933 != 0) goto <D.17934>; else goto <D.17935>;
  <D.17934>:
  D.17931 = 0;
  return D.17931;
  <D.17935>:
  D.17936 = m->klass;
  ns = D.17936->name_space;
  if (ns == 0B) goto <D.17937>; else goto <D.17939>;
  <D.17939>:
  D.17940 = *ns;
  if (D.17940 != 83) goto <D.17937>; else goto <D.17938>;
  <D.17937>:
  *dest = m;
  D.17931 = 1;
  return D.17931;
  <D.17938>:
  D.17936 = m->klass;
  D.17941 = D.17936->image;
  D.17942 = mono_security_core_clr_is_platform_image (D.17941);
  if (D.17942 == 0) goto <D.17943>; else goto <D.17944>;
  <D.17943>:
  *dest = m;
  D.17931 = 1;
  return D.17931;
  <D.17944>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 17;
    if (__s2_len <= 3) goto <D.17946>; else goto <D.17947>;
    <D.17946>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = ns;
      D.17948 = "System.Reflection";
      D.17949 = MEM[(const unsigned char *)D.17948];
      D.17950 = (int) D.17949;
      D.17951 = *__s2;
      D.17952 = (int) D.17951;
      __result = D.17950 - D.17952;
      {
        D.17953 = __s2_len != 0;
        D.17954 = __result == 0;
        D.17955 = D.17953 & D.17954;
        if (D.17955 != 0) goto <D.17956>; else goto <D.17957>;
        <D.17956>:
        D.17958 = &MEM[(void *)"System.Reflection" + 1B];
        D.17959 = *D.17958;
        D.17960 = (int) D.17959;
        D.17961 = __s2 + 1;
        D.17962 = *D.17961;
        D.17963 = (int) D.17962;
        __result = D.17960 - D.17963;
        D.17964 = __s2_len > 1;
        D.17954 = __result == 0;
        D.17965 = D.17964 & D.17954;
        if (D.17965 != 0) goto <D.17966>; else goto <D.17967>;
        <D.17966>:
        D.17968 = &MEM[(void *)"System.Reflection" + 2B];
        D.17969 = *D.17968;
        D.17970 = (int) D.17969;
        D.17971 = __s2 + 2;
        D.17972 = *D.17971;
        D.17973 = (int) D.17972;
        __result = D.17970 - D.17973;
        D.17974 = __s2_len > 2;
        D.17954 = __result == 0;
        D.17975 = D.17974 & D.17954;
        if (D.17975 != 0) goto <D.17976>; else goto <D.17977>;
        <D.17976>:
        D.17978 = &MEM[(void *)"System.Reflection" + 3B];
        D.17979 = *D.17978;
        D.17980 = (int) D.17979;
        D.17981 = __s2 + 3;
        D.17982 = *D.17981;
        D.17983 = (int) D.17982;
        __result = D.17980 - D.17983;
        <D.17977>:
        <D.17967>:
        <D.17957>:
      }
      D.17219 = __result;
    }
    iftmp.14 = -D.17219;
    goto <D.17984>;
    <D.17947>:
    iftmp.14 = __builtin_strcmp (ns, "System.Reflection");
    <D.17984>:
    D.17220 = iftmp.14;
  }
  if (D.17220 == 0) goto <D.17985>; else goto <D.17986>;
  <D.17985>:
  D.17931 = 0;
  return D.17931;
  <D.17986>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 22;
    if (__s2_len <= 3) goto <D.17988>; else goto <D.17989>;
    <D.17988>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = ns;
      D.17990 = "System.Reflection.Emit";
      D.17991 = MEM[(const unsigned char *)D.17990];
      D.17992 = (int) D.17991;
      D.17993 = *__s2;
      D.17994 = (int) D.17993;
      __result = D.17992 - D.17994;
      {
        D.17995 = __s2_len != 0;
        D.17996 = __result == 0;
        D.17997 = D.17995 & D.17996;
        if (D.17997 != 0) goto <D.17998>; else goto <D.17999>;
        <D.17998>:
        D.18000 = &MEM[(void *)"System.Reflection.Emit" + 1B];
        D.18001 = *D.18000;
        D.18002 = (int) D.18001;
        D.18003 = __s2 + 1;
        D.18004 = *D.18003;
        D.18005 = (int) D.18004;
        __result = D.18002 - D.18005;
        D.18006 = __s2_len > 1;
        D.17996 = __result == 0;
        D.18007 = D.18006 & D.17996;
        if (D.18007 != 0) goto <D.18008>; else goto <D.18009>;
        <D.18008>:
        D.18010 = &MEM[(void *)"System.Reflection.Emit" + 2B];
        D.18011 = *D.18010;
        D.18012 = (int) D.18011;
        D.18013 = __s2 + 2;
        D.18014 = *D.18013;
        D.18015 = (int) D.18014;
        __result = D.18012 - D.18015;
        D.18016 = __s2_len > 2;
        D.17996 = __result == 0;
        D.18017 = D.18016 & D.17996;
        if (D.18017 != 0) goto <D.18018>; else goto <D.18019>;
        <D.18018>:
        D.18020 = &MEM[(void *)"System.Reflection.Emit" + 3B];
        D.18021 = *D.18020;
        D.18022 = (int) D.18021;
        D.18023 = __s2 + 3;
        D.18024 = *D.18023;
        D.18025 = (int) D.18024;
        __result = D.18022 - D.18025;
        <D.18019>:
        <D.18009>:
        <D.17999>:
      }
      D.17228 = __result;
    }
    iftmp.15 = -D.17228;
    goto <D.18026>;
    <D.17989>:
    iftmp.15 = __builtin_strcmp (ns, "System.Reflection.Emit");
    <D.18026>:
    D.17229 = iftmp.15;
  }
  if (D.17229 == 0) goto <D.18027>; else goto <D.18028>;
  <D.18027>:
  D.17931 = 0;
  return D.17931;
  <D.18028>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 6;
    if (__s2_len <= 3) goto <D.18030>; else goto <D.18031>;
    <D.18030>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = ns;
      D.18032 = "System";
      D.18033 = MEM[(const unsigned char *)D.18032];
      D.18034 = (int) D.18033;
      D.18035 = *__s2;
      D.18036 = (int) D.18035;
      __result = D.18034 - D.18036;
      {
        D.18037 = __s2_len != 0;
        D.18038 = __result == 0;
        D.18039 = D.18037 & D.18038;
        if (D.18039 != 0) goto <D.18040>; else goto <D.18041>;
        <D.18040>:
        D.18042 = &MEM[(void *)"System" + 1B];
        D.18043 = *D.18042;
        D.18044 = (int) D.18043;
        D.18045 = __s2 + 1;
        D.18046 = *D.18045;
        D.18047 = (int) D.18046;
        __result = D.18044 - D.18047;
        D.18048 = __s2_len > 1;
        D.18038 = __result == 0;
        D.18049 = D.18048 & D.18038;
        if (D.18049 != 0) goto <D.18050>; else goto <D.18051>;
        <D.18050>:
        D.18052 = &MEM[(void *)"System" + 2B];
        D.18053 = *D.18052;
        D.18054 = (int) D.18053;
        D.18055 = __s2 + 2;
        D.18056 = *D.18055;
        D.18057 = (int) D.18056;
        __result = D.18054 - D.18057;
        D.18058 = __s2_len > 2;
        D.18038 = __result == 0;
        D.18059 = D.18058 & D.18038;
        if (D.18059 != 0) goto <D.18060>; else goto <D.18061>;
        <D.18060>:
        D.18062 = &MEM[(void *)"System" + 3B];
        D.18063 = *D.18062;
        D.18064 = (int) D.18063;
        D.18065 = __s2 + 3;
        D.18066 = *D.18065;
        D.18067 = (int) D.18066;
        __result = D.18064 - D.18067;
        <D.18061>:
        <D.18051>:
        <D.18041>:
      }
      D.17237 = __result;
    }
    iftmp.16 = -D.17237;
    goto <D.18068>;
    <D.18031>:
    iftmp.16 = __builtin_strcmp (ns, "System");
    <D.18068>:
    D.17238 = iftmp.16;
  }
  if (D.17238 == 0) goto <D.18069>; else goto <D.18070>;
  <D.18069>:
  {
    const char * kname;

    D.17936 = m->klass;
    kname = D.17936->name;
    D.18071 = *kname;
    if (D.18071 == 65) goto <D.18072>; else goto <D.18073>;
    <D.18072>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 9;
      if (__s2_len <= 3) goto <D.18075>; else goto <D.18076>;
      <D.18075>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18077 = "Activator";
        D.18078 = MEM[(const unsigned char *)D.18077];
        D.18079 = (int) D.18078;
        D.18080 = *__s2;
        D.18081 = (int) D.18080;
        __result = D.18079 - D.18081;
        {
          D.18082 = __s2_len != 0;
          D.18083 = __result == 0;
          D.18084 = D.18082 & D.18083;
          if (D.18084 != 0) goto <D.18085>; else goto <D.18086>;
          <D.18085>:
          D.18087 = &MEM[(void *)"Activator" + 1B];
          D.18088 = *D.18087;
          D.18089 = (int) D.18088;
          D.18090 = __s2 + 1;
          D.18091 = *D.18090;
          D.18092 = (int) D.18091;
          __result = D.18089 - D.18092;
          D.18093 = __s2_len > 1;
          D.18083 = __result == 0;
          D.18094 = D.18093 & D.18083;
          if (D.18094 != 0) goto <D.18095>; else goto <D.18096>;
          <D.18095>:
          D.18097 = &MEM[(void *)"Activator" + 2B];
          D.18098 = *D.18097;
          D.18099 = (int) D.18098;
          D.18100 = __s2 + 2;
          D.18101 = *D.18100;
          D.18102 = (int) D.18101;
          __result = D.18099 - D.18102;
          D.18103 = __s2_len > 2;
          D.18083 = __result == 0;
          D.18104 = D.18103 & D.18083;
          if (D.18104 != 0) goto <D.18105>; else goto <D.18106>;
          <D.18105>:
          D.18107 = &MEM[(void *)"Activator" + 3B];
          D.18108 = *D.18107;
          D.18109 = (int) D.18108;
          D.18110 = __s2 + 3;
          D.18111 = *D.18110;
          D.18112 = (int) D.18111;
          __result = D.18109 - D.18112;
          <D.18106>:
          <D.18096>:
          <D.18086>:
        }
        D.17247 = __result;
      }
      iftmp.17 = -D.17247;
      goto <D.18113>;
      <D.18076>:
      iftmp.17 = __builtin_strcmp (kname, "Activator");
      <D.18113>:
      D.17248 = iftmp.17;
    }
    if (D.17248 == 0) goto <D.18114>; else goto <D.18115>;
    <D.18114>:
    D.17931 = 0;
    return D.17931;
    <D.18115>:
    <D.18073>:
    D.18071 = *kname;
    if (D.18071 == 84) goto <D.18119>; else goto <D.18116>;
    <D.18119>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 4;
      if (__s2_len <= 3) goto <D.18121>; else goto <D.18122>;
      <D.18121>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18123 = "Type";
        D.18124 = MEM[(const unsigned char *)D.18123];
        D.18125 = (int) D.18124;
        D.18126 = *__s2;
        D.18127 = (int) D.18126;
        __result = D.18125 - D.18127;
        {
          D.18128 = __s2_len != 0;
          D.18129 = __result == 0;
          D.18130 = D.18128 & D.18129;
          if (D.18130 != 0) goto <D.18131>; else goto <D.18132>;
          <D.18131>:
          D.18133 = &MEM[(void *)"Type" + 1B];
          D.18134 = *D.18133;
          D.18135 = (int) D.18134;
          D.18136 = __s2 + 1;
          D.18137 = *D.18136;
          D.18138 = (int) D.18137;
          __result = D.18135 - D.18138;
          D.18139 = __s2_len > 1;
          D.18129 = __result == 0;
          D.18140 = D.18139 & D.18129;
          if (D.18140 != 0) goto <D.18141>; else goto <D.18142>;
          <D.18141>:
          D.18143 = &MEM[(void *)"Type" + 2B];
          D.18144 = *D.18143;
          D.18145 = (int) D.18144;
          D.18146 = __s2 + 2;
          D.18147 = *D.18146;
          D.18148 = (int) D.18147;
          __result = D.18145 - D.18148;
          D.18149 = __s2_len > 2;
          D.18129 = __result == 0;
          D.18150 = D.18149 & D.18129;
          if (D.18150 != 0) goto <D.18151>; else goto <D.18152>;
          <D.18151>:
          D.18153 = &MEM[(void *)"Type" + 3B];
          D.18154 = *D.18153;
          D.18155 = (int) D.18154;
          D.18156 = __s2 + 3;
          D.18157 = *D.18156;
          D.18158 = (int) D.18157;
          __result = D.18155 - D.18158;
          <D.18152>:
          <D.18142>:
          <D.18132>:
        }
        D.17256 = __result;
      }
      iftmp.18 = -D.17256;
      goto <D.18159>;
      <D.18122>:
      iftmp.18 = __builtin_strcmp (kname, "Type");
      <D.18159>:
      D.17257 = iftmp.18;
    }
    if (D.17257 == 0) goto <D.18117>; else goto <D.18116>;
    <D.18116>:
    D.18071 = *kname;
    if (D.18071 == 77) goto <D.18160>; else goto <D.18118>;
    <D.18160>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 8;
      if (__s2_len <= 3) goto <D.18162>; else goto <D.18163>;
      <D.18162>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18164 = "MonoType";
        D.18165 = MEM[(const unsigned char *)D.18164];
        D.18166 = (int) D.18165;
        D.18167 = *__s2;
        D.18168 = (int) D.18167;
        __result = D.18166 - D.18168;
        {
          D.18169 = __s2_len != 0;
          D.18170 = __result == 0;
          D.18171 = D.18169 & D.18170;
          if (D.18171 != 0) goto <D.18172>; else goto <D.18173>;
          <D.18172>:
          D.18174 = &MEM[(void *)"MonoType" + 1B];
          D.18175 = *D.18174;
          D.18176 = (int) D.18175;
          D.18177 = __s2 + 1;
          D.18178 = *D.18177;
          D.18179 = (int) D.18178;
          __result = D.18176 - D.18179;
          D.18180 = __s2_len > 1;
          D.18170 = __result == 0;
          D.18181 = D.18180 & D.18170;
          if (D.18181 != 0) goto <D.18182>; else goto <D.18183>;
          <D.18182>:
          D.18184 = &MEM[(void *)"MonoType" + 2B];
          D.18185 = *D.18184;
          D.18186 = (int) D.18185;
          D.18187 = __s2 + 2;
          D.18188 = *D.18187;
          D.18189 = (int) D.18188;
          __result = D.18186 - D.18189;
          D.18190 = __s2_len > 2;
          D.18170 = __result == 0;
          D.18191 = D.18190 & D.18170;
          if (D.18191 != 0) goto <D.18192>; else goto <D.18193>;
          <D.18192>:
          D.18194 = &MEM[(void *)"MonoType" + 3B];
          D.18195 = *D.18194;
          D.18196 = (int) D.18195;
          D.18197 = __s2 + 3;
          D.18198 = *D.18197;
          D.18199 = (int) D.18198;
          __result = D.18196 - D.18199;
          <D.18193>:
          <D.18183>:
          <D.18173>:
        }
        D.17265 = __result;
      }
      iftmp.19 = -D.17265;
      goto <D.18200>;
      <D.18163>:
      iftmp.19 = __builtin_strcmp (kname, "MonoType");
      <D.18200>:
      D.17266 = iftmp.19;
    }
    if (D.17266 == 0) goto <D.18117>; else goto <D.18118>;
    <D.18117>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 12;
      if (__s2_len <= 3) goto <D.18202>; else goto <D.18203>;
      <D.18202>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = m->name;
        D.18204 = "InvokeMember";
        D.18205 = MEM[(const unsigned char *)D.18204];
        D.18206 = (int) D.18205;
        D.18207 = *__s2;
        D.18208 = (int) D.18207;
        __result = D.18206 - D.18208;
        {
          D.18209 = __s2_len != 0;
          D.18210 = __result == 0;
          D.18211 = D.18209 & D.18210;
          if (D.18211 != 0) goto <D.18212>; else goto <D.18213>;
          <D.18212>:
          D.18214 = &MEM[(void *)"InvokeMember" + 1B];
          D.18215 = *D.18214;
          D.18216 = (int) D.18215;
          D.18217 = __s2 + 1;
          D.18218 = *D.18217;
          D.18219 = (int) D.18218;
          __result = D.18216 - D.18219;
          D.18220 = __s2_len > 1;
          D.18210 = __result == 0;
          D.18221 = D.18220 & D.18210;
          if (D.18221 != 0) goto <D.18222>; else goto <D.18223>;
          <D.18222>:
          D.18224 = &MEM[(void *)"InvokeMember" + 2B];
          D.18225 = *D.18224;
          D.18226 = (int) D.18225;
          D.18227 = __s2 + 2;
          D.18228 = *D.18227;
          D.18229 = (int) D.18228;
          __result = D.18226 - D.18229;
          D.18230 = __s2_len > 2;
          D.18210 = __result == 0;
          D.18231 = D.18230 & D.18210;
          if (D.18231 != 0) goto <D.18232>; else goto <D.18233>;
          <D.18232>:
          D.18234 = &MEM[(void *)"InvokeMember" + 3B];
          D.18235 = *D.18234;
          D.18236 = (int) D.18235;
          D.18237 = __s2 + 3;
          D.18238 = *D.18237;
          D.18239 = (int) D.18238;
          __result = D.18236 - D.18239;
          <D.18233>:
          <D.18223>:
          <D.18213>:
        }
        D.17274 = __result;
      }
      iftmp.20 = -D.17274;
      goto <D.18240>;
      <D.18203>:
      D.18241 = m->name;
      iftmp.20 = __builtin_strcmp (D.18241, "InvokeMember");
      <D.18240>:
      D.17275 = iftmp.20;
    }
    if (D.17275 == 0) goto <D.18242>; else goto <D.18243>;
    <D.18242>:
    D.17931 = 0;
    return D.17931;
    <D.18243>:
    <D.18118>:
    D.18071 = *kname;
    if (D.18071 == 68) goto <D.18247>; else goto <D.18244>;
    <D.18247>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 8;
      if (__s2_len <= 3) goto <D.18249>; else goto <D.18250>;
      <D.18249>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18251 = "Delegate";
        D.18252 = MEM[(const unsigned char *)D.18251];
        D.18253 = (int) D.18252;
        D.18254 = *__s2;
        D.18255 = (int) D.18254;
        __result = D.18253 - D.18255;
        {
          D.18256 = __s2_len != 0;
          D.18257 = __result == 0;
          D.18258 = D.18256 & D.18257;
          if (D.18258 != 0) goto <D.18259>; else goto <D.18260>;
          <D.18259>:
          D.18261 = &MEM[(void *)"Delegate" + 1B];
          D.18262 = *D.18261;
          D.18263 = (int) D.18262;
          D.18264 = __s2 + 1;
          D.18265 = *D.18264;
          D.18266 = (int) D.18265;
          __result = D.18263 - D.18266;
          D.18267 = __s2_len > 1;
          D.18257 = __result == 0;
          D.18268 = D.18267 & D.18257;
          if (D.18268 != 0) goto <D.18269>; else goto <D.18270>;
          <D.18269>:
          D.18271 = &MEM[(void *)"Delegate" + 2B];
          D.18272 = *D.18271;
          D.18273 = (int) D.18272;
          D.18274 = __s2 + 2;
          D.18275 = *D.18274;
          D.18276 = (int) D.18275;
          __result = D.18273 - D.18276;
          D.18277 = __s2_len > 2;
          D.18257 = __result == 0;
          D.18278 = D.18277 & D.18257;
          if (D.18278 != 0) goto <D.18279>; else goto <D.18280>;
          <D.18279>:
          D.18281 = &MEM[(void *)"Delegate" + 3B];
          D.18282 = *D.18281;
          D.18283 = (int) D.18282;
          D.18284 = __s2 + 3;
          D.18285 = *D.18284;
          D.18286 = (int) D.18285;
          __result = D.18283 - D.18286;
          <D.18280>:
          <D.18270>:
          <D.18260>:
        }
        D.17283 = __result;
      }
      iftmp.21 = -D.17283;
      goto <D.18287>;
      <D.18250>:
      iftmp.21 = __builtin_strcmp (kname, "Delegate");
      <D.18287>:
      D.17284 = iftmp.21;
    }
    if (D.17284 == 0) goto <D.18245>; else goto <D.18244>;
    <D.18244>:
    D.18071 = *kname;
    if (D.18071 == 77) goto <D.18288>; else goto <D.18246>;
    <D.18288>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 17;
      if (__s2_len <= 3) goto <D.18290>; else goto <D.18291>;
      <D.18290>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = kname;
        D.18292 = "MulticastDelegate";
        D.18293 = MEM[(const unsigned char *)D.18292];
        D.18294 = (int) D.18293;
        D.18295 = *__s2;
        D.18296 = (int) D.18295;
        __result = D.18294 - D.18296;
        {
          D.18297 = __s2_len != 0;
          D.18298 = __result == 0;
          D.18299 = D.18297 & D.18298;
          if (D.18299 != 0) goto <D.18300>; else goto <D.18301>;
          <D.18300>:
          D.18302 = &MEM[(void *)"MulticastDelegate" + 1B];
          D.18303 = *D.18302;
          D.18304 = (int) D.18303;
          D.18305 = __s2 + 1;
          D.18306 = *D.18305;
          D.18307 = (int) D.18306;
          __result = D.18304 - D.18307;
          D.18308 = __s2_len > 1;
          D.18298 = __result == 0;
          D.18309 = D.18308 & D.18298;
          if (D.18309 != 0) goto <D.18310>; else goto <D.18311>;
          <D.18310>:
          D.18312 = &MEM[(void *)"MulticastDelegate" + 2B];
          D.18313 = *D.18312;
          D.18314 = (int) D.18313;
          D.18315 = __s2 + 2;
          D.18316 = *D.18315;
          D.18317 = (int) D.18316;
          __result = D.18314 - D.18317;
          D.18318 = __s2_len > 2;
          D.18298 = __result == 0;
          D.18319 = D.18318 & D.18298;
          if (D.18319 != 0) goto <D.18320>; else goto <D.18321>;
          <D.18320>:
          D.18322 = &MEM[(void *)"MulticastDelegate" + 3B];
          D.18323 = *D.18322;
          D.18324 = (int) D.18323;
          D.18325 = __s2 + 3;
          D.18326 = *D.18325;
          D.18327 = (int) D.18326;
          __result = D.18324 - D.18327;
          <D.18321>:
          <D.18311>:
          <D.18301>:
        }
        D.17292 = __result;
      }
      iftmp.22 = -D.17292;
      goto <D.18328>;
      <D.18291>:
      iftmp.22 = __builtin_strcmp (kname, "MulticastDelegate");
      <D.18328>:
      D.17293 = iftmp.22;
    }
    if (D.17293 == 0) goto <D.18245>; else goto <D.18246>;
    <D.18245>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 13;
      if (__s2_len <= 3) goto <D.18330>; else goto <D.18331>;
      <D.18330>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = m->name;
        D.18332 = "DynamicInvoke";
        D.18333 = MEM[(const unsigned char *)D.18332];
        D.18334 = (int) D.18333;
        D.18335 = *__s2;
        D.18336 = (int) D.18335;
        __result = D.18334 - D.18336;
        {
          D.18337 = __s2_len != 0;
          D.18338 = __result == 0;
          D.18339 = D.18337 & D.18338;
          if (D.18339 != 0) goto <D.18340>; else goto <D.18341>;
          <D.18340>:
          D.18342 = &MEM[(void *)"DynamicInvoke" + 1B];
          D.18343 = *D.18342;
          D.18344 = (int) D.18343;
          D.18345 = __s2 + 1;
          D.18346 = *D.18345;
          D.18347 = (int) D.18346;
          __result = D.18344 - D.18347;
          D.18348 = __s2_len > 1;
          D.18338 = __result == 0;
          D.18349 = D.18348 & D.18338;
          if (D.18349 != 0) goto <D.18350>; else goto <D.18351>;
          <D.18350>:
          D.18352 = &MEM[(void *)"DynamicInvoke" + 2B];
          D.18353 = *D.18352;
          D.18354 = (int) D.18353;
          D.18355 = __s2 + 2;
          D.18356 = *D.18355;
          D.18357 = (int) D.18356;
          __result = D.18354 - D.18357;
          D.18358 = __s2_len > 2;
          D.18338 = __result == 0;
          D.18359 = D.18358 & D.18338;
          if (D.18359 != 0) goto <D.18360>; else goto <D.18361>;
          <D.18360>:
          D.18362 = &MEM[(void *)"DynamicInvoke" + 3B];
          D.18363 = *D.18362;
          D.18364 = (int) D.18363;
          D.18365 = __s2 + 3;
          D.18366 = *D.18365;
          D.18367 = (int) D.18366;
          __result = D.18364 - D.18367;
          <D.18361>:
          <D.18351>:
          <D.18341>:
        }
        D.17301 = __result;
      }
      iftmp.23 = -D.17301;
      goto <D.18368>;
      <D.18331>:
      D.18241 = m->name;
      iftmp.23 = __builtin_strcmp (D.18241, "DynamicInvoke");
      <D.18368>:
      D.17302 = iftmp.23;
    }
    if (D.17302 != 0) goto <D.18369>; else goto <D.18370>;
    <D.18369>:
    D.17931 = 0;
    return D.17931;
    <D.18370>:
    <D.18246>:
  }
  <D.18070>:
  D.18371 = *dest;
  if (D.18371 == m) goto <D.18372>; else goto <D.18373>;
  <D.18372>:
  *dest = 0B;
  D.17931 = 0;
  return D.17931;
  <D.18373>:
  *dest = m;
  D.17931 = 1;
  return D.17931;
}


check_field_access (struct MonoMethod * caller, struct MonoClassField * field)
{
  int D.18377;
  gboolean D.18380;
  struct MonoClass * iftmp.24;
  unsigned int D.18382;
  unsigned int D.18383;

  if (caller != 0B) goto <D.18375>; else goto <D.18376>;
  <D.18375>:
  {
    struct MonoError error;
    struct MonoClass * klass;

    try
      {
        mono_field_get_type_checked (field, &error);
        D.18377 = mono_error_ok (&error);
        if (D.18377 == 0) goto <D.18378>; else goto <D.18379>;
        <D.18378>:
        mono_error_cleanup (&error);
        D.18380 = 0;
        return D.18380;
        <D.18379>:
        D.18382 = mono_field_get_flags (field);
        D.18383 = D.18382 & 16;
        if (D.18383 == 0) goto <D.18384>; else goto <D.18385>;
        <D.18384>:
        iftmp.24 = mono_field_get_parent (field);
        goto <D.18386>;
        <D.18385>:
        iftmp.24 = 0B;
        <D.18386>:
        klass = iftmp.24;
        D.18380 = mono_method_can_access_field_full (caller, field, klass);
        return D.18380;
      }
    finally
      {
        error = {CLOBBER};
      }
  }
  <D.18376>:
  D.18380 = 0;
  return D.18380;
}


get_field_access_exception (const char * format, struct MonoMethod * caller, struct MonoClassField * field)
{
  struct MonoException * D.18389;
  struct MonoException * ex;
  char * caller_name;
  char * field_name;
  char * message;

  caller_name = get_method_full_name (caller);
  field_name = mono_field_full_name (field);
  message = monoeg_g_strdup_printf (format, caller_name, field_name);
  monoeg_g_free (field_name);
  monoeg_g_free (caller_name);
  mono_trace (16, 64, message);
  ex = mono_get_exception_field_access_msg (message);
  monoeg_g_free (message);
  D.18389 = ex;
  return D.18389;
}


mono_security_core_clr_ensure_reflection_access_method (struct MonoMethod * method)
{
  <unnamed type> D.18391;
  <unnamed type> D.18394;
  unsigned int D.18395;
  struct MonoClass * D.18398;
  struct MonoImage * D.18399;
  int D.18400;
  <unnamed type> D.18403;
  struct MonoException * D.18406;
  int D.18407;
  struct MonoException * D.18410;
  struct MonoMethod * caller;

  caller = get_reflection_caller ();
  D.18391 = mono_security_core_clr_method_level (caller, 1);
  if (D.18391 != 0) goto <D.18392>; else goto <D.18393>;
  <D.18392>:
  return;
  <D.18393>:
  D.18394 = mono_security_core_clr_get_options ();
  D.18395 = D.18394 & 1;
  if (D.18395 != 0) goto <D.18396>; else goto <D.18397>;
  <D.18396>:
  D.18398 = method->klass;
  D.18399 = D.18398->image;
  D.18400 = mono_security_core_clr_is_platform_image (D.18399);
  if (D.18400 == 0) goto <D.18401>; else goto <D.18402>;
  <D.18401>:
  return;
  <D.18402>:
  <D.18397>:
  D.18403 = mono_security_core_clr_method_level (method, 1);
  if (D.18403 == 2) goto <D.18404>; else goto <D.18405>;
  <D.18404>:
  D.18406 = get_method_access_exception ("Transparent method %s cannot invoke Critical method %s.", caller, method);
  mono_raise_exception (D.18406);
  <D.18405>:
  D.18407 = check_method_access (caller, method);
  if (D.18407 == 0) goto <D.18408>; else goto <D.18409>;
  <D.18408>:
  D.18410 = get_method_access_exception ("Transparent method %s cannot invoke private/internal method %s.", caller, method);
  mono_raise_exception (D.18410);
  <D.18409>:
}


check_method_access (struct MonoMethod * caller, struct MonoMethod * callee)
{
  struct MonoClass * iftmp.25;
  short unsigned int D.18415;
  int D.18416;
  int D.18417;
  gboolean D.18421;

  if (caller != 0B) goto <D.18412>; else goto <D.18413>;
  <D.18412>:
  {
    struct MonoClass * klass;

    D.18415 = callee->flags;
    D.18416 = (int) D.18415;
    D.18417 = D.18416 & 16;
    if (D.18417 == 0) goto <D.18418>; else goto <D.18419>;
    <D.18418>:
    iftmp.25 = callee->klass;
    goto <D.18420>;
    <D.18419>:
    iftmp.25 = 0B;
    <D.18420>:
    klass = iftmp.25;
    D.18421 = mono_method_can_access_method_full (caller, callee, klass);
    return D.18421;
  }
  <D.18413>:
  D.18421 = 0;
  return D.18421;
}


get_method_access_exception (const char * format, struct MonoMethod * caller, struct MonoMethod * callee)
{
  struct MonoException * D.18423;
  struct MonoException * ex;
  char * caller_name;
  char * callee_name;
  char * message;

  caller_name = get_method_full_name (caller);
  callee_name = get_method_full_name (callee);
  message = monoeg_g_strdup_printf (format, caller_name, callee_name);
  monoeg_g_free (callee_name);
  monoeg_g_free (caller_name);
  mono_trace (16, 64, message);
  ex = mono_get_exception_method_access_msg (message);
  monoeg_g_free (message);
  D.18423 = ex;
  return D.18423;
}


mono_security_core_clr_ensure_delegate_creation (struct MonoMethod * method, gboolean throwOnBindFailure)
{
  int D.18425;
  gboolean D.18428;
  <unnamed type> D.18429;
  <unnamed type> D.18432;
  struct MonoException * D.18437;
  <unnamed type> D.18438;
  unsigned int D.18439;
  struct MonoClass * D.18442;
  struct MonoImage * D.18443;
  int D.18444;
  int D.18447;
  struct MonoException * D.18450;
  struct MonoMethod * caller;

  D.18425 = can_avoid_corlib_reflection_delegate_optimization (method);
  if (D.18425 != 0) goto <D.18426>; else goto <D.18427>;
  <D.18426>:
  D.18428 = 1;
  return D.18428;
  <D.18427>:
  caller = get_reflection_caller ();
  D.18429 = mono_security_core_clr_method_level (caller, 1);
  if (D.18429 != 0) goto <D.18430>; else goto <D.18431>;
  <D.18430>:
  D.18428 = 1;
  return D.18428;
  <D.18431>:
  D.18432 = mono_security_core_clr_method_level (method, 1);
  if (D.18432 == 2) goto <D.18433>; else goto <D.18434>;
  <D.18433>:
  if (throwOnBindFailure == 0) goto <D.18435>; else goto <D.18436>;
  <D.18435>:
  D.18428 = 0;
  return D.18428;
  <D.18436>:
  D.18437 = get_argument_exception ("Transparent method %s cannot create a delegate on Critical method %s.", caller, method);
  mono_raise_exception (D.18437);
  <D.18434>:
  D.18438 = mono_security_core_clr_get_options ();
  D.18439 = D.18438 & 2;
  if (D.18439 != 0) goto <D.18440>; else goto <D.18441>;
  <D.18440>:
  D.18442 = method->klass;
  D.18443 = D.18442->image;
  D.18444 = mono_security_core_clr_is_platform_image (D.18443);
  if (D.18444 == 0) goto <D.18445>; else goto <D.18446>;
  <D.18445>:
  D.18428 = 1;
  return D.18428;
  <D.18446>:
  <D.18441>:
  D.18447 = check_method_access (caller, method);
  if (D.18447 == 0) goto <D.18448>; else goto <D.18449>;
  <D.18448>:
  D.18450 = get_method_access_exception ("Transparent method %s cannot create a delegate on private/internal method %s.", caller, method);
  mono_raise_exception (D.18450);
  <D.18449>:
  D.18428 = 1;
  return D.18428;
}


can_avoid_corlib_reflection_delegate_optimization (struct MonoMethod * method)
{
  struct MonoClass * D.18452;
  struct MonoImage * D.18453;
  int D.18454;
  gboolean D.18457;
  int D.17420;
  int iftmp.26;
  int D.17419;
  const char[18] * D.18461;
  unsigned char D.18462;
  int D.18463;
  unsigned char D.18464;
  int D.18465;
  _Bool D.18466;
  _Bool D.18467;
  _Bool D.18468;
  const unsigned char * D.18471;
  unsigned char D.18472;
  int D.18473;
  const unsigned char * D.18474;
  unsigned char D.18475;
  int D.18476;
  _Bool D.18477;
  _Bool D.18478;
  const unsigned char * D.18481;
  unsigned char D.18482;
  int D.18483;
  const unsigned char * D.18484;
  unsigned char D.18485;
  int D.18486;
  _Bool D.18487;
  _Bool D.18488;
  const unsigned char * D.18491;
  unsigned char D.18492;
  int D.18493;
  const unsigned char * D.18494;
  unsigned char D.18495;
  int D.18496;
  const char * D.18498;
  int D.17429;
  int iftmp.27;
  int D.17428;
  const char[13] * D.18504;
  unsigned char D.18505;
  int D.18506;
  unsigned char D.18507;
  int D.18508;
  _Bool D.18509;
  _Bool D.18510;
  _Bool D.18511;
  const unsigned char * D.18514;
  unsigned char D.18515;
  int D.18516;
  const unsigned char * D.18517;
  unsigned char D.18518;
  int D.18519;
  _Bool D.18520;
  _Bool D.18521;
  const unsigned char * D.18524;
  unsigned char D.18525;
  int D.18526;
  const unsigned char * D.18527;
  unsigned char D.18528;
  int D.18529;
  _Bool D.18530;
  _Bool D.18531;
  const unsigned char * D.18534;
  unsigned char D.18535;
  int D.18536;
  const unsigned char * D.18537;
  unsigned char D.18538;
  int D.18539;
  const char * D.18541;
  int D.17438;
  int iftmp.28;
  int D.17437;
  const char[19] * D.18549;
  unsigned char D.18550;
  int D.18551;
  unsigned char D.18552;
  int D.18553;
  _Bool D.18554;
  _Bool D.18555;
  _Bool D.18556;
  const unsigned char * D.18559;
  unsigned char D.18560;
  int D.18561;
  const unsigned char * D.18562;
  unsigned char D.18563;
  int D.18564;
  _Bool D.18565;
  _Bool D.18566;
  const unsigned char * D.18569;
  unsigned char D.18570;
  int D.18571;
  const unsigned char * D.18572;
  unsigned char D.18573;
  int D.18574;
  _Bool D.18575;
  _Bool D.18576;
  const unsigned char * D.18579;
  unsigned char D.18580;
  int D.18581;
  const unsigned char * D.18582;
  unsigned char D.18583;
  int D.18584;
  const char * D.18586;
  int D.17447;
  int iftmp.29;
  int D.17446;
  const char[25] * D.18591;
  unsigned char D.18592;
  int D.18593;
  unsigned char D.18594;
  int D.18595;
  _Bool D.18596;
  _Bool D.18597;
  _Bool D.18598;
  const unsigned char * D.18601;
  unsigned char D.18602;
  int D.18603;
  const unsigned char * D.18604;
  unsigned char D.18605;
  int D.18606;
  _Bool D.18607;
  _Bool D.18608;
  const unsigned char * D.18611;
  unsigned char D.18612;
  int D.18613;
  const unsigned char * D.18614;
  unsigned char D.18615;
  int D.18616;
  _Bool D.18617;
  _Bool D.18618;
  const unsigned char * D.18621;
  unsigned char D.18622;
  int D.18623;
  const unsigned char * D.18624;
  unsigned char D.18625;
  int D.18626;
  int D.17456;
  int iftmp.30;
  int D.17455;
  const char[10] * D.18632;
  unsigned char D.18633;
  int D.18634;
  unsigned char D.18635;
  int D.18636;
  _Bool D.18637;
  _Bool D.18638;
  _Bool D.18639;
  const unsigned char * D.18642;
  unsigned char D.18643;
  int D.18644;
  const unsigned char * D.18645;
  unsigned char D.18646;
  int D.18647;
  _Bool D.18648;
  _Bool D.18649;
  const unsigned char * D.18652;
  unsigned char D.18653;
  int D.18654;
  const unsigned char * D.18655;
  unsigned char D.18656;
  int D.18657;
  _Bool D.18658;
  _Bool D.18659;
  const unsigned char * D.18662;
  unsigned char D.18663;
  int D.18664;
  const unsigned char * D.18665;
  unsigned char D.18666;
  int D.18667;
  int D.17465;
  int iftmp.31;
  int D.17464;
  const char[14] * D.18676;
  unsigned char D.18677;
  int D.18678;
  unsigned char D.18679;
  int D.18680;
  _Bool D.18681;
  _Bool D.18682;
  _Bool D.18683;
  const unsigned char * D.18686;
  unsigned char D.18687;
  int D.18688;
  const unsigned char * D.18689;
  unsigned char D.18690;
  int D.18691;
  _Bool D.18692;
  _Bool D.18693;
  const unsigned char * D.18696;
  unsigned char D.18697;
  int D.18698;
  const unsigned char * D.18699;
  unsigned char D.18700;
  int D.18701;
  _Bool D.18702;
  _Bool D.18703;
  const unsigned char * D.18706;
  unsigned char D.18707;
  int D.18708;
  const unsigned char * D.18709;
  unsigned char D.18710;
  int D.18711;
  int D.17474;
  int iftmp.32;
  int D.17473;
  const char[27] * D.18717;
  unsigned char D.18718;
  int D.18719;
  unsigned char D.18720;
  int D.18721;
  _Bool D.18722;
  _Bool D.18723;
  _Bool D.18724;
  const unsigned char * D.18727;
  unsigned char D.18728;
  int D.18729;
  const unsigned char * D.18730;
  unsigned char D.18731;
  int D.18732;
  _Bool D.18733;
  _Bool D.18734;
  const unsigned char * D.18737;
  unsigned char D.18738;
  int D.18739;
  const unsigned char * D.18740;
  unsigned char D.18741;
  int D.18742;
  _Bool D.18743;
  _Bool D.18744;
  const unsigned char * D.18747;
  unsigned char D.18748;
  int D.18749;
  const unsigned char * D.18750;
  unsigned char D.18751;
  int D.18752;

  D.18452 = method->klass;
  D.18453 = D.18452->image;
  D.18454 = mono_security_core_clr_is_platform_image (D.18453);
  if (D.18454 == 0) goto <D.18455>; else goto <D.18456>;
  <D.18455>:
  D.18457 = 0;
  return D.18457;
  <D.18456>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 17;
    if (__s2_len <= 3) goto <D.18459>; else goto <D.18460>;
    <D.18459>:
    {
      const unsigned char * __s2;
      int __result;

      D.18452 = method->klass;
      __s2 = D.18452->name_space;
      D.18461 = "System.Reflection";
      D.18462 = MEM[(const unsigned char *)D.18461];
      D.18463 = (int) D.18462;
      D.18464 = *__s2;
      D.18465 = (int) D.18464;
      __result = D.18463 - D.18465;
      {
        D.18466 = __s2_len != 0;
        D.18467 = __result == 0;
        D.18468 = D.18466 & D.18467;
        if (D.18468 != 0) goto <D.18469>; else goto <D.18470>;
        <D.18469>:
        D.18471 = &MEM[(void *)"System.Reflection" + 1B];
        D.18472 = *D.18471;
        D.18473 = (int) D.18472;
        D.18474 = __s2 + 1;
        D.18475 = *D.18474;
        D.18476 = (int) D.18475;
        __result = D.18473 - D.18476;
        D.18477 = __s2_len > 1;
        D.18467 = __result == 0;
        D.18478 = D.18477 & D.18467;
        if (D.18478 != 0) goto <D.18479>; else goto <D.18480>;
        <D.18479>:
        D.18481 = &MEM[(void *)"System.Reflection" + 2B];
        D.18482 = *D.18481;
        D.18483 = (int) D.18482;
        D.18484 = __s2 + 2;
        D.18485 = *D.18484;
        D.18486 = (int) D.18485;
        __result = D.18483 - D.18486;
        D.18487 = __s2_len > 2;
        D.18467 = __result == 0;
        D.18488 = D.18487 & D.18467;
        if (D.18488 != 0) goto <D.18489>; else goto <D.18490>;
        <D.18489>:
        D.18491 = &MEM[(void *)"System.Reflection" + 3B];
        D.18492 = *D.18491;
        D.18493 = (int) D.18492;
        D.18494 = __s2 + 3;
        D.18495 = *D.18494;
        D.18496 = (int) D.18495;
        __result = D.18493 - D.18496;
        <D.18490>:
        <D.18480>:
        <D.18470>:
      }
      D.17419 = __result;
    }
    iftmp.26 = -D.17419;
    goto <D.18497>;
    <D.18460>:
    D.18452 = method->klass;
    D.18498 = D.18452->name_space;
    iftmp.26 = __builtin_strcmp (D.18498, "System.Reflection");
    <D.18497>:
    D.17420 = iftmp.26;
  }
  if (D.17420 != 0) goto <D.18499>; else goto <D.18500>;
  <D.18499>:
  D.18457 = 0;
  return D.18457;
  <D.18500>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 12;
    if (__s2_len <= 3) goto <D.18502>; else goto <D.18503>;
    <D.18502>:
    {
      const unsigned char * __s2;
      int __result;

      D.18452 = method->klass;
      __s2 = D.18452->name;
      D.18504 = "MonoProperty";
      D.18505 = MEM[(const unsigned char *)D.18504];
      D.18506 = (int) D.18505;
      D.18507 = *__s2;
      D.18508 = (int) D.18507;
      __result = D.18506 - D.18508;
      {
        D.18509 = __s2_len != 0;
        D.18510 = __result == 0;
        D.18511 = D.18509 & D.18510;
        if (D.18511 != 0) goto <D.18512>; else goto <D.18513>;
        <D.18512>:
        D.18514 = &MEM[(void *)"MonoProperty" + 1B];
        D.18515 = *D.18514;
        D.18516 = (int) D.18515;
        D.18517 = __s2 + 1;
        D.18518 = *D.18517;
        D.18519 = (int) D.18518;
        __result = D.18516 - D.18519;
        D.18520 = __s2_len > 1;
        D.18510 = __result == 0;
        D.18521 = D.18520 & D.18510;
        if (D.18521 != 0) goto <D.18522>; else goto <D.18523>;
        <D.18522>:
        D.18524 = &MEM[(void *)"MonoProperty" + 2B];
        D.18525 = *D.18524;
        D.18526 = (int) D.18525;
        D.18527 = __s2 + 2;
        D.18528 = *D.18527;
        D.18529 = (int) D.18528;
        __result = D.18526 - D.18529;
        D.18530 = __s2_len > 2;
        D.18510 = __result == 0;
        D.18531 = D.18530 & D.18510;
        if (D.18531 != 0) goto <D.18532>; else goto <D.18533>;
        <D.18532>:
        D.18534 = &MEM[(void *)"MonoProperty" + 3B];
        D.18535 = *D.18534;
        D.18536 = (int) D.18535;
        D.18537 = __s2 + 3;
        D.18538 = *D.18537;
        D.18539 = (int) D.18538;
        __result = D.18536 - D.18539;
        <D.18533>:
        <D.18523>:
        <D.18513>:
      }
      D.17428 = __result;
    }
    iftmp.27 = -D.17428;
    goto <D.18540>;
    <D.18503>:
    D.18452 = method->klass;
    D.18541 = D.18452->name;
    iftmp.27 = __builtin_strcmp (D.18541, "MonoProperty");
    <D.18540>:
    D.17429 = iftmp.27;
  }
  if (D.17429 == 0) goto <D.18542>; else goto <D.18543>;
  <D.18542>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 18;
    if (__s2_len <= 3) goto <D.18547>; else goto <D.18548>;
    <D.18547>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.18549 = "GetterAdapterFrame";
      D.18550 = MEM[(const unsigned char *)D.18549];
      D.18551 = (int) D.18550;
      D.18552 = *__s2;
      D.18553 = (int) D.18552;
      __result = D.18551 - D.18553;
      {
        D.18554 = __s2_len != 0;
        D.18555 = __result == 0;
        D.18556 = D.18554 & D.18555;
        if (D.18556 != 0) goto <D.18557>; else goto <D.18558>;
        <D.18557>:
        D.18559 = &MEM[(void *)"GetterAdapterFrame" + 1B];
        D.18560 = *D.18559;
        D.18561 = (int) D.18560;
        D.18562 = __s2 + 1;
        D.18563 = *D.18562;
        D.18564 = (int) D.18563;
        __result = D.18561 - D.18564;
        D.18565 = __s2_len > 1;
        D.18555 = __result == 0;
        D.18566 = D.18565 & D.18555;
        if (D.18566 != 0) goto <D.18567>; else goto <D.18568>;
        <D.18567>:
        D.18569 = &MEM[(void *)"GetterAdapterFrame" + 2B];
        D.18570 = *D.18569;
        D.18571 = (int) D.18570;
        D.18572 = __s2 + 2;
        D.18573 = *D.18572;
        D.18574 = (int) D.18573;
        __result = D.18571 - D.18574;
        D.18575 = __s2_len > 2;
        D.18555 = __result == 0;
        D.18576 = D.18575 & D.18555;
        if (D.18576 != 0) goto <D.18577>; else goto <D.18578>;
        <D.18577>:
        D.18579 = &MEM[(void *)"GetterAdapterFrame" + 3B];
        D.18580 = *D.18579;
        D.18581 = (int) D.18580;
        D.18582 = __s2 + 3;
        D.18583 = *D.18582;
        D.18584 = (int) D.18583;
        __result = D.18581 - D.18584;
        <D.18578>:
        <D.18568>:
        <D.18558>:
      }
      D.17437 = __result;
    }
    iftmp.28 = -D.17437;
    goto <D.18585>;
    <D.18548>:
    D.18586 = method->name;
    iftmp.28 = __builtin_strcmp (D.18586, "GetterAdapterFrame");
    <D.18585>:
    D.17438 = iftmp.28;
  }
  if (D.17438 == 0) goto <D.18544>; else goto <D.18587>;
  <D.18587>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 24;
    if (__s2_len <= 3) goto <D.18589>; else goto <D.18590>;
    <D.18589>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.18591 = "StaticGetterAdapterFrame";
      D.18592 = MEM[(const unsigned char *)D.18591];
      D.18593 = (int) D.18592;
      D.18594 = *__s2;
      D.18595 = (int) D.18594;
      __result = D.18593 - D.18595;
      {
        D.18596 = __s2_len != 0;
        D.18597 = __result == 0;
        D.18598 = D.18596 & D.18597;
        if (D.18598 != 0) goto <D.18599>; else goto <D.18600>;
        <D.18599>:
        D.18601 = &MEM[(void *)"StaticGetterAdapterFrame" + 1B];
        D.18602 = *D.18601;
        D.18603 = (int) D.18602;
        D.18604 = __s2 + 1;
        D.18605 = *D.18604;
        D.18606 = (int) D.18605;
        __result = D.18603 - D.18606;
        D.18607 = __s2_len > 1;
        D.18597 = __result == 0;
        D.18608 = D.18607 & D.18597;
        if (D.18608 != 0) goto <D.18609>; else goto <D.18610>;
        <D.18609>:
        D.18611 = &MEM[(void *)"StaticGetterAdapterFrame" + 2B];
        D.18612 = *D.18611;
        D.18613 = (int) D.18612;
        D.18614 = __s2 + 2;
        D.18615 = *D.18614;
        D.18616 = (int) D.18615;
        __result = D.18613 - D.18616;
        D.18617 = __s2_len > 2;
        D.18597 = __result == 0;
        D.18618 = D.18617 & D.18597;
        if (D.18618 != 0) goto <D.18619>; else goto <D.18620>;
        <D.18619>:
        D.18621 = &MEM[(void *)"StaticGetterAdapterFrame" + 3B];
        D.18622 = *D.18621;
        D.18623 = (int) D.18622;
        D.18624 = __s2 + 3;
        D.18625 = *D.18624;
        D.18626 = (int) D.18625;
        __result = D.18623 - D.18626;
        <D.18620>:
        <D.18610>:
        <D.18600>:
      }
      D.17446 = __result;
    }
    iftmp.29 = -D.17446;
    goto <D.18627>;
    <D.18590>:
    D.18586 = method->name;
    iftmp.29 = __builtin_strcmp (D.18586, "StaticGetterAdapterFrame");
    <D.18627>:
    D.17447 = iftmp.29;
  }
  if (D.17447 == 0) goto <D.18544>; else goto <D.18545>;
  <D.18544>:
  D.18457 = 1;
  return D.18457;
  <D.18545>:
  goto <D.18628>;
  <D.18543>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 9;
    if (__s2_len <= 3) goto <D.18630>; else goto <D.18631>;
    <D.18630>:
    {
      const unsigned char * __s2;
      int __result;

      D.18452 = method->klass;
      __s2 = D.18452->name;
      D.18632 = "EventInfo";
      D.18633 = MEM[(const unsigned char *)D.18632];
      D.18634 = (int) D.18633;
      D.18635 = *__s2;
      D.18636 = (int) D.18635;
      __result = D.18634 - D.18636;
      {
        D.18637 = __s2_len != 0;
        D.18638 = __result == 0;
        D.18639 = D.18637 & D.18638;
        if (D.18639 != 0) goto <D.18640>; else goto <D.18641>;
        <D.18640>:
        D.18642 = &MEM[(void *)"EventInfo" + 1B];
        D.18643 = *D.18642;
        D.18644 = (int) D.18643;
        D.18645 = __s2 + 1;
        D.18646 = *D.18645;
        D.18647 = (int) D.18646;
        __result = D.18644 - D.18647;
        D.18648 = __s2_len > 1;
        D.18638 = __result == 0;
        D.18649 = D.18648 & D.18638;
        if (D.18649 != 0) goto <D.18650>; else goto <D.18651>;
        <D.18650>:
        D.18652 = &MEM[(void *)"EventInfo" + 2B];
        D.18653 = *D.18652;
        D.18654 = (int) D.18653;
        D.18655 = __s2 + 2;
        D.18656 = *D.18655;
        D.18657 = (int) D.18656;
        __result = D.18654 - D.18657;
        D.18658 = __s2_len > 2;
        D.18638 = __result == 0;
        D.18659 = D.18658 & D.18638;
        if (D.18659 != 0) goto <D.18660>; else goto <D.18661>;
        <D.18660>:
        D.18662 = &MEM[(void *)"EventInfo" + 3B];
        D.18663 = *D.18662;
        D.18664 = (int) D.18663;
        D.18665 = __s2 + 3;
        D.18666 = *D.18665;
        D.18667 = (int) D.18666;
        __result = D.18664 - D.18667;
        <D.18661>:
        <D.18651>:
        <D.18641>:
      }
      D.17455 = __result;
    }
    iftmp.30 = -D.17455;
    goto <D.18668>;
    <D.18631>:
    D.18452 = method->klass;
    D.18541 = D.18452->name;
    iftmp.30 = __builtin_strcmp (D.18541, "EventInfo");
    <D.18668>:
    D.17456 = iftmp.30;
  }
  if (D.17456 == 0) goto <D.18669>; else goto <D.18670>;
  <D.18669>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 13;
    if (__s2_len <= 3) goto <D.18674>; else goto <D.18675>;
    <D.18674>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.18676 = "AddEventFrame";
      D.18677 = MEM[(const unsigned char *)D.18676];
      D.18678 = (int) D.18677;
      D.18679 = *__s2;
      D.18680 = (int) D.18679;
      __result = D.18678 - D.18680;
      {
        D.18681 = __s2_len != 0;
        D.18682 = __result == 0;
        D.18683 = D.18681 & D.18682;
        if (D.18683 != 0) goto <D.18684>; else goto <D.18685>;
        <D.18684>:
        D.18686 = &MEM[(void *)"AddEventFrame" + 1B];
        D.18687 = *D.18686;
        D.18688 = (int) D.18687;
        D.18689 = __s2 + 1;
        D.18690 = *D.18689;
        D.18691 = (int) D.18690;
        __result = D.18688 - D.18691;
        D.18692 = __s2_len > 1;
        D.18682 = __result == 0;
        D.18693 = D.18692 & D.18682;
        if (D.18693 != 0) goto <D.18694>; else goto <D.18695>;
        <D.18694>:
        D.18696 = &MEM[(void *)"AddEventFrame" + 2B];
        D.18697 = *D.18696;
        D.18698 = (int) D.18697;
        D.18699 = __s2 + 2;
        D.18700 = *D.18699;
        D.18701 = (int) D.18700;
        __result = D.18698 - D.18701;
        D.18702 = __s2_len > 2;
        D.18682 = __result == 0;
        D.18703 = D.18702 & D.18682;
        if (D.18703 != 0) goto <D.18704>; else goto <D.18705>;
        <D.18704>:
        D.18706 = &MEM[(void *)"AddEventFrame" + 3B];
        D.18707 = *D.18706;
        D.18708 = (int) D.18707;
        D.18709 = __s2 + 3;
        D.18710 = *D.18709;
        D.18711 = (int) D.18710;
        __result = D.18708 - D.18711;
        <D.18705>:
        <D.18695>:
        <D.18685>:
      }
      D.17464 = __result;
    }
    iftmp.31 = -D.17464;
    goto <D.18712>;
    <D.18675>:
    D.18586 = method->name;
    iftmp.31 = __builtin_strcmp (D.18586, "AddEventFrame");
    <D.18712>:
    D.17465 = iftmp.31;
  }
  if (D.17465 == 0) goto <D.18671>; else goto <D.18713>;
  <D.18713>:
  {
    size_t __s1_len;
    size_t __s2_len;

    __s2_len = 26;
    if (__s2_len <= 3) goto <D.18715>; else goto <D.18716>;
    <D.18715>:
    {
      const unsigned char * __s2;
      int __result;

      __s2 = method->name;
      D.18717 = "StaticAddEventAdapterFrame";
      D.18718 = MEM[(const unsigned char *)D.18717];
      D.18719 = (int) D.18718;
      D.18720 = *__s2;
      D.18721 = (int) D.18720;
      __result = D.18719 - D.18721;
      {
        D.18722 = __s2_len != 0;
        D.18723 = __result == 0;
        D.18724 = D.18722 & D.18723;
        if (D.18724 != 0) goto <D.18725>; else goto <D.18726>;
        <D.18725>:
        D.18727 = &MEM[(void *)"StaticAddEventAdapterFrame" + 1B];
        D.18728 = *D.18727;
        D.18729 = (int) D.18728;
        D.18730 = __s2 + 1;
        D.18731 = *D.18730;
        D.18732 = (int) D.18731;
        __result = D.18729 - D.18732;
        D.18733 = __s2_len > 1;
        D.18723 = __result == 0;
        D.18734 = D.18733 & D.18723;
        if (D.18734 != 0) goto <D.18735>; else goto <D.18736>;
        <D.18735>:
        D.18737 = &MEM[(void *)"StaticAddEventAdapterFrame" + 2B];
        D.18738 = *D.18737;
        D.18739 = (int) D.18738;
        D.18740 = __s2 + 2;
        D.18741 = *D.18740;
        D.18742 = (int) D.18741;
        __result = D.18739 - D.18742;
        D.18743 = __s2_len > 2;
        D.18723 = __result == 0;
        D.18744 = D.18743 & D.18723;
        if (D.18744 != 0) goto <D.18745>; else goto <D.18746>;
        <D.18745>:
        D.18747 = &MEM[(void *)"StaticAddEventAdapterFrame" + 3B];
        D.18748 = *D.18747;
        D.18749 = (int) D.18748;
        D.18750 = __s2 + 3;
        D.18751 = *D.18750;
        D.18752 = (int) D.18751;
        __result = D.18749 - D.18752;
        <D.18746>:
        <D.18736>:
        <D.18726>:
      }
      D.17473 = __result;
    }
    iftmp.32 = -D.17473;
    goto <D.18753>;
    <D.18716>:
    D.18586 = method->name;
    iftmp.32 = __builtin_strcmp (D.18586, "StaticAddEventAdapterFrame");
    <D.18753>:
    D.17474 = iftmp.32;
  }
  if (D.17474 == 0) goto <D.18671>; else goto <D.18672>;
  <D.18671>:
  D.18457 = 1;
  return D.18457;
  <D.18672>:
  <D.18670>:
  <D.18628>:
  D.18457 = 0;
  return D.18457;
}


get_argument_exception (const char * format, struct MonoMethod * caller, struct MonoMethod * callee)
{
  struct MonoException * D.18755;
  struct MonoException * ex;
  char * caller_name;
  char * callee_name;
  char * message;

  caller_name = get_method_full_name (caller);
  callee_name = get_method_full_name (callee);
  message = monoeg_g_strdup_printf (format, caller_name, callee_name);
  monoeg_g_free (callee_name);
  monoeg_g_free (caller_name);
  mono_trace (16, 64, message);
  ex = mono_get_exception_argument ("method", message);
  monoeg_g_free (message);
  D.18755 = ex;
  return D.18755;
}


mono_security_core_clr_ensure_dynamic_method_resolved_object (void * ref, struct MonoClass * handle_class)
{
  struct MonoClass * D.18757;
  struct MonoImage * D.18760;
  int D.18761;
  int D.18764;
  struct MonoException * D.18767;
  struct MonoClass * D.18769;
  struct MonoClass * D.18772;
  struct MonoImage * D.18773;
  int D.18774;
  int D.18777;

  D.18757 = mono_defaults.fieldhandle_class;
  if (D.18757 == handle_class) goto <D.18758>; else goto <D.18759>;
  <D.18758>:
  {
    struct MonoClassField * field;
    struct MonoClass * klass;

    field = ref;
    klass = mono_field_get_parent (field);
    D.18760 = klass->image;
    D.18761 = mono_security_core_clr_is_platform_image (D.18760);
    if (D.18761 != 0) goto <D.18762>; else goto <D.18763>;
    <D.18762>:
    {
      struct MonoMethod * caller;

      caller = get_reflection_caller ();
      D.18764 = check_field_access (caller, field);
      if (D.18764 == 0) goto <D.18765>; else goto <D.18766>;
      <D.18765>:
      D.18767 = get_field_access_exception ("Dynamic method %s cannot create access private/internal field %s.", caller, field);
      return D.18767;
      <D.18766>:
    }
    <D.18763>:
  }
  goto <D.18768>;
  <D.18759>:
  D.18769 = mono_defaults.methodhandle_class;
  if (D.18769 == handle_class) goto <D.18770>; else goto <D.18771>;
  <D.18770>:
  {
    struct MonoMethod * method;

    method = ref;
    D.18772 = method->klass;
    D.18773 = D.18772->image;
    D.18774 = mono_security_core_clr_is_platform_image (D.18773);
    if (D.18774 != 0) goto <D.18775>; else goto <D.18776>;
    <D.18775>:
    {
      struct MonoMethod * caller;

      caller = get_reflection_caller ();
      D.18777 = check_method_access (caller, method);
      if (D.18777 == 0) goto <D.18778>; else goto <D.18779>;
      <D.18778>:
      D.18767 = get_method_access_exception ("Dynamic method %s cannot create access private/internal method %s.", caller, method);
      return D.18767;
      <D.18779>:
    }
    <D.18776>:
  }
  <D.18771>:
  <D.18768>:
  D.18767 = 0B;
  return D.18767;
}


mono_security_core_clr_can_access_internals (struct MonoImage * accessing, struct MonoImage * accessed)
{
  int D.18781;
  gboolean D.18784;
  int D.18785;
  struct MonoAssembly * D.18790;
  char * D.18791;
  struct MonoAssembly * D.18793;
  char * D.18794;
  int D.17501;
  _Bool D.18795;

  D.18781 = mono_security_core_clr_is_platform_image (accessed);
  if (D.18781 == 0) goto <D.18782>; else goto <D.18783>;
  <D.18782>:
  D.18784 = 1;
  return D.18784;
  <D.18783>:
  D.18785 = mono_security_core_clr_is_platform_image (accessing);
  if (D.18785 != 0) goto <D.18786>; else goto <D.18787>;
  <D.18786>:
  D.18784 = 1;
  return D.18784;
  <D.18787>:
  D.18790 = accessed->assembly;
  D.18791 = D.18790->basedir;
  if (D.18791 == 0B) goto <D.18788>; else goto <D.18792>;
  <D.18792>:
  D.18793 = accessing->assembly;
  D.18794 = D.18793->basedir;
  if (D.18794 == 0B) goto <D.18788>; else goto <D.18789>;
  <D.18788>:
  D.18784 = 0;
  return D.18784;
  <D.18789>:
  {
    size_t __s1_len;
    size_t __s2_len;

    D.18793 = accessing->assembly;
    D.18794 = D.18793->basedir;
    D.18790 = accessed->assembly;
    D.18791 = D.18790->basedir;
    D.17501 = __builtin_strcmp (D.18791, D.18794);
  }
  D.18795 = D.17501 == 0;
  D.18784 = (gboolean) D.18795;
  return D.18784;
}


mono_security_core_clr_is_field_access_allowed (struct MonoMethod * caller, struct MonoClassField * field)
{
  struct MonoClass * D.18797;
  <unnamed type> D.18798;
  struct MonoException * D.18801;
  <unnamed type> D.18805;

  D.18797 = mono_field_get_parent (field);
  D.18798 = mono_security_core_clr_class_level (D.18797);
  if (D.18798 != 2) goto <D.18799>; else goto <D.18800>;
  <D.18799>:
  D.18801 = 0B;
  return D.18801;
  <D.18800>:
  if (caller == 0B) goto <D.18802>; else goto <D.18804>;
  <D.18804>:
  D.18805 = mono_security_core_clr_method_level (caller, 1);
  if (D.18805 != 0) goto <D.18802>; else goto <D.18803>;
  <D.18802>:
  D.18801 = 0B;
  return D.18801;
  <D.18803>:
  D.18801 = get_field_access_exception ("Transparent method %s cannot call use Critical field %s.", caller, field);
  return D.18801;
}


mono_security_core_clr_is_call_allowed (struct MonoMethod * caller, struct MonoMethod * callee)
{
  <unnamed type> D.18807;
  struct MonoException * D.18810;
  <unnamed type> D.18814;

  D.18807 = mono_security_core_clr_method_level (callee, 1);
  if (D.18807 != 2) goto <D.18808>; else goto <D.18809>;
  <D.18808>:
  D.18810 = 0B;
  return D.18810;
  <D.18809>:
  if (caller == 0B) goto <D.18811>; else goto <D.18813>;
  <D.18813>:
  D.18814 = mono_security_core_clr_method_level (caller, 1);
  if (D.18814 != 0) goto <D.18811>; else goto <D.18812>;
  <D.18811>:
  D.18810 = 0B;
  return D.18810;
  <D.18812>:
  D.18810 = get_method_access_exception ("Transparent method %s cannot call Critical method %s.", caller, callee);
  return D.18810;
}


mono_security_core_clr_class_level (struct MonoClass * class)
{
  int mono_security_core_clr_test.33;
  struct MonoImage * D.18819;
  int D.18820;
  MonoSecurityCoreCLRLevel D.18823;

  mono_security_core_clr_test.33 = mono_security_core_clr_test;
  if (mono_security_core_clr_test.33 == 0) goto <D.18817>; else goto <D.18818>;
  <D.18817>:
  D.18819 = class->image;
  D.18820 = mono_security_core_clr_is_platform_image (D.18819);
  if (D.18820 == 0) goto <D.18821>; else goto <D.18822>;
  <D.18821>:
  D.18823 = 0;
  return D.18823;
  <D.18822>:
  <D.18818>:
  D.18823 = mono_security_core_clr_class_level_no_platform_check (class);
  return D.18823;
}


mono_security_core_clr_class_level_no_platform_check (struct MonoClass * class)
{
  struct MonoImage * D.18827;
  struct MonoClass * D.18830;
  MonoSecurityCoreCLRLevel D.18833;
  MonoSecurityCoreCLRLevel level;
  struct MonoCustomAttrInfo * cinfo;

  level = 0;
  cinfo = mono_custom_attrs_from_class (class);
  if (cinfo != 0B) goto <D.18825>; else goto <D.18826>;
  <D.18825>:
  D.18827 = class->image;
  level = mono_security_core_clr_level_from_cinfo (cinfo, D.18827);
  mono_custom_attrs_free (cinfo);
  <D.18826>:
  if (level == 0) goto <D.18828>; else goto <D.18829>;
  <D.18828>:
  D.18830 = class->nested_in;
  if (D.18830 != 0B) goto <D.18831>; else goto <D.18832>;
  <D.18831>:
  D.18830 = class->nested_in;
  level = mono_security_core_clr_class_level_no_platform_check (D.18830);
  <D.18832>:
  <D.18829>:
  D.18833 = level;
  return D.18833;
}


mono_security_core_clr_level_from_cinfo (struct MonoCustomAttrInfo * cinfo, struct MonoImage * image)
{
  struct MonoClass * D.18837;
  int D.18838;
  struct MonoClass * D.18843;
  int D.18844;
  MonoSecurityCoreCLRLevel D.18847;
  int level;

  level = 0;
  if (cinfo != 0B) goto <D.18835>; else goto <D.18836>;
  <D.18835>:
  D.18837 = security_safe_critical_attribute ();
  D.18838 = mono_custom_attrs_has_attr (cinfo, D.18837);
  if (D.18838 != 0) goto <D.18839>; else goto <D.18840>;
  <D.18839>:
  level = 1;
  <D.18840>:
  <D.18836>:
  if (cinfo != 0B) goto <D.18841>; else goto <D.18842>;
  <D.18841>:
  D.18843 = security_critical_attribute ();
  D.18844 = mono_custom_attrs_has_attr (cinfo, D.18843);
  if (D.18844 != 0) goto <D.18845>; else goto <D.18846>;
  <D.18845>:
  level = 2;
  <D.18846>:
  <D.18842>:
  D.18847 = (MonoSecurityCoreCLRLevel) level;
  return D.18847;
}


security_safe_critical_attribute ()
{
  struct MonoClass * class.34;
  struct MonoImage * D.18852;
  struct MonoClass * class.35;
  _Bool D.18854;
  long int D.18855;
  long int D.18856;
  struct MonoClass * D.18859;
  static struct MonoClass * class = 0B;

  class.34 = class;
  if (class.34 == 0B) goto <D.18850>; else goto <D.18851>;
  <D.18850>:
  D.18852 = mono_defaults.corlib;
  class.35 = mono_class_from_name (D.18852, "System.Security", "SecuritySafeCriticalAttribute");
  class = class.35;
  <D.18851>:
  class.34 = class;
  D.18854 = class.34 == 0B;
  D.18855 = (long int) D.18854;
  D.18856 = __builtin_expect (D.18855, 0);
  if (D.18856 != 0) goto <D.18857>; else goto <D.18858>;
  <D.18857>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "security-core-clr.c", 147, "class");
  <D.18858>:
  D.18859 = class;
  return D.18859;
}


security_critical_attribute ()
{
  struct MonoClass * class.36;
  struct MonoImage * D.18864;
  struct MonoClass * class.37;
  _Bool D.18866;
  long int D.18867;
  long int D.18868;
  struct MonoClass * D.18871;
  static struct MonoClass * class = 0B;

  class.36 = class;
  if (class.36 == 0B) goto <D.18862>; else goto <D.18863>;
  <D.18862>:
  D.18864 = mono_defaults.corlib;
  class.37 = mono_class_from_name (D.18864, "System.Security", "SecurityCriticalAttribute");
  class = class.37;
  <D.18863>:
  class.36 = class;
  D.18866 = class.36 == 0B;
  D.18867 = (long int) D.18866;
  D.18868 = __builtin_expect (D.18867, 0);
  if (D.18868 != 0) goto <D.18869>; else goto <D.18870>;
  <D.18869>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "security-core-clr.c", 134, "class");
  <D.18870>:
  D.18871 = class;
  return D.18871;
}


mono_security_core_clr_method_level (struct MonoMethod * method, gboolean with_class_level)
{
  MonoSecurityCoreCLRLevel D.18875;
  int mono_security_core_clr_test.38;
  struct MonoClass * D.18879;
  struct MonoImage * D.18880;
  int D.18881;
  _Bool D.18886;
  _Bool D.18887;
  _Bool D.18888;
  struct MonoCustomAttrInfo * cinfo;
  MonoSecurityCoreCLRLevel level;

  level = 0;
  if (method == 0B) goto <D.18873>; else goto <D.18874>;
  <D.18873>:
  D.18875 = level;
  return D.18875;
  <D.18874>:
  mono_security_core_clr_test.38 = mono_security_core_clr_test;
  if (mono_security_core_clr_test.38 == 0) goto <D.18877>; else goto <D.18878>;
  <D.18877>:
  D.18879 = method->klass;
  D.18880 = D.18879->image;
  D.18881 = mono_security_core_clr_is_platform_image (D.18880);
  if (D.18881 == 0) goto <D.18882>; else goto <D.18883>;
  <D.18882>:
  D.18875 = level;
  return D.18875;
  <D.18883>:
  <D.18878>:
  cinfo = mono_custom_attrs_from_method (method);
  if (cinfo != 0B) goto <D.18884>; else goto <D.18885>;
  <D.18884>:
  D.18879 = method->klass;
  D.18880 = D.18879->image;
  level = mono_security_core_clr_level_from_cinfo (cinfo, D.18880);
  mono_custom_attrs_free (cinfo);
  <D.18885>:
  D.18886 = with_class_level != 0;
  D.18887 = level == 0;
  D.18888 = D.18886 & D.18887;
  if (D.18888 != 0) goto <D.18889>; else goto <D.18890>;
  <D.18889>:
  D.18879 = method->klass;
  level = mono_security_core_clr_class_level (D.18879);
  <D.18890>:
  D.18875 = level;
  return D.18875;
}


mono_security_enable_core_clr ()
{
  mono_verifier_set_mode (2);
  mono_security_set_mode (1);
}


