mono_dl_open (const char * name, int flags, char * * error_msg)
{
  gchar * D.4872;
  struct MonoDl * D.4873;
  _Bool D.4874;
  int D.4875;
  void * (*<T2cd>) (const char *, int, char * *, void *) D.4880;
  void * D.4881;
  char * D.4884;
  int D.4821;
  int iftmp.0;
  int D.4820;
  const char[4] * D.4900;
  unsigned char D.4901;
  int D.4902;
  unsigned char D.4903;
  int D.4904;
  const unsigned char * D.4909;
  unsigned char D.4910;
  int D.4911;
  const unsigned char * D.4912;
  unsigned char D.4913;
  int D.4914;
  const unsigned char * D.4919;
  unsigned char D.4920;
  int D.4921;
  const unsigned char * D.4922;
  unsigned char D.4923;
  int D.4924;
  const unsigned char * D.4929;
  unsigned char D.4930;
  int D.4931;
  const unsigned char * D.4932;
  unsigned char D.4933;
  int D.4934;
  char * D.4944;
  gchar * D.4945;
  struct MonoDl * module;
  void * lib;
  struct MonoDlFallbackHandler * dl_fallback;
  int lflags;

  dl_fallback = 0B;
  lflags = convert_flags (flags);
  if (error_msg != 0B) goto <D.4866>; else goto <D.4867>;
  <D.4866>:
  *error_msg = 0B;
  <D.4867>:
  module = malloc (12);
  if (module == 0B) goto <D.4868>; else goto <D.4869>;
  <D.4868>:
  if (error_msg != 0B) goto <D.4870>; else goto <D.4871>;
  <D.4870>:
  D.4872 = monoeg_strdup ("Out of memory");
  *error_msg = D.4872;
  <D.4871>:
  D.4873 = 0B;
  return D.4873;
  <D.4869>:
  D.4874 = name == 0B;
  D.4875 = (int) D.4874;
  module->main_module = D.4875;
  lib = dlopen (name, lflags);
  if (lib == 0B) goto <D.4876>; else goto <D.4877>;
  <D.4876>:
  {
    struct GSList * node;

    node = fallback_handlers;
    goto <D.4808>;
    <D.4807>:
    {
      struct MonoDlFallbackHandler * handler;

      handler = node->data;
      if (error_msg != 0B) goto <D.4878>; else goto <D.4879>;
      <D.4878>:
      *error_msg = 0B;
      <D.4879>:
      D.4880 = handler->load_func;
      D.4881 = handler->user_data;
      lib = D.4880 (name, lflags, error_msg, D.4881);
      if (error_msg != 0B) goto <D.4882>; else goto <D.4883>;
      <D.4882>:
      D.4884 = *error_msg;
      if (D.4884 != 0B) goto <D.4885>; else goto <D.4886>;
      <D.4885>:
      D.4884 = *error_msg;
      monoeg_g_free (D.4884);
      <D.4886>:
      <D.4883>:
      if (lib != 0B) goto <D.4887>; else goto <D.4888>;
      <D.4887>:
      dl_fallback = handler;
      goto <D.4806>;
      <D.4888>:
    }
    node = node->next;
    <D.4808>:
    if (node != 0B) goto <D.4807>; else goto <D.4806>;
    <D.4806>:
  }
  <D.4877>:
  if (lib == 0B) goto <D.4889>; else goto <D.4890>;
  <D.4889>:
  if (dl_fallback == 0B) goto <D.4891>; else goto <D.4892>;
  <D.4891>:
  {
    char * lname;
    char * llname;
    const char * suff;
    const char * ext;

    if (name == 0B) goto <D.4893>; else goto <D.4894>;
    <D.4893>:
    free (module);
    D.4873 = 0B;
    return D.4873;
    <D.4894>:
    suff = ".la";
    ext = strrchr (name, 46);
    if (ext != 0B) goto <D.4895>; else goto <D.4896>;
    <D.4895>:
    {
      size_t __s1_len;
      size_t __s2_len;

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

        __s2 = ext;
        D.4900 = ".la";
        D.4901 = MEM[(const unsigned char *)D.4900];
        D.4902 = (int) D.4901;
        D.4903 = *__s2;
        D.4904 = (int) D.4903;
        __result = D.4902 - D.4904;
        {
          if (__s2_len != 0) goto <D.4905>; else goto <D.4906>;
          <D.4905>:
          if (__result == 0) goto <D.4907>; else goto <D.4908>;
          <D.4907>:
          D.4909 = &MEM[(void *)".la" + 1B];
          D.4910 = *D.4909;
          D.4911 = (int) D.4910;
          D.4912 = __s2 + 1;
          D.4913 = *D.4912;
          D.4914 = (int) D.4913;
          __result = D.4911 - D.4914;
          if (__s2_len > 1) goto <D.4915>; else goto <D.4916>;
          <D.4915>:
          if (__result == 0) goto <D.4917>; else goto <D.4918>;
          <D.4917>:
          D.4919 = &MEM[(void *)".la" + 2B];
          D.4920 = *D.4919;
          D.4921 = (int) D.4920;
          D.4922 = __s2 + 2;
          D.4923 = *D.4922;
          D.4924 = (int) D.4923;
          __result = D.4921 - D.4924;
          if (__s2_len > 2) goto <D.4925>; else goto <D.4926>;
          <D.4925>:
          if (__result == 0) goto <D.4927>; else goto <D.4928>;
          <D.4927>:
          D.4929 = &MEM[(void *)".la" + 3B];
          D.4930 = *D.4929;
          D.4931 = (int) D.4930;
          D.4932 = __s2 + 3;
          D.4933 = *D.4932;
          D.4934 = (int) D.4933;
          __result = D.4931 - D.4934;
          <D.4928>:
          <D.4926>:
          <D.4918>:
          <D.4916>:
          <D.4908>:
          <D.4906>:
        }
        D.4820 = __result;
      }
      iftmp.0 = -D.4820;
      goto <D.4935>;
      <D.4899>:
      iftmp.0 = __builtin_strcmp (ext, ".la");
      <D.4935>:
      D.4821 = iftmp.0;
    }
    if (D.4821 == 0) goto <D.4936>; else goto <D.4937>;
    <D.4936>:
    suff = "";
    <D.4937>:
    <D.4896>:
    lname = monoeg_g_strconcat (name, suff, 0B);
    llname = get_dl_name_from_libtool (lname);
    monoeg_g_free (lname);
    if (llname != 0B) goto <D.4938>; else goto <D.4939>;
    <D.4938>:
    lib = dlopen (llname, lflags);
    monoeg_g_free (llname);
    <D.4939>:
    if (lib == 0B) goto <D.4940>; else goto <D.4941>;
    <D.4940>:
    if (error_msg != 0B) goto <D.4942>; else goto <D.4943>;
    <D.4942>:
    D.4944 = dlerror ();
    D.4945 = monoeg_strdup (D.4944);
    *error_msg = D.4945;
    <D.4943>:
    free (module);
    D.4873 = 0B;
    return D.4873;
    <D.4941>:
  }
  <D.4892>:
  <D.4890>:
  module->handle = lib;
  module->dl_fallback = dl_fallback;
  D.4873 = module;
  return D.4873;
}


convert_flags (int flags)
{
  int iftmp.1;
  int D.4948;
  int D.4952;
  int D.4956;
  int lflags;

  D.4948 = flags & 2;
  if (D.4948 != 0) goto <D.4949>; else goto <D.4950>;
  <D.4949>:
  iftmp.1 = 0;
  goto <D.4951>;
  <D.4950>:
  iftmp.1 = 4;
  <D.4951>:
  lflags = iftmp.1;
  D.4952 = flags & 1;
  if (D.4952 != 0) goto <D.4953>; else goto <D.4954>;
  <D.4953>:
  lflags = lflags | 1;
  goto <D.4955>;
  <D.4954>:
  lflags = lflags | 2;
  <D.4955>:
  D.4956 = lflags;
  return D.4956;
}


get_dl_name_from_libtool (const char * libtool_file)
{
  char * D.4960;
  char D.4961;
  const short unsigned int * * D.4963;
  const short unsigned int * D.4964;
  unsigned int D.4965;
  unsigned int D.4966;
  const short unsigned int * D.4967;
  short unsigned int D.4968;
  int D.4969;
  int D.4970;
  int D.4974;
  char * D.4977;
  int D.4979;
  int D.4983;
  char * D.4986;
  int D.4793;
  int iftmp.2;
  int D.4792;
  const char[3] * D.4993;
  unsigned char D.4994;
  int D.4995;
  unsigned char D.4996;
  int D.4997;
  const unsigned char * D.5002;
  unsigned char D.5003;
  int D.5004;
  const unsigned char * D.5005;
  unsigned char D.5006;
  int D.5007;
  const unsigned char * D.5012;
  unsigned char D.5013;
  int D.5014;
  const unsigned char * D.5015;
  unsigned char D.5016;
  int D.5017;
  const unsigned char * D.5022;
  unsigned char D.5023;
  int D.5024;
  const unsigned char * D.5025;
  unsigned char D.5026;
  int D.5027;
  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.4958>; else goto <D.4959>;
      <D.4958>:
      D.4960 = 0B;
      return D.4960;
      <D.4959>:
      goto <D.4755>;
      <D.4783>:
      goto <D.4753>;
      <D.4752>:
      line = line + 1;
      <D.4753>:
      D.4961 = *line;
      if (D.4961 != 0) goto <D.4962>; else goto <D.4754>;
      <D.4962>:
      D.4963 = __ctype_b_loc ();
      D.4964 = *D.4963;
      D.4961 = *line;
      D.4965 = (unsigned int) D.4961;
      D.4966 = D.4965 * 2;
      D.4967 = D.4964 + D.4966;
      D.4968 = *D.4967;
      D.4969 = (int) D.4968;
      D.4970 = D.4969 & 8192;
      if (D.4970 != 0) goto <D.4752>; else goto <D.4754>;
      <D.4754>:
      D.4961 = *line;
      if (D.4961 == 35) goto <D.4971>; else goto <D.4973>;
      <D.4973>:
      D.4961 = *line;
      if (D.4961 == 0) goto <D.4971>; else goto <D.4972>;
      <D.4971>:
      // predicted unlikely by continue predictor.
      goto <D.4755>;
      <D.4972>:
      D.4974 = strncmp ("dlname", line, 6);
      if (D.4974 == 0) goto <D.4975>; else goto <D.4976>;
      <D.4975>:
      monoeg_g_free (dlname);
      D.4977 = line + 6;
      dlname = read_string (D.4977, file);
      goto <D.4978>;
      <D.4976>:
      D.4979 = strncmp ("libdir", line, 6);
      if (D.4979 == 0) goto <D.4980>; else goto <D.4981>;
      <D.4980>:
      monoeg_g_free (libdir);
      D.4977 = line + 6;
      libdir = read_string (D.4977, file);
      goto <D.4982>;
      <D.4981>:
      D.4983 = strncmp ("installed", line, 9);
      if (D.4983 == 0) goto <D.4984>; else goto <D.4985>;
      <D.4984>:
      monoeg_g_free (installed);
      D.4986 = line + 9;
      installed = read_string (D.4986, file);
      <D.4985>:
      <D.4982>:
      <D.4978>:
      <D.4755>:
      line = fgets (&buf, 512, file);
      if (line != 0B) goto <D.4783>; else goto <D.4784>;
      <D.4784>:
      fclose (file);
      line = 0B;
      if (installed != 0B) goto <D.4989>; else goto <D.4987>;
      <D.4989>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = installed;
          D.4993 = "no";
          D.4994 = MEM[(const unsigned char *)D.4993];
          D.4995 = (int) D.4994;
          D.4996 = *__s2;
          D.4997 = (int) D.4996;
          __result = D.4995 - D.4997;
          {
            if (__s2_len != 0) goto <D.4998>; else goto <D.4999>;
            <D.4998>:
            if (__result == 0) goto <D.5000>; else goto <D.5001>;
            <D.5000>:
            D.5002 = &MEM[(void *)"no" + 1B];
            D.5003 = *D.5002;
            D.5004 = (int) D.5003;
            D.5005 = __s2 + 1;
            D.5006 = *D.5005;
            D.5007 = (int) D.5006;
            __result = D.5004 - D.5007;
            if (__s2_len > 1) goto <D.5008>; else goto <D.5009>;
            <D.5008>:
            if (__result == 0) goto <D.5010>; else goto <D.5011>;
            <D.5010>:
            D.5012 = &MEM[(void *)"no" + 2B];
            D.5013 = *D.5012;
            D.5014 = (int) D.5013;
            D.5015 = __s2 + 2;
            D.5016 = *D.5015;
            D.5017 = (int) D.5016;
            __result = D.5014 - D.5017;
            if (__s2_len > 2) goto <D.5018>; else goto <D.5019>;
            <D.5018>:
            if (__result == 0) goto <D.5020>; else goto <D.5021>;
            <D.5020>:
            D.5022 = &MEM[(void *)"no" + 3B];
            D.5023 = *D.5022;
            D.5024 = (int) D.5023;
            D.5025 = __s2 + 3;
            D.5026 = *D.5025;
            D.5027 = (int) D.5026;
            __result = D.5024 - D.5027;
            <D.5021>:
            <D.5019>:
            <D.5011>:
            <D.5009>:
            <D.5001>:
            <D.4999>:
          }
          D.4792 = __result;
        }
        iftmp.2 = -D.4792;
        goto <D.5028>;
        <D.4992>:
        iftmp.2 = __builtin_strcmp (installed, "no");
        <D.5028>:
        D.4793 = iftmp.2;
      }
      if (D.4793 == 0) goto <D.5029>; else goto <D.4987>;
      <D.5029>:
      {
        char * dir;

        dir = monoeg_g_path_get_dirname (libtool_file);
        if (dlname != 0B) goto <D.5030>; else goto <D.5031>;
        <D.5030>:
        line = monoeg_g_strconcat (dir, "/.libs/", dlname, 0B);
        <D.5031>:
        monoeg_g_free (dir);
      }
      goto <D.4988>;
      <D.4987>:
      if (libdir != 0B) goto <D.5032>; else goto <D.5033>;
      <D.5032>:
      if (dlname != 0B) goto <D.5034>; else goto <D.5035>;
      <D.5034>:
      line = monoeg_g_strconcat (libdir, "/", dlname, 0B);
      <D.5035>:
      <D.5033>:
      <D.4988>:
      monoeg_g_free (dlname);
      monoeg_g_free (libdir);
      monoeg_g_free (installed);
      D.4960 = line;
      return D.4960;
    }
  finally
    {
      buf = {CLOBBER};
    }
}


read_string (char * p, struct FILE * file)
{
  char D.5038;
  const short unsigned int * * D.5040;
  const short unsigned int * D.5041;
  unsigned int D.5042;
  unsigned int D.5043;
  const short unsigned int * D.5044;
  short unsigned int D.5045;
  int D.5046;
  int D.5047;
  char * D.5050;
  char * iftmp.3;
  int D.5060;
  int D.5061;
  int endp.4;
  int startp.5;
  int D.5068;
  int D.5069;
  unsigned int D.5070;
  int p.6;
  int D.5075;
  int D.5076;
  unsigned int D.5077;
  char * endp;
  char * startp;

  goto <D.4734>;
  <D.4733>:
  p = p + 1;
  <D.4734>:
  D.5038 = *p;
  if (D.5038 != 0) goto <D.5039>; else goto <D.4735>;
  <D.5039>:
  D.5040 = __ctype_b_loc ();
  D.5041 = *D.5040;
  D.5038 = *p;
  D.5042 = (unsigned int) D.5038;
  D.5043 = D.5042 * 2;
  D.5044 = D.5041 + D.5043;
  D.5045 = *D.5044;
  D.5046 = (int) D.5045;
  D.5047 = D.5046 & 8192;
  if (D.5047 != 0) goto <D.4733>; else goto <D.4735>;
  <D.4735>:
  D.5038 = *p;
  if (D.5038 == 0) goto <D.5048>; else goto <D.5049>;
  <D.5048>:
  D.5050 = 0B;
  return D.5050;
  <D.5049>:
  D.5038 = *p;
  if (D.5038 == 61) goto <D.5051>; else goto <D.5052>;
  <D.5051>:
  p = p + 1;
  <D.5052>:
  goto <D.4737>;
  <D.4736>:
  p = p + 1;
  <D.4737>:
  D.5038 = *p;
  if (D.5038 != 0) goto <D.5053>; else goto <D.4738>;
  <D.5053>:
  D.5040 = __ctype_b_loc ();
  D.5041 = *D.5040;
  D.5038 = *p;
  D.5042 = (unsigned int) D.5038;
  D.5043 = D.5042 * 2;
  D.5044 = D.5041 + D.5043;
  D.5045 = *D.5044;
  D.5046 = (int) D.5045;
  D.5047 = D.5046 & 8192;
  if (D.5047 != 0) goto <D.4736>; else goto <D.4738>;
  <D.4738>:
  D.5038 = *p;
  if (D.5038 == 39) goto <D.5054>; else goto <D.5056>;
  <D.5056>:
  D.5038 = *p;
  if (D.5038 == 34) goto <D.5054>; else goto <D.5055>;
  <D.5054>:
  {
    char t;

    t = *p;
    p = p + 1;
    startp = p;
    D.5060 = (int) t;
    D.5061 = __builtin_constant_p (D.5060);
    if (D.5061 != 0) goto <D.5062>; else goto <D.5058>;
    <D.5062>:
    if (t == 0) goto <D.5063>; else goto <D.5058>;
    <D.5063>:
    D.5060 = (int) t;
    iftmp.3 = __rawmemchr (p, D.5060);
    goto <D.5059>;
    <D.5058>:
    D.5060 = (int) t;
    iftmp.3 = __builtin_strchr (p, D.5060);
    <D.5059>:
    endp = iftmp.3;
    if (endp == 0B) goto <D.5064>; else goto <D.5065>;
    <D.5064>:
    D.5050 = 0B;
    return D.5050;
    <D.5065>:
    *endp = 0;
    endp.4 = (int) endp;
    startp.5 = (int) startp;
    D.5068 = endp.4 - startp.5;
    D.5069 = D.5068 + 1;
    D.5070 = (unsigned int) D.5069;
    D.5050 = monoeg_g_memdup (startp, D.5070);
    return D.5050;
  }
  <D.5055>:
  D.5038 = *p;
  if (D.5038 == 0) goto <D.5071>; else goto <D.5072>;
  <D.5071>:
  D.5050 = 0B;
  return D.5050;
  <D.5072>:
  startp = p;
  goto <D.4741>;
  <D.4740>:
  p = p + 1;
  <D.4741>:
  D.5038 = *p;
  if (D.5038 != 0) goto <D.5073>; else goto <D.4742>;
  <D.5073>:
  D.5040 = __ctype_b_loc ();
  D.5041 = *D.5040;
  D.5038 = *p;
  D.5042 = (unsigned int) D.5038;
  D.5043 = D.5042 * 2;
  D.5044 = D.5041 + D.5043;
  D.5045 = *D.5044;
  D.5046 = (int) D.5045;
  D.5047 = D.5046 & 8192;
  if (D.5047 == 0) goto <D.4740>; else goto <D.4742>;
  <D.4742>:
  *p = 0;
  p.6 = (int) p;
  startp.5 = (int) startp;
  D.5075 = p.6 - startp.5;
  D.5076 = D.5075 + 1;
  D.5077 = (unsigned int) D.5076;
  D.5050 = monoeg_g_memdup (startp, D.5077);
  return D.5050;
}


fgets (char * restrict __s, int __n, struct FILE * restrict __stream)
{
  unsigned int D.5079;
  int D.5084;
  char * D.5086;
  unsigned int D.5087;
  unsigned int __n.7;
  unsigned int D.5089;
  unsigned int D.5092;

  D.5079 = __builtin_object_size (__s, 1);
  if (D.5079 != 4294967295) goto <D.5080>; else goto <D.5081>;
  <D.5080>:
  D.5084 = __builtin_constant_p (__n);
  if (D.5084 == 0) goto <D.5082>; else goto <D.5085>;
  <D.5085>:
  if (__n <= 0) goto <D.5082>; else goto <D.5083>;
  <D.5082>:
  D.5087 = __builtin_object_size (__s, 1);
  D.5086 = __fgets_chk (__s, D.5087, __n, __stream);
  return D.5086;
  <D.5083>:
  __n.7 = (unsigned int) __n;
  D.5089 = __builtin_object_size (__s, 1);
  if (__n.7 > D.5089) goto <D.5090>; else goto <D.5091>;
  <D.5090>:
  D.5092 = __builtin_object_size (__s, 1);
  D.5086 = __fgets_chk_warn (__s, D.5092, __n, __stream);
  return D.5086;
  <D.5091>:
  <D.5081>:
  D.5086 = __fgets_alias (__s, __n, __stream);
  return D.5086;
}


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

  if (str != 0B) goto <D.5094>; else goto <D.5095>;
  <D.5094>:
  D.5096 = __strdup (str);
  return D.5096;
  <D.5095>:
  D.5096 = 0B;
  return D.5096;
}


mono_dl_symbol (struct MonoDl * module, const char * name, void * * symbol)
{
  struct MonoDlFallbackHandler * D.5098;
  void * (*<T2d0>) (void *, const char *, char * *, void *) D.5101;
  void * D.5102;
  void * D.5103;
  char * D.5109;
  char * iftmp.8;
  char * D.5115;
  void * sym;
  char * err;

  try
    {
      err = 0B;
      D.5098 = module->dl_fallback;
      if (D.5098 != 0B) goto <D.5099>; else goto <D.5100>;
      <D.5099>:
      D.5098 = module->dl_fallback;
      D.5101 = D.5098->symbol_func;
      D.5102 = module->handle;
      D.5098 = module->dl_fallback;
      D.5103 = D.5098->user_data;
      sym = D.5101 (D.5102, name, &err, D.5103);
      goto <D.5104>;
      <D.5100>:
      D.5102 = module->handle;
      sym = dlsym (D.5102, name);
      <D.5104>:
      if (sym != 0B) goto <D.5105>; else goto <D.5106>;
      <D.5105>:
      if (symbol != 0B) goto <D.5107>; else goto <D.5108>;
      <D.5107>:
      *symbol = sym;
      <D.5108>:
      D.5109 = 0B;
      return D.5109;
      <D.5106>:
      if (symbol != 0B) goto <D.5110>; else goto <D.5111>;
      <D.5110>:
      *symbol = 0B;
      <D.5111>:
      D.5098 = module->dl_fallback;
      if (D.5098 == 0B) goto <D.5113>; else goto <D.5114>;
      <D.5113>:
      D.5115 = dlerror ();
      iftmp.8 = monoeg_strdup (D.5115);
      goto <D.5116>;
      <D.5114>:
      iftmp.8 = err;
      <D.5116>:
      D.5109 = iftmp.8;
      return D.5109;
    }
  finally
    {
      err = {CLOBBER};
    }
}


mono_dl_close (struct MonoDl * module)
{
  void * (*<T2d3>) (void *, void *) D.5121;
  void * D.5124;
  void * D.5125;
  struct MonoDlFallbackHandler * dl_fallback;

  dl_fallback = module->dl_fallback;
  if (dl_fallback != 0B) goto <D.5119>; else goto <D.5120>;
  <D.5119>:
  D.5121 = dl_fallback->close_func;
  if (D.5121 != 0B) goto <D.5122>; else goto <D.5123>;
  <D.5122>:
  D.5121 = dl_fallback->close_func;
  D.5124 = module->handle;
  D.5125 = dl_fallback->user_data;
  D.5121 (D.5124, D.5125);
  <D.5123>:
  goto <D.5126>;
  <D.5120>:
  D.5124 = module->handle;
  dlclose (D.5124);
  <D.5126>:
  free (module);
}


mono_dl_build_path (const char * directory, const char * name, void * * iter)
{
  char * D.5129;
  void * D.5130;
  unsigned int D.5136;
  int D.5142;
  unsigned int prlen.9;
  int D.4853;
  int iftmp.10;
  int D.4852;
  const char[4] * D.5149;
  unsigned char D.5150;
  int D.5151;
  unsigned char D.5152;
  int D.5153;
  const unsigned char * D.5158;
  unsigned char D.5159;
  int D.5160;
  const unsigned char * D.5161;
  unsigned char D.5162;
  int D.5163;
  const unsigned char * D.5168;
  unsigned char D.5169;
  int D.5170;
  const unsigned char * D.5171;
  unsigned char D.5172;
  int D.5173;
  const unsigned char * D.5178;
  unsigned char D.5179;
  int D.5180;
  const unsigned char * D.5181;
  unsigned char D.5182;
  int D.5183;
  int D.5186;
  char * D.5192;
  unsigned int D.5193;
  sizetype suffixlen.11;
  sizetype D.5195;
  const char * D.5196;
  char D.5200;
  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.5127>; else goto <D.5128>;
  <D.5127>:
  D.5129 = 0B;
  return D.5129;
  <D.5128>:
  D.5130 = *iter;
  idx = (int) D.5130;
  if (idx == 0) goto <D.5131>; else goto <D.5132>;
  <D.5131>:
  first_call = 1;
  suffix = "";
  suffixlen = 0;
  goto <D.5133>;
  <D.5132>:
  idx = idx + -1;
  if (idx != 0) goto <D.5134>; else goto <D.5135>;
  <D.5134>:
  D.5129 = 0B;
  return D.5129;
  <D.5135>:
  first_call = 0;
  suffix = &suffixes[idx];
  D.5136 = strlen (suffix);
  suffixlen = (int) D.5136;
  <D.5133>:
  prlen = 3;
  if (prlen != 0) goto <D.5139>; else goto <D.5137>;
  <D.5139>:
  D.5142 = __builtin_constant_p (prlen);
  if (D.5142 != 0) goto <D.5143>; else goto <D.5140>;
  <D.5143>:
  prlen.9 = (unsigned int) prlen;
  if (prlen.9 > 3) goto <D.5145>; else goto <D.5140>;
  <D.5145>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      __s2 = name;
      D.5149 = "lib";
      D.5150 = MEM[(const unsigned char *)D.5149];
      D.5151 = (int) D.5150;
      D.5152 = *__s2;
      D.5153 = (int) D.5152;
      __result = D.5151 - D.5153;
      {
        if (__s2_len != 0) goto <D.5154>; else goto <D.5155>;
        <D.5154>:
        if (__result == 0) goto <D.5156>; else goto <D.5157>;
        <D.5156>:
        D.5158 = &MEM[(void *)"lib" + 1B];
        D.5159 = *D.5158;
        D.5160 = (int) D.5159;
        D.5161 = __s2 + 1;
        D.5162 = *D.5161;
        D.5163 = (int) D.5162;
        __result = D.5160 - D.5163;
        if (__s2_len > 1) goto <D.5164>; else goto <D.5165>;
        <D.5164>:
        if (__result == 0) goto <D.5166>; else goto <D.5167>;
        <D.5166>:
        D.5168 = &MEM[(void *)"lib" + 2B];
        D.5169 = *D.5168;
        D.5170 = (int) D.5169;
        D.5171 = __s2 + 2;
        D.5172 = *D.5171;
        D.5173 = (int) D.5172;
        __result = D.5170 - D.5173;
        if (__s2_len > 2) goto <D.5174>; else goto <D.5175>;
        <D.5174>:
        if (__result == 0) goto <D.5176>; else goto <D.5177>;
        <D.5176>:
        D.5178 = &MEM[(void *)"lib" + 3B];
        D.5179 = *D.5178;
        D.5180 = (int) D.5179;
        D.5181 = __s2 + 3;
        D.5182 = *D.5181;
        D.5183 = (int) D.5182;
        __result = D.5180 - D.5183;
        <D.5177>:
        <D.5175>:
        <D.5167>:
        <D.5165>:
        <D.5157>:
        <D.5155>:
      }
      D.4852 = __result;
    }
    iftmp.10 = -D.4852;
    goto <D.5184>;
    <D.5148>:
    iftmp.10 = __builtin_strcmp (name, "lib");
    <D.5184>:
    D.4853 = iftmp.10;
  }
  if (D.4853 != 0) goto <D.5185>; else goto <D.5137>;
  <D.5185>:
  goto <D.5141>;
  <D.5140>:
  prlen.9 = (unsigned int) prlen;
  D.5186 = strncmp (name, "lib", prlen.9);
  if (D.5186 != 0) goto <D.5187>; else goto <D.5137>;
  <D.5187>:
  <D.5141>:
  prefix = "lib";
  goto <D.5138>;
  <D.5137>:
  prefix = "";
  <D.5138>:
  if (first_call != 0) goto <D.5188>; else goto <D.5190>;
  <D.5190>:
  if (suffixlen != 0) goto <D.5191>; else goto <D.5189>;
  <D.5191>:
  D.5192 = strstr (name, suffix);
  D.5193 = strlen (name);
  suffixlen.11 = (sizetype) suffixlen;
  D.5195 = D.5193 - suffixlen.11;
  D.5196 = name + D.5195;
  if (D.5192 == D.5196) goto <D.5188>; else goto <D.5189>;
  <D.5188>:
  suffix = "";
  <D.5189>:
  if (directory != 0B) goto <D.5199>; else goto <D.5197>;
  <D.5199>:
  D.5200 = *directory;
  if (D.5200 != 0) goto <D.5201>; else goto <D.5197>;
  <D.5201>:
  res = monoeg_g_strconcat (directory, "/", prefix, name, suffix, 0B);
  goto <D.5198>;
  <D.5197>:
  res = monoeg_g_strconcat (prefix, name, suffix, 0B);
  <D.5198>:
  idx = idx + 1;
  if (first_call == 0) goto <D.5202>; else goto <D.5203>;
  <D.5202>:
  idx = idx + 1;
  <D.5203>:
  idx.12 = (void *) idx;
  *iter = idx.12;
  D.5129 = res;
  return D.5129;
}


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.5208;
  struct GSList * fallback_handlers.13;
  struct GSList * fallback_handlers.14;
  struct MonoDlFallbackHandler * handler;

  if (load_func == 0B) goto <D.5206>; else goto <D.5207>;
  <D.5206>:
  monoeg_g_log (0B, 8, "%s:%d: assertion \'%s\' failed", "mono-dl.c", 528, "load_func != NULL");
  D.5208 = 0B;
  return D.5208;
  <D.5207>:
  if (symbol_func == 0B) goto <D.5209>; else goto <D.5210>;
  <D.5209>:
  monoeg_g_log (0B, 8, "%s:%d: assertion \'%s\' failed", "mono-dl.c", 529, "symbol_func != NULL");
  D.5208 = 0B;
  return D.5208;
  <D.5210>:
  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.5208 = handler;
  return D.5208;
}


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.5215>; else goto <D.5216>;
  <D.5215>:
  return;
  <D.5216>:
  fallback_handlers.15 = fallback_handlers;
  monoeg_g_slist_remove (fallback_handlers.15, handler);
  monoeg_g_free (handler);
}


