mono_dl_open (const char * name, int flags, char * * error_msg)
{
  gchar * D.4852;
  struct MonoDl * D.4853;
  _Bool D.4854;
  int D.4855;
  void * (*<T2dd>) (const char *, int, char * *, void *) D.4860;
  void * D.4861;
  char * D.4864;
  _Bool D.4869;
  _Bool D.4870;
  _Bool D.4871;
  int D.4801;
  int iftmp.0;
  int D.4800;
  const char[4] * D.4881;
  unsigned char D.4882;
  int D.4883;
  unsigned char D.4884;
  int D.4885;
  _Bool D.4886;
  _Bool D.4887;
  _Bool D.4888;
  const unsigned char * D.4891;
  unsigned char D.4892;
  int D.4893;
  const unsigned char * D.4894;
  unsigned char D.4895;
  int D.4896;
  _Bool D.4897;
  _Bool D.4898;
  const unsigned char * D.4901;
  unsigned char D.4902;
  int D.4903;
  const unsigned char * D.4904;
  unsigned char D.4905;
  int D.4906;
  _Bool D.4907;
  _Bool D.4908;
  const unsigned char * D.4911;
  unsigned char D.4912;
  int D.4913;
  const unsigned char * D.4914;
  unsigned char D.4915;
  int D.4916;
  char * D.4926;
  gchar * D.4927;
  struct MonoDl * module;
  void * lib;
  struct MonoDlFallbackHandler * dl_fallback;
  int lflags;

  dl_fallback = 0B;
  lflags = convert_flags (flags);
  if (error_msg != 0B) goto <D.4846>; else goto <D.4847>;
  <D.4846>:
  *error_msg = 0B;
  <D.4847>:
  module = malloc (12);
  if (module == 0B) goto <D.4848>; else goto <D.4849>;
  <D.4848>:
  if (error_msg != 0B) goto <D.4850>; else goto <D.4851>;
  <D.4850>:
  D.4852 = monoeg_strdup ("Out of memory");
  *error_msg = D.4852;
  <D.4851>:
  D.4853 = 0B;
  return D.4853;
  <D.4849>:
  D.4854 = name == 0B;
  D.4855 = (int) D.4854;
  module->main_module = D.4855;
  lib = dlopen (name, lflags);
  if (lib == 0B) goto <D.4856>; else goto <D.4857>;
  <D.4856>:
  {
    struct GSList * node;

    node = fallback_handlers;
    goto <D.4788>;
    <D.4787>:
    {
      struct MonoDlFallbackHandler * handler;

      handler = node->data;
      if (error_msg != 0B) goto <D.4858>; else goto <D.4859>;
      <D.4858>:
      *error_msg = 0B;
      <D.4859>:
      D.4860 = handler->load_func;
      D.4861 = handler->user_data;
      lib = D.4860 (name, lflags, error_msg, D.4861);
      if (error_msg != 0B) goto <D.4862>; else goto <D.4863>;
      <D.4862>:
      D.4864 = *error_msg;
      if (D.4864 != 0B) goto <D.4865>; else goto <D.4866>;
      <D.4865>:
      D.4864 = *error_msg;
      monoeg_g_free (D.4864);
      <D.4866>:
      <D.4863>:
      if (lib != 0B) goto <D.4867>; else goto <D.4868>;
      <D.4867>:
      dl_fallback = handler;
      goto <D.4786>;
      <D.4868>:
    }
    node = node->next;
    <D.4788>:
    if (node != 0B) goto <D.4787>; else goto <D.4786>;
    <D.4786>:
  }
  <D.4857>:
  D.4869 = lib == 0B;
  D.4870 = dl_fallback == 0B;
  D.4871 = D.4869 & D.4870;
  if (D.4871 != 0) goto <D.4872>; else goto <D.4873>;
  <D.4872>:
  {
    char * lname;
    char * llname;
    const char * suff;
    const char * ext;

    if (name == 0B) goto <D.4874>; else goto <D.4875>;
    <D.4874>:
    free (module);
    D.4853 = 0B;
    return D.4853;
    <D.4875>:
    suff = ".la";
    ext = strrchr (name, 46);
    if (ext != 0B) goto <D.4876>; else goto <D.4877>;
    <D.4876>:
    {
      size_t __s1_len;
      size_t __s2_len;

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

        __s2 = ext;
        D.4881 = ".la";
        D.4882 = MEM[(const unsigned char *)D.4881];
        D.4883 = (int) D.4882;
        D.4884 = *__s2;
        D.4885 = (int) D.4884;
        __result = D.4883 - D.4885;
        {
          D.4886 = __s2_len != 0;
          D.4887 = __result == 0;
          D.4888 = D.4886 & D.4887;
          if (D.4888 != 0) goto <D.4889>; else goto <D.4890>;
          <D.4889>:
          D.4891 = &MEM[(void *)".la" + 1B];
          D.4892 = *D.4891;
          D.4893 = (int) D.4892;
          D.4894 = __s2 + 1;
          D.4895 = *D.4894;
          D.4896 = (int) D.4895;
          __result = D.4893 - D.4896;
          D.4897 = __s2_len > 1;
          D.4887 = __result == 0;
          D.4898 = D.4897 & D.4887;
          if (D.4898 != 0) goto <D.4899>; else goto <D.4900>;
          <D.4899>:
          D.4901 = &MEM[(void *)".la" + 2B];
          D.4902 = *D.4901;
          D.4903 = (int) D.4902;
          D.4904 = __s2 + 2;
          D.4905 = *D.4904;
          D.4906 = (int) D.4905;
          __result = D.4903 - D.4906;
          D.4907 = __s2_len > 2;
          D.4887 = __result == 0;
          D.4908 = D.4907 & D.4887;
          if (D.4908 != 0) goto <D.4909>; else goto <D.4910>;
          <D.4909>:
          D.4911 = &MEM[(void *)".la" + 3B];
          D.4912 = *D.4911;
          D.4913 = (int) D.4912;
          D.4914 = __s2 + 3;
          D.4915 = *D.4914;
          D.4916 = (int) D.4915;
          __result = D.4913 - D.4916;
          <D.4910>:
          <D.4900>:
          <D.4890>:
        }
        D.4800 = __result;
      }
      iftmp.0 = -D.4800;
      goto <D.4917>;
      <D.4880>:
      iftmp.0 = __builtin_strcmp (ext, ".la");
      <D.4917>:
      D.4801 = iftmp.0;
    }
    if (D.4801 == 0) goto <D.4918>; else goto <D.4919>;
    <D.4918>:
    suff = "";
    <D.4919>:
    <D.4877>:
    lname = monoeg_g_strconcat (name, suff, 0B);
    llname = get_dl_name_from_libtool (lname);
    monoeg_g_free (lname);
    if (llname != 0B) goto <D.4920>; else goto <D.4921>;
    <D.4920>:
    lib = dlopen (llname, lflags);
    monoeg_g_free (llname);
    <D.4921>:
    if (lib == 0B) goto <D.4922>; else goto <D.4923>;
    <D.4922>:
    if (error_msg != 0B) goto <D.4924>; else goto <D.4925>;
    <D.4924>:
    D.4926 = dlerror ();
    D.4927 = monoeg_strdup (D.4926);
    *error_msg = D.4927;
    <D.4925>:
    free (module);
    D.4853 = 0B;
    return D.4853;
    <D.4923>:
  }
  <D.4873>:
  module->handle = lib;
  module->dl_fallback = dl_fallback;
  D.4853 = module;
  return D.4853;
}


convert_flags (int flags)
{
  int iftmp.1;
  int D.4930;
  int D.4934;
  int D.4938;
  int lflags;

  D.4930 = flags & 2;
  if (D.4930 != 0) goto <D.4931>; else goto <D.4932>;
  <D.4931>:
  iftmp.1 = 0;
  goto <D.4933>;
  <D.4932>:
  iftmp.1 = 256;
  <D.4933>:
  lflags = iftmp.1;
  D.4934 = flags & 1;
  if (D.4934 != 0) goto <D.4935>; else goto <D.4936>;
  <D.4935>:
  lflags = lflags | 1;
  goto <D.4937>;
  <D.4936>:
  lflags = lflags | 2;
  <D.4937>:
  D.4938 = lflags;
  return D.4938;
}


get_dl_name_from_libtool (const char * libtool_file)
{
  char * D.4942;
  char D.4943;
  const short unsigned int * * D.4945;
  const short unsigned int * D.4946;
  unsigned int D.4947;
  unsigned int D.4948;
  const short unsigned int * D.4949;
  short unsigned int D.4950;
  int D.4951;
  int D.4952;
  char D.4953;
  _Bool D.4954;
  _Bool D.4955;
  _Bool D.4956;
  int D.4959;
  char * D.4962;
  int D.4964;
  int D.4968;
  char * D.4971;
  int D.4773;
  int iftmp.2;
  int D.4772;
  const char[3] * D.4978;
  unsigned char D.4979;
  int D.4980;
  unsigned char D.4981;
  int D.4982;
  _Bool D.4983;
  _Bool D.4984;
  _Bool D.4985;
  const unsigned char * D.4988;
  unsigned char D.4989;
  int D.4990;
  const unsigned char * D.4991;
  unsigned char D.4992;
  int D.4993;
  _Bool D.4994;
  _Bool D.4995;
  const unsigned char * D.4998;
  unsigned char D.4999;
  int D.5000;
  const unsigned char * D.5001;
  unsigned char D.5002;
  int D.5003;
  _Bool D.5004;
  _Bool D.5005;
  const unsigned char * D.5008;
  unsigned char D.5009;
  int D.5010;
  const unsigned char * D.5011;
  unsigned char D.5012;
  int D.5013;
  _Bool D.5018;
  _Bool D.5019;
  _Bool D.5020;
  struct FILE * file;
  char buf[512];
  char * line;
  char * dlname;
  char * libdir;
  char * installed;

  try
    {
      dlname = 0B;
      libdir = 0B;
      installed = 0B;
      file = fopen (libtool_file, "r");
      if (file == 0B) goto <D.4940>; else goto <D.4941>;
      <D.4940>:
      D.4942 = 0B;
      return D.4942;
      <D.4941>:
      goto <D.4735>;
      <D.4763>:
      goto <D.4733>;
      <D.4732>:
      line = line + 1;
      <D.4733>:
      D.4943 = *line;
      if (D.4943 != 0) goto <D.4944>; else goto <D.4734>;
      <D.4944>:
      D.4945 = __ctype_b_loc ();
      D.4946 = *D.4945;
      D.4943 = *line;
      D.4947 = (unsigned int) D.4943;
      D.4948 = D.4947 * 2;
      D.4949 = D.4946 + D.4948;
      D.4950 = *D.4949;
      D.4951 = (int) D.4950;
      D.4952 = D.4951 & 8192;
      if (D.4952 != 0) goto <D.4732>; else goto <D.4734>;
      <D.4734>:
      D.4953 = *line;
      D.4954 = D.4953 == 35;
      D.4955 = D.4953 == 0;
      D.4956 = D.4954 | D.4955;
      if (D.4956 != 0) goto <D.4957>; else goto <D.4958>;
      <D.4957>:
      // predicted unlikely by continue predictor.
      goto <D.4735>;
      <D.4958>:
      D.4959 = strncmp ("dlname", line, 6);
      if (D.4959 == 0) goto <D.4960>; else goto <D.4961>;
      <D.4960>:
      monoeg_g_free (dlname);
      D.4962 = line + 6;
      dlname = read_string (D.4962, file);
      goto <D.4963>;
      <D.4961>:
      D.4964 = strncmp ("libdir", line, 6);
      if (D.4964 == 0) goto <D.4965>; else goto <D.4966>;
      <D.4965>:
      monoeg_g_free (libdir);
      D.4962 = line + 6;
      libdir = read_string (D.4962, file);
      goto <D.4967>;
      <D.4966>:
      D.4968 = strncmp ("installed", line, 9);
      if (D.4968 == 0) goto <D.4969>; else goto <D.4970>;
      <D.4969>:
      monoeg_g_free (installed);
      D.4971 = line + 9;
      installed = read_string (D.4971, file);
      <D.4970>:
      <D.4967>:
      <D.4963>:
      <D.4735>:
      line = fgets (&buf, 512, file);
      if (line != 0B) goto <D.4763>; else goto <D.4764>;
      <D.4764>:
      fclose (file);
      line = 0B;
      if (installed != 0B) goto <D.4974>; else goto <D.4972>;
      <D.4974>:
      {
        size_t __s1_len;
        size_t __s2_len;

        __s2_len = 2;
        if (__s2_len <= 3) goto <D.4976>; else goto <D.4977>;
        <D.4976>:
        {
          const unsigned char * __s2;
          int __result;

          __s2 = installed;
          D.4978 = "no";
          D.4979 = MEM[(const unsigned char *)D.4978];
          D.4980 = (int) D.4979;
          D.4981 = *__s2;
          D.4982 = (int) D.4981;
          __result = D.4980 - D.4982;
          {
            D.4983 = __s2_len != 0;
            D.4984 = __result == 0;
            D.4985 = D.4983 & D.4984;
            if (D.4985 != 0) goto <D.4986>; else goto <D.4987>;
            <D.4986>:
            D.4988 = &MEM[(void *)"no" + 1B];
            D.4989 = *D.4988;
            D.4990 = (int) D.4989;
            D.4991 = __s2 + 1;
            D.4992 = *D.4991;
            D.4993 = (int) D.4992;
            __result = D.4990 - D.4993;
            D.4994 = __s2_len > 1;
            D.4984 = __result == 0;
            D.4995 = D.4994 & D.4984;
            if (D.4995 != 0) goto <D.4996>; else goto <D.4997>;
            <D.4996>:
            D.4998 = &MEM[(void *)"no" + 2B];
            D.4999 = *D.4998;
            D.5000 = (int) D.4999;
            D.5001 = __s2 + 2;
            D.5002 = *D.5001;
            D.5003 = (int) D.5002;
            __result = D.5000 - D.5003;
            D.5004 = __s2_len > 2;
            D.4984 = __result == 0;
            D.5005 = D.5004 & D.4984;
            if (D.5005 != 0) goto <D.5006>; else goto <D.5007>;
            <D.5006>:
            D.5008 = &MEM[(void *)"no" + 3B];
            D.5009 = *D.5008;
            D.5010 = (int) D.5009;
            D.5011 = __s2 + 3;
            D.5012 = *D.5011;
            D.5013 = (int) D.5012;
            __result = D.5010 - D.5013;
            <D.5007>:
            <D.4997>:
            <D.4987>:
          }
          D.4772 = __result;
        }
        iftmp.2 = -D.4772;
        goto <D.5014>;
        <D.4977>:
        iftmp.2 = __builtin_strcmp (installed, "no");
        <D.5014>:
        D.4773 = iftmp.2;
      }
      if (D.4773 == 0) goto <D.5015>; else goto <D.4972>;
      <D.5015>:
      {
        char * dir;

        dir = monoeg_g_path_get_dirname (libtool_file);
        if (dlname != 0B) goto <D.5016>; else goto <D.5017>;
        <D.5016>:
        line = monoeg_g_strconcat (dir, "/.libs/", dlname, 0B);
        <D.5017>:
        monoeg_g_free (dir);
      }
      goto <D.4973>;
      <D.4972>:
      D.5018 = libdir != 0B;
      D.5019 = dlname != 0B;
      D.5020 = D.5018 & D.5019;
      if (D.5020 != 0) goto <D.5021>; else goto <D.5022>;
      <D.5021>:
      line = monoeg_g_strconcat (libdir, "/", dlname, 0B);
      <D.5022>:
      <D.4973>:
      monoeg_g_free (dlname);
      monoeg_g_free (libdir);
      monoeg_g_free (installed);
      D.4942 = line;
      return D.4942;
    }
  finally
    {
      buf = {CLOBBER};
    }
}


read_string (char * p, struct FILE * file)
{
  char D.5025;
  const short unsigned int * * D.5027;
  const short unsigned int * D.5028;
  unsigned int D.5029;
  unsigned int D.5030;
  const short unsigned int * D.5031;
  short unsigned int D.5032;
  int D.5033;
  int D.5034;
  char * D.5037;
  char D.5041;
  _Bool D.5042;
  _Bool D.5043;
  _Bool D.5044;
  char * iftmp.3;
  int D.5050;
  int D.5051;
  int endp.4;
  int startp.5;
  int D.5058;
  int D.5059;
  unsigned int D.5060;
  int p.6;
  int D.5065;
  int D.5066;
  unsigned int D.5067;
  char * endp;
  char * startp;

  goto <D.4714>;
  <D.4713>:
  p = p + 1;
  <D.4714>:
  D.5025 = *p;
  if (D.5025 != 0) goto <D.5026>; else goto <D.4715>;
  <D.5026>:
  D.5027 = __ctype_b_loc ();
  D.5028 = *D.5027;
  D.5025 = *p;
  D.5029 = (unsigned int) D.5025;
  D.5030 = D.5029 * 2;
  D.5031 = D.5028 + D.5030;
  D.5032 = *D.5031;
  D.5033 = (int) D.5032;
  D.5034 = D.5033 & 8192;
  if (D.5034 != 0) goto <D.4713>; else goto <D.4715>;
  <D.4715>:
  D.5025 = *p;
  if (D.5025 == 0) goto <D.5035>; else goto <D.5036>;
  <D.5035>:
  D.5037 = 0B;
  return D.5037;
  <D.5036>:
  D.5025 = *p;
  if (D.5025 == 61) goto <D.5038>; else goto <D.5039>;
  <D.5038>:
  p = p + 1;
  <D.5039>:
  goto <D.4717>;
  <D.4716>:
  p = p + 1;
  <D.4717>:
  D.5025 = *p;
  if (D.5025 != 0) goto <D.5040>; else goto <D.4718>;
  <D.5040>:
  D.5027 = __ctype_b_loc ();
  D.5028 = *D.5027;
  D.5025 = *p;
  D.5029 = (unsigned int) D.5025;
  D.5030 = D.5029 * 2;
  D.5031 = D.5028 + D.5030;
  D.5032 = *D.5031;
  D.5033 = (int) D.5032;
  D.5034 = D.5033 & 8192;
  if (D.5034 != 0) goto <D.4716>; else goto <D.4718>;
  <D.4718>:
  D.5041 = *p;
  D.5042 = D.5041 == 39;
  D.5043 = D.5041 == 34;
  D.5044 = D.5042 | D.5043;
  if (D.5044 != 0) goto <D.5045>; else goto <D.5046>;
  <D.5045>:
  {
    char t;

    t = *p;
    p = p + 1;
    startp = p;
    D.5050 = (int) t;
    D.5051 = __builtin_constant_p (D.5050);
    if (D.5051 != 0) goto <D.5052>; else goto <D.5048>;
    <D.5052>:
    if (t == 0) goto <D.5053>; else goto <D.5048>;
    <D.5053>:
    D.5050 = (int) t;
    iftmp.3 = __rawmemchr (p, D.5050);
    goto <D.5049>;
    <D.5048>:
    D.5050 = (int) t;
    iftmp.3 = __builtin_strchr (p, D.5050);
    <D.5049>:
    endp = iftmp.3;
    if (endp == 0B) goto <D.5054>; else goto <D.5055>;
    <D.5054>:
    D.5037 = 0B;
    return D.5037;
    <D.5055>:
    *endp = 0;
    endp.4 = (int) endp;
    startp.5 = (int) startp;
    D.5058 = endp.4 - startp.5;
    D.5059 = D.5058 + 1;
    D.5060 = (unsigned int) D.5059;
    D.5037 = monoeg_g_memdup (startp, D.5060);
    return D.5037;
  }
  <D.5046>:
  D.5025 = *p;
  if (D.5025 == 0) goto <D.5061>; else goto <D.5062>;
  <D.5061>:
  D.5037 = 0B;
  return D.5037;
  <D.5062>:
  startp = p;
  goto <D.4721>;
  <D.4720>:
  p = p + 1;
  <D.4721>:
  D.5025 = *p;
  if (D.5025 != 0) goto <D.5063>; else goto <D.4722>;
  <D.5063>:
  D.5027 = __ctype_b_loc ();
  D.5028 = *D.5027;
  D.5025 = *p;
  D.5029 = (unsigned int) D.5025;
  D.5030 = D.5029 * 2;
  D.5031 = D.5028 + D.5030;
  D.5032 = *D.5031;
  D.5033 = (int) D.5032;
  D.5034 = D.5033 & 8192;
  if (D.5034 == 0) goto <D.4720>; else goto <D.4722>;
  <D.4722>:
  *p = 0;
  p.6 = (int) p;
  startp.5 = (int) startp;
  D.5065 = p.6 - startp.5;
  D.5066 = D.5065 + 1;
  D.5067 = (unsigned int) D.5066;
  D.5037 = monoeg_g_memdup (startp, D.5067);
  return D.5037;
}


fgets (char * restrict __s, int __n, struct FILE * restrict __stream)
{
  unsigned int D.5069;
  int D.5074;
  char * D.5076;
  unsigned int D.5077;
  unsigned int __n.7;
  unsigned int D.5079;
  unsigned int D.5082;

  D.5069 = __builtin_object_size (__s, 1);
  if (D.5069 != 4294967295) goto <D.5070>; else goto <D.5071>;
  <D.5070>:
  D.5074 = __builtin_constant_p (__n);
  if (D.5074 == 0) goto <D.5072>; else goto <D.5075>;
  <D.5075>:
  if (__n <= 0) goto <D.5072>; else goto <D.5073>;
  <D.5072>:
  D.5077 = __builtin_object_size (__s, 1);
  D.5076 = __fgets_chk (__s, D.5077, __n, __stream);
  return D.5076;
  <D.5073>:
  __n.7 = (unsigned int) __n;
  D.5079 = __builtin_object_size (__s, 1);
  if (__n.7 > D.5079) goto <D.5080>; else goto <D.5081>;
  <D.5080>:
  D.5082 = __builtin_object_size (__s, 1);
  D.5076 = __fgets_chk_warn (__s, D.5082, __n, __stream);
  return D.5076;
  <D.5081>:
  <D.5071>:
  D.5076 = __fgets_alias (__s, __n, __stream);
  return D.5076;
}


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

  if (str != 0B) goto <D.5084>; else goto <D.5085>;
  <D.5084>:
  D.5086 = __strdup (str);
  return D.5086;
  <D.5085>:
  D.5086 = 0B;
  return D.5086;
}


mono_dl_symbol (struct MonoDl * module, const char * name, void * * symbol)
{
  struct MonoDlFallbackHandler * D.5088;
  void * (*<T2e0>) (void *, const char *, char * *, void *) D.5091;
  void * D.5092;
  void * D.5093;
  char * D.5099;
  char * iftmp.8;
  char * D.5105;
  void * sym;
  char * err;

  try
    {
      err = 0B;
      D.5088 = module->dl_fallback;
      if (D.5088 != 0B) goto <D.5089>; else goto <D.5090>;
      <D.5089>:
      D.5088 = module->dl_fallback;
      D.5091 = D.5088->symbol_func;
      D.5088 = module->dl_fallback;
      D.5092 = D.5088->user_data;
      D.5093 = module->handle;
      sym = D.5091 (D.5093, name, &err, D.5092);
      goto <D.5094>;
      <D.5090>:
      D.5093 = module->handle;
      sym = dlsym (D.5093, name);
      <D.5094>:
      if (sym != 0B) goto <D.5095>; else goto <D.5096>;
      <D.5095>:
      if (symbol != 0B) goto <D.5097>; else goto <D.5098>;
      <D.5097>:
      *symbol = sym;
      <D.5098>:
      D.5099 = 0B;
      return D.5099;
      <D.5096>:
      if (symbol != 0B) goto <D.5100>; else goto <D.5101>;
      <D.5100>:
      *symbol = 0B;
      <D.5101>:
      D.5088 = module->dl_fallback;
      if (D.5088 == 0B) goto <D.5103>; else goto <D.5104>;
      <D.5103>:
      D.5105 = dlerror ();
      iftmp.8 = monoeg_strdup (D.5105);
      goto <D.5106>;
      <D.5104>:
      iftmp.8 = err;
      <D.5106>:
      D.5099 = iftmp.8;
      return D.5099;
    }
  finally
    {
      err = {CLOBBER};
    }
}


mono_dl_close (struct MonoDl * module)
{
  void * (*<T2e3>) (void *, void *) D.5111;
  void * D.5114;
  void * D.5115;
  struct MonoDlFallbackHandler * dl_fallback;

  dl_fallback = module->dl_fallback;
  if (dl_fallback != 0B) goto <D.5109>; else goto <D.5110>;
  <D.5109>:
  D.5111 = dl_fallback->close_func;
  if (D.5111 != 0B) goto <D.5112>; else goto <D.5113>;
  <D.5112>:
  D.5111 = dl_fallback->close_func;
  D.5114 = dl_fallback->user_data;
  D.5115 = module->handle;
  D.5111 (D.5115, D.5114);
  <D.5113>:
  goto <D.5116>;
  <D.5110>:
  D.5115 = module->handle;
  dlclose (D.5115);
  <D.5116>:
  free (module);
}


mono_dl_build_path (const char * directory, const char * name, void * * iter)
{
  char * D.5119;
  void * D.5120;
  unsigned int D.5126;
  int D.5132;
  unsigned int prlen.9;
  int D.4833;
  int iftmp.10;
  int D.4832;
  const char[4] * D.5139;
  unsigned char D.5140;
  int D.5141;
  unsigned char D.5142;
  int D.5143;
  _Bool D.5144;
  _Bool D.5145;
  _Bool D.5146;
  const unsigned char * D.5149;
  unsigned char D.5150;
  int D.5151;
  const unsigned char * D.5152;
  unsigned char D.5153;
  int D.5154;
  _Bool D.5155;
  _Bool D.5156;
  const unsigned char * D.5159;
  unsigned char D.5160;
  int D.5161;
  const unsigned char * D.5162;
  unsigned char D.5163;
  int D.5164;
  _Bool D.5165;
  _Bool D.5166;
  const unsigned char * D.5169;
  unsigned char D.5170;
  int D.5171;
  const unsigned char * D.5172;
  unsigned char D.5173;
  int D.5174;
  int D.5177;
  char * D.5183;
  unsigned int D.5184;
  sizetype suffixlen.11;
  sizetype D.5186;
  const char * D.5187;
  char D.5191;
  void * idx.12;
  int idx;
  const char * prefix;
  const char * suffix;
  gboolean first_call;
  int prlen;
  int suffixlen;
  char * res;

  if (iter == 0B) goto <D.5117>; else goto <D.5118>;
  <D.5117>:
  D.5119 = 0B;
  return D.5119;
  <D.5118>:
  D.5120 = *iter;
  idx = (int) D.5120;
  if (idx == 0) goto <D.5121>; else goto <D.5122>;
  <D.5121>:
  first_call = 1;
  suffix = "";
  suffixlen = 0;
  goto <D.5123>;
  <D.5122>:
  idx = idx + -1;
  if (idx != 0) goto <D.5124>; else goto <D.5125>;
  <D.5124>:
  D.5119 = 0B;
  return D.5119;
  <D.5125>:
  first_call = 0;
  suffix = &suffixes[idx];
  D.5126 = strlen (suffix);
  suffixlen = (int) D.5126;
  <D.5123>:
  prlen = 3;
  if (prlen != 0) goto <D.5129>; else goto <D.5127>;
  <D.5129>:
  D.5132 = __builtin_constant_p (prlen);
  if (D.5132 != 0) goto <D.5133>; else goto <D.5130>;
  <D.5133>:
  prlen.9 = (unsigned int) prlen;
  if (prlen.9 > 3) goto <D.5135>; else goto <D.5130>;
  <D.5135>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      __s2 = name;
      D.5139 = "lib";
      D.5140 = MEM[(const unsigned char *)D.5139];
      D.5141 = (int) D.5140;
      D.5142 = *__s2;
      D.5143 = (int) D.5142;
      __result = D.5141 - D.5143;
      {
        D.5144 = __s2_len != 0;
        D.5145 = __result == 0;
        D.5146 = D.5144 & D.5145;
        if (D.5146 != 0) goto <D.5147>; else goto <D.5148>;
        <D.5147>:
        D.5149 = &MEM[(void *)"lib" + 1B];
        D.5150 = *D.5149;
        D.5151 = (int) D.5150;
        D.5152 = __s2 + 1;
        D.5153 = *D.5152;
        D.5154 = (int) D.5153;
        __result = D.5151 - D.5154;
        D.5155 = __s2_len > 1;
        D.5145 = __result == 0;
        D.5156 = D.5155 & D.5145;
        if (D.5156 != 0) goto <D.5157>; else goto <D.5158>;
        <D.5157>:
        D.5159 = &MEM[(void *)"lib" + 2B];
        D.5160 = *D.5159;
        D.5161 = (int) D.5160;
        D.5162 = __s2 + 2;
        D.5163 = *D.5162;
        D.5164 = (int) D.5163;
        __result = D.5161 - D.5164;
        D.5165 = __s2_len > 2;
        D.5145 = __result == 0;
        D.5166 = D.5165 & D.5145;
        if (D.5166 != 0) goto <D.5167>; else goto <D.5168>;
        <D.5167>:
        D.5169 = &MEM[(void *)"lib" + 3B];
        D.5170 = *D.5169;
        D.5171 = (int) D.5170;
        D.5172 = __s2 + 3;
        D.5173 = *D.5172;
        D.5174 = (int) D.5173;
        __result = D.5171 - D.5174;
        <D.5168>:
        <D.5158>:
        <D.5148>:
      }
      D.4832 = __result;
    }
    iftmp.10 = -D.4832;
    goto <D.5175>;
    <D.5138>:
    iftmp.10 = __builtin_strcmp (name, "lib");
    <D.5175>:
    D.4833 = iftmp.10;
  }
  if (D.4833 != 0) goto <D.5176>; else goto <D.5127>;
  <D.5176>:
  goto <D.5131>;
  <D.5130>:
  prlen.9 = (unsigned int) prlen;
  D.5177 = strncmp (name, "lib", prlen.9);
  if (D.5177 != 0) goto <D.5178>; else goto <D.5127>;
  <D.5178>:
  <D.5131>:
  prefix = "lib";
  goto <D.5128>;
  <D.5127>:
  prefix = "";
  <D.5128>:
  if (first_call != 0) goto <D.5179>; else goto <D.5181>;
  <D.5181>:
  if (suffixlen != 0) goto <D.5182>; else goto <D.5180>;
  <D.5182>:
  D.5183 = strstr (name, suffix);
  D.5184 = strlen (name);
  suffixlen.11 = (sizetype) suffixlen;
  D.5186 = D.5184 - suffixlen.11;
  D.5187 = name + D.5186;
  if (D.5183 == D.5187) goto <D.5179>; else goto <D.5180>;
  <D.5179>:
  suffix = "";
  <D.5180>:
  if (directory != 0B) goto <D.5190>; else goto <D.5188>;
  <D.5190>:
  D.5191 = *directory;
  if (D.5191 != 0) goto <D.5192>; else goto <D.5188>;
  <D.5192>:
  res = monoeg_g_strconcat (directory, "/", prefix, name, suffix, 0B);
  goto <D.5189>;
  <D.5188>:
  res = monoeg_g_strconcat (prefix, name, suffix, 0B);
  <D.5189>:
  idx = idx + 1;
  if (first_call == 0) goto <D.5193>; else goto <D.5194>;
  <D.5193>:
  idx = idx + 1;
  <D.5194>:
  idx.12 = (void *) idx;
  *iter = idx.12;
  D.5119 = res;
  return D.5119;
}


mono_dl_fallback_register (void * (*MonoDlFallbackLoad) (const char *, int, char * *, void *) load_func, void * (*MonoDlFallbackSymbol) (void *, const char *, char * *, void *) symbol_func, void * (*MonoDlFallbackClose) (void *, void *) close_func, void * user_data)
{
  struct MonoDlFallbackHandler * D.5199;
  struct GSList * fallback_handlers.13;
  struct GSList * fallback_handlers.14;
  struct MonoDlFallbackHandler * handler;

  if (load_func == 0B) goto <D.5197>; else goto <D.5198>;
  <D.5197>:
  monoeg_g_log (0B, 8, "%s:%d: assertion \'%s\' failed", "mono-dl.c", 528, "load_func != NULL");
  D.5199 = 0B;
  return D.5199;
  <D.5198>:
  if (symbol_func == 0B) goto <D.5200>; else goto <D.5201>;
  <D.5200>:
  monoeg_g_log (0B, 8, "%s:%d: assertion \'%s\' failed", "mono-dl.c", 529, "symbol_func != NULL");
  D.5199 = 0B;
  return D.5199;
  <D.5201>:
  handler = monoeg_malloc (16);
  handler->load_func = load_func;
  handler->symbol_func = symbol_func;
  handler->close_func = close_func;
  handler->user_data = user_data;
  fallback_handlers.13 = fallback_handlers;
  fallback_handlers.14 = monoeg_g_slist_prepend (fallback_handlers.13, handler);
  fallback_handlers = fallback_handlers.14;
  D.5199 = handler;
  return D.5199;
}


mono_dl_fallback_unregister (struct MonoDlFallbackHandler * handler)
{
  struct GSList * fallback_handlers.15;
  struct GSList * found;

  fallback_handlers.15 = fallback_handlers;
  found = monoeg_g_slist_find (fallback_handlers.15, handler);
  if (found == 0B) goto <D.5206>; else goto <D.5207>;
  <D.5206>:
  return;
  <D.5207>:
  fallback_handlers.15 = fallback_handlers;
  monoeg_g_slist_remove (fallback_handlers.15, handler);
  monoeg_g_free (handler);
}


