mono_method_has_declsec (struct MonoMethod * method)
{
  unsigned char D.21859;
  unsigned char D.21860;
  _Bool D.21861;
  _Bool D.21862;
  _Bool D.21863;
  MonoBoolean D.21868;
  unsigned char D.21870;
  struct MonoClass * D.21875;
  unsigned int D.21876;
  unsigned int D.21877;
  short unsigned int D.21879;
  int D.21880;
  int D.21881;
  int D.21790;
  int iftmp.0;
  int D.21789;
  const char[7] * D.21885;
  unsigned char D.21886;
  int D.21887;
  unsigned char D.21888;
  int D.21889;
  _Bool D.21890;
  _Bool D.21891;
  _Bool D.21892;
  const unsigned char * D.21895;
  unsigned char D.21896;
  int D.21897;
  const unsigned char * D.21898;
  unsigned char D.21899;
  int D.21900;
  _Bool D.21901;
  _Bool D.21902;
  const unsigned char * D.21905;
  unsigned char D.21906;
  int D.21907;
  const unsigned char * D.21908;
  unsigned char D.21909;
  int D.21910;
  _Bool D.21911;
  _Bool D.21912;
  const unsigned char * D.21915;
  unsigned char D.21916;
  int D.21917;
  const unsigned char * D.21918;
  unsigned char D.21919;
  int D.21920;
  const char * D.21922;

  InterlockedIncrement (&mono_jit_stats.cas_declsec_check);
  D.21859 = BIT_FIELD_REF <*method, 8, 160>;
  D.21860 = D.21859 & 124;
  D.21861 = D.21860 == 24;
  D.21862 = D.21860 == 28;
  D.21863 = D.21861 | D.21862;
  if (D.21863 != 0) goto <D.21864>; else goto <D.21865>;
  <D.21864>:
  method = mono_marshal_method_from_wrapper (method);
  if (method == 0B) goto <D.21866>; else goto <D.21867>;
  <D.21866>:
  D.21868 = 0;
  return D.21868;
  <D.21867>:
  goto <D.21869>;
  <D.21865>:
  D.21859 = BIT_FIELD_REF <*method, 8, 160>;
  D.21870 = D.21859 & 124;
  if (D.21870 != 0) goto <D.21871>; else goto <D.21872>;
  <D.21871>:
  D.21868 = 0;
  return D.21868;
  <D.21872>:
  <D.21869>:
  D.21875 = method->klass;
  D.21876 = D.21875->flags;
  D.21877 = D.21876 & 262144;
  if (D.21877 != 0) goto <D.21873>; else goto <D.21878>;
  <D.21878>:
  D.21879 = method->flags;
  D.21880 = (int) D.21879;
  D.21881 = D.21880 & 16384;
  if (D.21881 != 0) goto <D.21873>; else goto <D.21874>;
  <D.21873>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      __s2 = method->name;
      D.21885 = ".cctor";
      D.21886 = MEM[(const unsigned char *)D.21885];
      D.21887 = (int) D.21886;
      D.21888 = *__s2;
      D.21889 = (int) D.21888;
      __result = D.21887 - D.21889;
      {
        D.21890 = __s2_len != 0;
        D.21891 = __result == 0;
        D.21892 = D.21890 & D.21891;
        if (D.21892 != 0) goto <D.21893>; else goto <D.21894>;
        <D.21893>:
        D.21895 = &MEM[(void *)".cctor" + 1B];
        D.21896 = *D.21895;
        D.21897 = (int) D.21896;
        D.21898 = __s2 + 1;
        D.21899 = *D.21898;
        D.21900 = (int) D.21899;
        __result = D.21897 - D.21900;
        D.21901 = __s2_len > 1;
        D.21891 = __result == 0;
        D.21902 = D.21901 & D.21891;
        if (D.21902 != 0) goto <D.21903>; else goto <D.21904>;
        <D.21903>:
        D.21905 = &MEM[(void *)".cctor" + 2B];
        D.21906 = *D.21905;
        D.21907 = (int) D.21906;
        D.21908 = __s2 + 2;
        D.21909 = *D.21908;
        D.21910 = (int) D.21909;
        __result = D.21907 - D.21910;
        D.21911 = __s2_len > 2;
        D.21891 = __result == 0;
        D.21912 = D.21911 & D.21891;
        if (D.21912 != 0) goto <D.21913>; else goto <D.21914>;
        <D.21913>:
        D.21915 = &MEM[(void *)".cctor" + 3B];
        D.21916 = *D.21915;
        D.21917 = (int) D.21916;
        D.21918 = __s2 + 3;
        D.21919 = *D.21918;
        D.21920 = (int) D.21919;
        __result = D.21917 - D.21920;
        <D.21914>:
        <D.21904>:
        <D.21894>:
      }
      D.21789 = __result;
    }
    iftmp.0 = -D.21789;
    goto <D.21921>;
    <D.21884>:
    D.21922 = method->name;
    iftmp.0 = __builtin_strcmp (D.21922, ".cctor");
    <D.21921>:
    D.21790 = iftmp.0;
  }
  if (D.21790 != 0) goto <D.21923>; else goto <D.21924>;
  <D.21923>:
  D.21868 = 1;
  return D.21868;
  <D.21924>:
  <D.21874>:
  D.21868 = 0;
  return D.21868;
}


InterlockedIncrement (volatile gint32 * val)
{
  gint32 D.21926;
  unsigned int D.21927;

  D.21927 = __sync_add_and_fetch_4 (val, 1);
  D.21926 = (gint32) D.21927;
  return D.21926;
}


mono_declsec_cache_stack_modifiers (struct MonoJitInfo * jinfo)
{
  unsigned int D.21931;
  _Bool D.21932;
  <unnamed-signed:1> D.21933;
  unsigned int D.21934;
  _Bool D.21935;
  <unnamed-signed:1> D.21936;
  unsigned int D.21937;
  _Bool D.21938;
  <unnamed-signed:1> D.21939;
  struct MonoClass * D.21940;
  struct MonoMethodCasInfo * info;
  struct MonoMethod * method;
  guint32 flags;

  info = mono_jit_info_get_cas_info (jinfo);
  if (info == 0B) goto <D.21929>; else goto <D.21930>;
  <D.21929>:
  return;
  <D.21930>:
  method = jinfo_get_method (jinfo);
  flags = mono_declsec_flags_from_method (method);
  D.21931 = flags & 4;
  D.21932 = D.21931 != 0;
  D.21933 = (<unnamed-signed:1>) D.21932;
  info->cas_method_assert = D.21933;
  D.21934 = flags & 8;
  D.21935 = D.21934 != 0;
  D.21936 = (<unnamed-signed:1>) D.21935;
  info->cas_method_deny = D.21936;
  D.21937 = flags & 16;
  D.21938 = D.21937 != 0;
  D.21939 = (<unnamed-signed:1>) D.21938;
  info->cas_method_permitonly = D.21939;
  D.21940 = method->klass;
  flags = mono_declsec_flags_from_class (D.21940);
  D.21931 = flags & 4;
  D.21932 = D.21931 != 0;
  D.21933 = (<unnamed-signed:1>) D.21932;
  info->cas_class_assert = D.21933;
  D.21934 = flags & 8;
  D.21935 = D.21934 != 0;
  D.21936 = (<unnamed-signed:1>) D.21935;
  info->cas_class_deny = D.21936;
  D.21937 = flags & 16;
  D.21938 = D.21937 != 0;
  D.21939 = (<unnamed-signed:1>) D.21938;
  info->cas_class_permitonly = D.21939;
}


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

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


mono_declsec_create_frame (struct MonoDomain * domain, struct MonoJitInfo * jinfo)
{
  struct MonoClass * D.21944;
  unsigned char D.21947;
  unsigned char D.21948;
  unsigned char D.21951;
  struct MonoReflectionMethod * D.21954;
  struct MonoReflectionMethod * * D.21955;
  struct MonoAppDomain * D.21956;
  struct MonoAppDomain * * D.21957;
  unsigned char D.21961;
  struct MonoDeclSecurityEntry * D.21963;
  unsigned char D.21966;
  struct MonoClass * D.21969;
  unsigned char D.21973;
  struct MonoDeclSecurityEntry * D.21975;
  unsigned char D.21978;
  unsigned char D.21984;
  struct MonoDeclSecurityEntry * D.21986;
  unsigned char D.21989;
  struct MonoSecurityFrame * D.21992;
  struct MonoSecurityFrame * frame;
  struct MonoMethodCasInfo * info;
  struct MonoMethod * method;

  D.21944 = mono_defaults.runtimesecurityframe_class;
  frame = mono_object_new (domain, D.21944);
  method = jinfo_get_method (jinfo);
  info = mono_jit_info_get_cas_info (jinfo);
  if (info != 0B) goto <D.21945>; else goto <D.21946>;
  <D.21945>:
  D.21947 = BIT_FIELD_REF <*info, 8, 0>;
  D.21948 = D.21947 & 1;
  if (D.21948 == 0) goto <D.21949>; else goto <D.21950>;
  <D.21949>:
  D.21951 = mono_method_has_declsec (method);
  if (D.21951 != 0) goto <D.21952>; else goto <D.21953>;
  <D.21952>:
  mono_declsec_cache_stack_modifiers (jinfo);
  <D.21953>:
  info->cas_inited = -1;
  <D.21950>:
  <D.21946>:
  D.21954 = mono_method_get_object (domain, method, 0B);
  D.21955 = &frame->method;
  mono_gc_wbarrier_set_field (frame, D.21955, D.21954);
  D.21956 = domain->domain;
  D.21957 = &frame->domain;
  mono_gc_wbarrier_set_field (frame, D.21957, D.21956);
  if (info != 0B) goto <D.21960>; else goto <D.21958>;
  <D.21960>:
  D.21947 = BIT_FIELD_REF <*info, 8, 0>;
  D.21961 = D.21947 & 16;
  if (D.21961 != 0) goto <D.21962>; else goto <D.21958>;
  <D.21962>:
  D.21963 = &frame->assert;
  mono_declsec_get_method_action (method, 3, D.21963);
  goto <D.21959>;
  <D.21958>:
  if (info != 0B) goto <D.21964>; else goto <D.21965>;
  <D.21964>:
  D.21947 = BIT_FIELD_REF <*info, 8, 0>;
  D.21966 = D.21947 & 2;
  if (D.21966 != 0) goto <D.21967>; else goto <D.21968>;
  <D.21967>:
  D.21963 = &frame->assert;
  D.21969 = method->klass;
  mono_declsec_get_class_action (D.21969, 3, D.21963);
  <D.21968>:
  <D.21965>:
  <D.21959>:
  if (info != 0B) goto <D.21972>; else goto <D.21970>;
  <D.21972>:
  D.21947 = BIT_FIELD_REF <*info, 8, 0>;
  D.21973 = D.21947 & 32;
  if (D.21973 != 0) goto <D.21974>; else goto <D.21970>;
  <D.21974>:
  D.21975 = &frame->deny;
  mono_declsec_get_method_action (method, 4, D.21975);
  goto <D.21971>;
  <D.21970>:
  if (info != 0B) goto <D.21976>; else goto <D.21977>;
  <D.21976>:
  D.21947 = BIT_FIELD_REF <*info, 8, 0>;
  D.21978 = D.21947 & 4;
  if (D.21978 != 0) goto <D.21979>; else goto <D.21980>;
  <D.21979>:
  D.21975 = &frame->deny;
  D.21969 = method->klass;
  mono_declsec_get_class_action (D.21969, 4, D.21975);
  <D.21980>:
  <D.21977>:
  <D.21971>:
  if (info != 0B) goto <D.21983>; else goto <D.21981>;
  <D.21983>:
  D.21947 = BIT_FIELD_REF <*info, 8, 0>;
  D.21984 = D.21947 & 64;
  if (D.21984 != 0) goto <D.21985>; else goto <D.21981>;
  <D.21985>:
  D.21986 = &frame->permitonly;
  mono_declsec_get_method_action (method, 5, D.21986);
  goto <D.21982>;
  <D.21981>:
  if (info != 0B) goto <D.21987>; else goto <D.21988>;
  <D.21987>:
  D.21947 = BIT_FIELD_REF <*info, 8, 0>;
  D.21989 = D.21947 & 8;
  if (D.21989 != 0) goto <D.21990>; else goto <D.21991>;
  <D.21990>:
  D.21986 = &frame->permitonly;
  D.21969 = method->klass;
  mono_declsec_get_class_action (D.21969, 5, D.21986);
  <D.21991>:
  <D.21988>:
  <D.21982>:
  D.21992 = frame;
  return D.21992;
}


mono_declsec_linkdemand (struct MonoDomain * domain, struct MonoMethod * caller, struct MonoMethod * callee)
{
  struct MonoClass * D.21994;
  struct MonoImage * D.21995;
  struct MonoImage * D.21996;
  struct MonoClass * D.21999;
  struct MonoImage * D.22000;
  guint32 D.22003;
  short unsigned int D.22004;
  int D.22005;
  int D.22006;
  int D.22009;
  short unsigned int D.22013;
  int D.22014;
  int D.22015;
  int D.22018;
  int D.22023;
  unsigned char D.22028;
  int D.22031;
  guint32 violation;

  violation = 0;
  D.21994 = caller->klass;
  D.21995 = D.21994->image;
  D.21996 = mono_defaults.corlib;
  if (D.21995 == D.21996) goto <D.21997>; else goto <D.21998>;
  <D.21997>:
  D.21999 = callee->klass;
  D.22000 = D.21999->image;
  D.21996 = mono_defaults.corlib;
  if (D.22000 == D.21996) goto <D.22001>; else goto <D.22002>;
  <D.22001>:
  D.22003 = violation;
  return D.22003;
  <D.22002>:
  <D.21998>:
  D.22004 = callee->iflags;
  D.22005 = (int) D.22004;
  D.22006 = D.22005 & 4096;
  if (D.22006 != 0) goto <D.22007>; else goto <D.22008>;
  <D.22007>:
  D.22009 = mono_declsec_linkdemand_icall (domain, caller, callee);
  if (D.22009 != 0) goto <D.22010>; else goto <D.22011>;
  <D.22010>:
  violation = 4;
  <D.22011>:
  goto <D.22012>;
  <D.22008>:
  D.22013 = callee->flags;
  D.22014 = (int) D.22013;
  D.22015 = D.22014 & 8192;
  if (D.22015 != 0) goto <D.22016>; else goto <D.22017>;
  <D.22016>:
  D.22018 = mono_declsec_linkdemand_pinvoke (domain, caller, callee);
  if (D.22018 != 0) goto <D.22019>; else goto <D.22020>;
  <D.22019>:
  violation = 8;
  <D.22020>:
  <D.22017>:
  <D.22012>:
  if (violation == 0) goto <D.22021>; else goto <D.22022>;
  <D.22021>:
  D.22023 = mono_declsec_linkdemand_aptc (domain, caller, callee);
  if (D.22023 != 0) goto <D.22024>; else goto <D.22025>;
  <D.22024>:
  violation = 2;
  <D.22025>:
  <D.22022>:
  if (violation == 0) goto <D.22026>; else goto <D.22027>;
  <D.22026>:
  D.22028 = mono_method_has_declsec (callee);
  if (D.22028 != 0) goto <D.22029>; else goto <D.22030>;
  <D.22029>:
  D.22031 = mono_declsec_linkdemand_standard (domain, caller, callee);
  if (D.22031 != 0) goto <D.22032>; else goto <D.22033>;
  <D.22032>:
  violation = 1;
  <D.22033>:
  <D.22030>:
  <D.22027>:
  D.22003 = violation;
  return D.22003;
}


mono_declsec_linkdemand_icall (struct MonoDomain * domain, struct MonoMethod * caller, struct MonoMethod * icall)
{
  struct MonoClass * D.22035;
  struct MonoImage * D.22036;
  <unnamed-unsigned:2> D.22037;
  int D.22038;
  int D.22039;
  <unnamed-unsigned:2> iftmp.1;
  unsigned int size.2;
  int size.3;
  int D.22045;
  int D.22049;
  gboolean D.22052;
  struct MonoClass * D.22053;
  struct MonoImage * D.22054;
  int D.22055;
  _Bool D.22056;
  struct MonoAssembly * assembly;

  InterlockedIncrement (&mono_jit_stats.cas_linkdemand_icall);
  D.22035 = icall->klass;
  D.22036 = D.22035->image;
  assembly = mono_image_get_assembly (D.22036);
  D.22037 = assembly->ecma;
  D.22038 = (int) D.22037;
  D.22039 = D.22038 & 2;
  if (D.22039 == 0) goto <D.22040>; else goto <D.22041>;
  <D.22040>:
  {
    guint32 size;
    const char * pk;

    try
      {
        size = 0;
        D.22035 = icall->klass;
        D.22036 = D.22035->image;
        pk = mono_image_get_public_key (D.22036, &size);
        size.2 = size;
        size.3 = (int) size.2;
        D.22045 = mono_is_ecma_key (pk, size.3);
        if (D.22045 != 0) goto <D.22046>; else goto <D.22047>;
        <D.22046>:
        iftmp.1 = 3;
        goto <D.22048>;
        <D.22047>:
        iftmp.1 = 2;
        <D.22048>:
        assembly->ecma = iftmp.1;
      }
    finally
      {
        size = {CLOBBER};
      }
  }
  <D.22041>:
  D.22037 = assembly->ecma;
  D.22038 = (int) D.22037;
  D.22049 = D.22038 & 1;
  if (D.22049 != 0) goto <D.22050>; else goto <D.22051>;
  <D.22050>:
  D.22052 = 0;
  return D.22052;
  <D.22051>:
  D.22053 = caller->klass;
  D.22054 = D.22053->image;
  assembly = mono_image_get_assembly (D.22054);
  D.22055 = mono_declsec_is_assembly_fulltrust (domain, assembly);
  D.22056 = D.22055 == 0;
  D.22052 = (gboolean) D.22056;
  return D.22052;
}


mono_declsec_is_assembly_fulltrust (struct MonoDomain * domain, struct MonoAssembly * assembly)
{
  <unnamed-unsigned:2> D.22058;
  int D.22059;
  int D.22060;
  _Bool D.22063;
  _Bool D.22064;
  _Bool D.22065;
  struct MonoMethod * D.22068;
  void * D.22069;
  unsigned char D.22070;
  gboolean D.22073;
  int D.22074;

  D.22058 = assembly->fulltrust;
  D.22059 = (int) D.22058;
  D.22060 = D.22059 & 2;
  if (D.22060 == 0) goto <D.22061>; else goto <D.22062>;
  <D.22061>:
  {
    struct MonoReflectionAssembly * refass;
    struct MonoSecurityManager * secman;

    refass = mono_assembly_get_object (domain, assembly);
    secman = mono_security_manager_get_methods ();
    D.22063 = secman != 0B;
    D.22064 = refass != 0B;
    D.22065 = D.22063 & D.22064;
    if (D.22065 != 0) goto <D.22066>; else goto <D.22067>;
    <D.22066>:
    {
      struct MonoObject * res;
      void * args[1];

      try
        {
          args[0] = refass;
          D.22068 = secman->linkdemandfulltrust;
          res = mono_runtime_invoke (D.22068, 0B, &args, 0B);
          D.22069 = mono_object_unbox (res);
          D.22070 = MEM[(MonoBoolean *)D.22069];
          if (D.22070 != 0) goto <D.22071>; else goto <D.22072>;
          <D.22071>:
          assembly->fulltrust = 3;
          D.22073 = 1;
          return D.22073;
          <D.22072>:
        }
      finally
        {
          args = {CLOBBER};
        }
    }
    <D.22067>:
    assembly->fulltrust = 2;
    D.22073 = 0;
    return D.22073;
  }
  <D.22062>:
  D.22058 = assembly->fulltrust;
  D.22074 = (int) D.22058;
  D.22073 = D.22074 & 1;
  return D.22073;
}


mono_declsec_linkdemand_pinvoke (struct MonoDomain * domain, struct MonoMethod * caller, struct MonoMethod * native)
{
  struct MonoClass * D.22078;
  struct MonoImage * D.22079;
  <unnamed-unsigned:2> D.22080;
  int D.22081;
  int D.22082;
  <unnamed-unsigned:2> D.22085;
  unsigned int D.22086;
  unsigned int D.22087;
  gboolean D.22090;
  _Bool D.22091;
  _Bool D.22092;
  _Bool D.22093;
  struct MonoMethod * D.22096;
  void * D.22097;
  unsigned char D.22098;
  int D.22101;
  struct MonoAssembly * assembly;

  D.22078 = caller->klass;
  D.22079 = D.22078->image;
  assembly = mono_image_get_assembly (D.22079);
  InterlockedIncrement (&mono_jit_stats.cas_linkdemand_pinvoke);
  D.22080 = assembly->unmanaged;
  D.22081 = (int) D.22080;
  D.22082 = D.22081 & 2;
  if (D.22082 == 0) goto <D.22083>; else goto <D.22084>;
  <D.22083>:
  D.22085 = assembly->fulltrust;
  D.22086 = (unsigned int) D.22085;
  D.22087 = D.22086 & 3;
  if (D.22087 == 3) goto <D.22088>; else goto <D.22089>;
  <D.22088>:
  assembly->unmanaged = 3;
  D.22090 = 0;
  return D.22090;
  <D.22089>:
  {
    struct MonoReflectionAssembly * refass;
    struct MonoSecurityManager * secman;

    refass = mono_assembly_get_object (domain, assembly);
    secman = mono_security_manager_get_methods ();
    D.22091 = secman != 0B;
    D.22092 = refass != 0B;
    D.22093 = D.22091 & D.22092;
    if (D.22093 != 0) goto <D.22094>; else goto <D.22095>;
    <D.22094>:
    {
      struct MonoObject * res;
      void * args[1];

      try
        {
          args[0] = refass;
          D.22096 = secman->linkdemandunmanaged;
          res = mono_runtime_invoke (D.22096, 0B, &args, 0B);
          D.22097 = mono_object_unbox (res);
          D.22098 = MEM[(MonoBoolean *)D.22097];
          if (D.22098 != 0) goto <D.22099>; else goto <D.22100>;
          <D.22099>:
          assembly->unmanaged = 3;
          D.22090 = 0;
          return D.22090;
          <D.22100>:
        }
      finally
        {
          args = {CLOBBER};
        }
    }
    <D.22095>:
  }
  assembly->unmanaged = 2;
  <D.22084>:
  D.22080 = assembly->unmanaged;
  D.22081 = (int) D.22080;
  D.22101 = D.22081 & 1;
  if (D.22101 != 0) goto <D.22102>; else goto <D.22103>;
  <D.22102>:
  D.22090 = 0;
  return D.22090;
  <D.22103>:
  D.22090 = 1;
  return D.22090;
}


mono_declsec_linkdemand_aptc (struct MonoDomain * domain, struct MonoMethod * caller, struct MonoMethod * callee)
{
  struct MonoClass * D.22107;
  struct MonoImage * D.22108;
  struct MonoClass * D.22109;
  struct MonoImage * D.22110;
  gboolean D.22113;
  unsigned int D.22116;
  unsigned int D.22117;
  short unsigned int D.22119;
  int D.22120;
  int D.22121;
  const char * D.22124;
  unsigned int size.4;
  <unnamed-unsigned:2> D.22127;
  int D.22128;
  int D.22129;
  _Bool D.22132;
  _Bool D.22133;
  _Bool D.22134;
  struct MonoClass * D.22137;
  <unnamed-unsigned:2> iftmp.5;
  int D.22144;
  int D.22147;
  struct MonoSecurityManager * secman;
  struct MonoAssembly * assembly;
  guint32 size;

  try
    {
      secman = 0B;
      size = 0;
      InterlockedIncrement (&mono_jit_stats.cas_linkdemand_aptc);
      D.22107 = caller->klass;
      D.22108 = D.22107->image;
      D.22109 = callee->klass;
      D.22110 = D.22109->image;
      if (D.22108 == D.22110) goto <D.22111>; else goto <D.22112>;
      <D.22111>:
      D.22113 = 0;
      return D.22113;
      <D.22112>:
      D.22109 = callee->klass;
      D.22116 = D.22109->flags;
      D.22117 = D.22116 & 1;
      if (D.22117 == 0) goto <D.22114>; else goto <D.22118>;
      <D.22118>:
      D.22119 = callee->flags;
      D.22120 = (int) D.22119;
      D.22121 = D.22120 & 6;
      if (D.22121 == 0) goto <D.22114>; else goto <D.22115>;
      <D.22114>:
      D.22113 = 0;
      return D.22113;
      <D.22115>:
      D.22109 = callee->klass;
      D.22110 = D.22109->image;
      D.22124 = mono_image_get_public_key (D.22110, &size);
      if (D.22124 == 0B) goto <D.22122>; else goto <D.22125>;
      <D.22125>:
      size.4 = size;
      if (size.4 <= 15) goto <D.22122>; else goto <D.22123>;
      <D.22122>:
      D.22113 = 0;
      return D.22113;
      <D.22123>:
      D.22109 = callee->klass;
      D.22110 = D.22109->image;
      assembly = mono_image_get_assembly (D.22110);
      D.22127 = assembly->aptc;
      D.22128 = (int) D.22127;
      D.22129 = D.22128 & 2;
      if (D.22129 == 0) goto <D.22130>; else goto <D.22131>;
      <D.22130>:
      {
        struct MonoCustomAttrInfo * cinfo;
        gboolean result;

        cinfo = mono_custom_attrs_from_assembly (assembly);
        result = 0;
        secman = mono_security_manager_get_methods ();
        D.22132 = secman != 0B;
        D.22133 = cinfo != 0B;
        D.22134 = D.22132 & D.22133;
        if (D.22134 != 0) goto <D.22135>; else goto <D.22136>;
        <D.22135>:
        D.22137 = secman->allowpartiallytrustedcallers;
        result = mono_custom_attrs_has_attr (cinfo, D.22137);
        <D.22136>:
        if (cinfo != 0B) goto <D.22138>; else goto <D.22139>;
        <D.22138>:
        mono_custom_attrs_free (cinfo);
        <D.22139>:
        if (result != 0) goto <D.22141>; else goto <D.22142>;
        <D.22141>:
        iftmp.5 = 3;
        goto <D.22143>;
        <D.22142>:
        iftmp.5 = 2;
        <D.22143>:
        assembly->aptc = iftmp.5;
      }
      <D.22131>:
      D.22127 = assembly->aptc;
      D.22128 = (int) D.22127;
      D.22144 = D.22128 & 1;
      if (D.22144 != 0) goto <D.22145>; else goto <D.22146>;
      <D.22145>:
      D.22113 = 0;
      return D.22113;
      <D.22146>:
      D.22107 = caller->klass;
      D.22108 = D.22107->image;
      assembly = mono_image_get_assembly (D.22108);
      D.22147 = mono_declsec_is_assembly_fulltrust (domain, assembly);
      if (D.22147 != 0) goto <D.22148>; else goto <D.22149>;
      <D.22148>:
      D.22113 = 0;
      return D.22113;
      <D.22149>:
      D.22113 = 1;
      return D.22113;
    }
  finally
    {
      size = {CLOBBER};
    }
}


mono_declsec_linkdemand_standard (struct MonoDomain * domain, struct MonoMethod * caller, struct MonoMethod * callee)
{
  unsigned char D.22152;
  struct MonoClass * D.22155;
  struct MonoImage * D.22156;
  struct MonoMethod * D.22157;
  gboolean D.22158;
  void * D.22159;
  unsigned char D.22160;
  _Bool D.22161;
  struct MonoDeclSecurityActions linkclass;
  struct MonoDeclSecurityActions linkmethod;

  try
    {
      InterlockedIncrement (&mono_jit_stats.cas_linkdemand);
      D.22152 = mono_declsec_get_linkdemands (callee, &linkclass, &linkmethod);
      if (D.22152 != 0) goto <D.22153>; else goto <D.22154>;
      <D.22153>:
      {
        struct MonoAssembly * assembly;
        struct MonoReflectionAssembly * refass;
        struct MonoSecurityManager * secman;
        struct MonoObject * res;
        void * args[3];

        try
          {
            D.22155 = caller->klass;
            D.22156 = D.22155->image;
            assembly = mono_image_get_assembly (D.22156);
            refass = mono_assembly_get_object (domain, assembly);
            secman = mono_security_manager_get_methods ();
            args[0] = refass;
            args[1] = &linkclass;
            args[2] = &linkmethod;
            D.22157 = secman->linkdemand;
            res = mono_runtime_invoke (D.22157, 0B, &args, 0B);
            D.22159 = mono_object_unbox (res);
            D.22160 = MEM[(MonoBoolean *)D.22159];
            D.22161 = D.22160 == 0;
            D.22158 = (gboolean) D.22161;
            return D.22158;
          }
        finally
          {
            args = {CLOBBER};
          }
      }
      <D.22154>:
      D.22158 = 0;
      return D.22158;
    }
  finally
    {
      linkclass = {CLOBBER};
      linkmethod = {CLOBBER};
    }
}


