mono_dl_open (const char * name, int flags, char * * error_msg)
{
  gchar * D.5716;
  struct MonoDl * D.5717;
  _Bool D.5718;
  int D.5719;
  void * (*<T3ba>) (const char *, int, char * *, void *) D.5724;
  void * D.5725;
  char * D.5728;
  int D.5665;
  int iftmp.0;
  int D.5664;
  const char[4] * D.5744;
  unsigned char D.5745;
  int D.5746;
  unsigned char D.5747;
  int D.5748;
  const unsigned char * D.5753;
  unsigned char D.5754;
  int D.5755;
  const unsigned char * D.5756;
  unsigned char D.5757;
  int D.5758;
  const unsigned char * D.5763;
  unsigned char D.5764;
  int D.5765;
  const unsigned char * D.5766;
  unsigned char D.5767;
  int D.5768;
  const unsigned char * D.5773;
  unsigned char D.5774;
  int D.5775;
  const unsigned char * D.5776;
  unsigned char D.5777;
  int D.5778;
  char * D.5788;
  gchar * D.5789;
  struct MonoDl * module;
  void * lib;
  struct MonoDlFallbackHandler * dl_fallback;
  int lflags;

  dl_fallback = 0B;
  lflags = convert_flags (flags);
  if (error_msg != 0B) goto <D.5710>; else goto <D.5711>;
  <D.5710>:
  *error_msg = 0B;
  <D.5711>:
  module = malloc (24);
  if (module == 0B) goto <D.5712>; else goto <D.5713>;
  <D.5712>:
  if (error_msg != 0B) goto <D.5714>; else goto <D.5715>;
  <D.5714>:
  D.5716 = monoeg_strdup ("Out of memory");
  *error_msg = D.5716;
  <D.5715>:
  D.5717 = 0B;
  return D.5717;
  <D.5713>:
  D.5718 = name == 0B;
  D.5719 = (int) D.5718;
  module->main_module = D.5719;
  lib = dlopen (name, lflags);
  if (lib == 0B) goto <D.5720>; else goto <D.5721>;
  <D.5720>:
  {
    struct GSList * node;

    node = fallback_handlers;
    goto <D.5652>;
    <D.5651>:
    {
      struct MonoDlFallbackHandler * handler;

      handler = node->data;
      if (error_msg != 0B) goto <D.5722>; else goto <D.5723>;
      <D.5722>:
      *error_msg = 0B;
      <D.5723>:
      D.5724 = handler->load_func;
      D.5725 = handler->user_data;
      lib = D.5724 (name, lflags, error_msg, D.5725);
      if (error_msg != 0B) goto <D.5726>; else goto <D.5727>;
      <D.5726>:
      D.5728 = *error_msg;
      if (D.5728 != 0B) goto <D.5729>; else goto <D.5730>;
      <D.5729>:
      D.5728 = *error_msg;
      monoeg_g_free (D.5728);
      <D.5730>:
      <D.5727>:
      if (lib != 0B) goto <D.5731>; else goto <D.5732>;
      <D.5731>:
      dl_fallback = handler;
      goto <D.5650>;
      <D.5732>:
    }
    node = node->next;
    <D.5652>:
    if (node != 0B) goto <D.5651>; else goto <D.5650>;
    <D.5650>:
  }
  <D.5721>:
  if (lib == 0B) goto <D.5733>; else goto <D.5734>;
  <D.5733>:
  if (dl_fallback == 0B) goto <D.5735>; else goto <D.5736>;
  <D.5735>:
  {
    char * lname;
    char * llname;
    const char * suff;
    const char * ext;

    if (name == 0B) goto <D.5737>; else goto <D.5738>;
    <D.5737>:
    free (module);
    D.5717 = 0B;
    return D.5717;
    <D.5738>:
    suff = ".la";
    ext = strrchr (name, 46);
    if (ext != 0B) goto <D.5739>; else goto <D.5740>;
    <D.5739>:
    {
      size_t __s1_len;
      size_t __s2_len;

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

        __s2 = ext;
        D.5744 = ".la";
        D.5745 = MEM[(const unsigned char *)D.5744];
        D.5746 = (int) D.5745;
        D.5747 = *__s2;
        D.5748 = (int) D.5747;
        __result = D.5746 - D.5748;
        {
          if (__s2_len != 0) goto <D.5749>; else goto <D.5750>;
          <D.5749>:
          if (__result == 0) goto <D.5751>; else goto <D.5752>;
          <D.5751>:
          D.5753 = &MEM[(void *)".la" + 1B];
          D.5754 = *D.5753;
          D.5755 = (int) D.5754;
          D.5756 = __s2 + 1;
          D.5757 = *D.5756;
          D.5758 = (int) D.5757;
          __result = D.5755 - D.5758;
          if (__s2_len > 1) goto <D.5759>; else goto <D.5760>;
          <D.5759>:
          if (__result == 0) goto <D.5761>; else goto <D.5762>;
          <D.5761>:
          D.5763 = &MEM[(void *)".la" + 2B];
          D.5764 = *D.5763;
          D.5765 = (int) D.5764;
          D.5766 = __s2 + 2;
          D.5767 = *D.5766;
          D.5768 = (int) D.5767;
          __result = D.5765 - D.5768;
          if (__s2_len > 2) goto <D.5769>; else goto <D.5770>;
          <D.5769>:
          if (__result == 0) goto <D.5771>; else goto <D.5772>;
          <D.5771>:
          D.5773 = &MEM[(void *)".la" + 3B];
          D.5774 = *D.5773;
          D.5775 = (int) D.5774;
          D.5776 = __s2 + 3;
          D.5777 = *D.5776;
          D.5778 = (int) D.5777;
          __result = D.5775 - D.5778;
          <D.5772>:
          <D.5770>:
          <D.5762>:
          <D.5760>:
          <D.5752>:
          <D.5750>:
        }
        D.5664 = __result;
      }
      iftmp.0 = -D.5664;
      goto <D.5779>;
      <D.5743>:
      iftmp.0 = __builtin_strcmp (ext, ".la");
      <D.5779>:
      D.5665 = iftmp.0;
    }
    if (D.5665 == 0) goto <D.5780>; else goto <D.5781>;
    <D.5780>:
    suff = "";
    <D.5781>:
    <D.5740>:
    lname = monoeg_g_strconcat (name, suff, 0B);
    llname = get_dl_name_from_libtool (lname);
    monoeg_g_free (lname);
    if (llname != 0B) goto <D.5782>; else goto <D.5783>;
    <D.5782>:
    lib = dlopen (llname, lflags);
    monoeg_g_free (llname);
    <D.5783>:
    if (lib == 0B) goto <D.5784>; else goto <D.5785>;
    <D.5784>:
    if (error_msg != 0B) goto <D.5786>; else goto <D.5787>;
    <D.5786>:
    D.5788 = dlerror ();
    D.5789 = monoeg_strdup (D.5788);
    *error_msg = D.5789;
    <D.5787>:
    free (module);
    D.5717 = 0B;
    return D.5717;
    <D.5785>:
  }
  <D.5736>:
  <D.5734>:
  module->handle = lib;
  module->dl_fallback = dl_fallback;
  D.5717 = module;
  return D.5717;
}


convert_flags (int flags)
{
  int iftmp.1;
  int D.5792;
  int D.5796;
  int D.5800;
  int lflags;

  D.5792 = flags & 2;
  if (D.5792 != 0) goto <D.5793>; else goto <D.5794>;
  <D.5793>:
  iftmp.1 = 0;
  goto <D.5795>;
  <D.5794>:
  iftmp.1 = 256;
  <D.5795>:
  lflags = iftmp.1;
  D.5796 = flags & 1;
  if (D.5796 != 0) goto <D.5797>; else goto <D.5798>;
  <D.5797>:
  lflags = lflags | 1;
  goto <D.5799>;
  <D.5798>:
  lflags = lflags | 2;
  <D.5799>:
  D.5800 = lflags;
  return D.5800;
}


get_dl_name_from_libtool (const char * libtool_file)
{
  char * D.5804;
  char D.5805;
  const short unsigned int * * D.5807;
  const short unsigned int * D.5808;
  long unsigned int D.5809;
  long unsigned int D.5810;
  const short unsigned int * D.5811;
  short unsigned int D.5812;
  int D.5813;
  int D.5814;
  int D.5818;
  char * D.5821;
  int D.5823;
  int D.5827;
  char * D.5830;
  int D.5637;
  int iftmp.2;
  int D.5636;
  const char[3] * D.5837;
  unsigned char D.5838;
  int D.5839;
  unsigned char D.5840;
  int D.5841;
  const unsigned char * D.5846;
  unsigned char D.5847;
  int D.5848;
  const unsigned char * D.5849;
  unsigned char D.5850;
  int D.5851;
  const unsigned char * D.5856;
  unsigned char D.5857;
  int D.5858;
  const unsigned char * D.5859;
  unsigned char D.5860;
  int D.5861;
  const unsigned char * D.5866;
  unsigned char D.5867;
  int D.5868;
  const unsigned char * D.5869;
  unsigned char D.5870;
  int D.5871;
  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.5802>; else goto <D.5803>;
      <D.5802>:
      D.5804 = 0B;
      return D.5804;
      <D.5803>:
      goto <D.5599>;
      <D.5627>:
      goto <D.5597>;
      <D.5596>:
      line = line + 1;
      <D.5597>:
      D.5805 = *line;
      if (D.5805 != 0) goto <D.5806>; else goto <D.5598>;
      <D.5806>:
      D.5807 = __ctype_b_loc ();
      D.5808 = *D.5807;
      D.5805 = *line;
      D.5809 = (long unsigned int) D.5805;
      D.5810 = D.5809 * 2;
      D.5811 = D.5808 + D.5810;
      D.5812 = *D.5811;
      D.5813 = (int) D.5812;
      D.5814 = D.5813 & 8192;
      if (D.5814 != 0) goto <D.5596>; else goto <D.5598>;
      <D.5598>:
      D.5805 = *line;
      if (D.5805 == 35) goto <D.5815>; else goto <D.5817>;
      <D.5817>:
      D.5805 = *line;
      if (D.5805 == 0) goto <D.5815>; else goto <D.5816>;
      <D.5815>:
      // predicted unlikely by continue predictor.
      goto <D.5599>;
      <D.5816>:
      D.5818 = strncmp ("dlname", line, 6);
      if (D.5818 == 0) goto <D.5819>; else goto <D.5820>;
      <D.5819>:
      monoeg_g_free (dlname);
      D.5821 = line + 6;
      dlname = read_string (D.5821, file);
      goto <D.5822>;
      <D.5820>:
      D.5823 = strncmp ("libdir", line, 6);
      if (D.5823 == 0) goto <D.5824>; else goto <D.5825>;
      <D.5824>:
      monoeg_g_free (libdir);
      D.5821 = line + 6;
      libdir = read_string (D.5821, file);
      goto <D.5826>;
      <D.5825>:
      D.5827 = strncmp ("installed", line, 9);
      if (D.5827 == 0) goto <D.5828>; else goto <D.5829>;
      <D.5828>:
      monoeg_g_free (installed);
      D.5830 = line + 9;
      installed = read_string (D.5830, file);
      <D.5829>:
      <D.5826>:
      <D.5822>:
      <D.5599>:
      line = fgets (&buf, 512, file);
      if (line != 0B) goto <D.5627>; else goto <D.5628>;
      <D.5628>:
      fclose (file);
      line = 0B;
      if (installed != 0B) goto <D.5833>; else goto <D.5831>;
      <D.5833>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = installed;
          D.5837 = "no";
          D.5838 = MEM[(const unsigned char *)D.5837];
          D.5839 = (int) D.5838;
          D.5840 = *__s2;
          D.5841 = (int) D.5840;
          __result = D.5839 - D.5841;
          {
            if (__s2_len != 0) goto <D.5842>; else goto <D.5843>;
            <D.5842>:
            if (__result == 0) goto <D.5844>; else goto <D.5845>;
            <D.5844>:
            D.5846 = &MEM[(void *)"no" + 1B];
            D.5847 = *D.5846;
            D.5848 = (int) D.5847;
            D.5849 = __s2 + 1;
            D.5850 = *D.5849;
            D.5851 = (int) D.5850;
            __result = D.5848 - D.5851;
            if (__s2_len > 1) goto <D.5852>; else goto <D.5853>;
            <D.5852>:
            if (__result == 0) goto <D.5854>; else goto <D.5855>;
            <D.5854>:
            D.5856 = &MEM[(void *)"no" + 2B];
            D.5857 = *D.5856;
            D.5858 = (int) D.5857;
            D.5859 = __s2 + 2;
            D.5860 = *D.5859;
            D.5861 = (int) D.5860;
            __result = D.5858 - D.5861;
            if (__s2_len > 2) goto <D.5862>; else goto <D.5863>;
            <D.5862>:
            if (__result == 0) goto <D.5864>; else goto <D.5865>;
            <D.5864>:
            D.5866 = &MEM[(void *)"no" + 3B];
            D.5867 = *D.5866;
            D.5868 = (int) D.5867;
            D.5869 = __s2 + 3;
            D.5870 = *D.5869;
            D.5871 = (int) D.5870;
            __result = D.5868 - D.5871;
            <D.5865>:
            <D.5863>:
            <D.5855>:
            <D.5853>:
            <D.5845>:
            <D.5843>:
          }
          D.5636 = __result;
        }
        iftmp.2 = -D.5636;
        goto <D.5872>;
        <D.5836>:
        iftmp.2 = __builtin_strcmp (installed, "no");
        <D.5872>:
        D.5637 = iftmp.2;
      }
      if (D.5637 == 0) goto <D.5873>; else goto <D.5831>;
      <D.5873>:
      {
        char * dir;

        dir = monoeg_g_path_get_dirname (libtool_file);
        if (dlname != 0B) goto <D.5874>; else goto <D.5875>;
        <D.5874>:
        line = monoeg_g_strconcat (dir, "/.libs/", dlname, 0B);
        <D.5875>:
        monoeg_g_free (dir);
      }
      goto <D.5832>;
      <D.5831>:
      if (libdir != 0B) goto <D.5876>; else goto <D.5877>;
      <D.5876>:
      if (dlname != 0B) goto <D.5878>; else goto <D.5879>;
      <D.5878>:
      line = monoeg_g_strconcat (libdir, "/", dlname, 0B);
      <D.5879>:
      <D.5877>:
      <D.5832>:
      monoeg_g_free (dlname);
      monoeg_g_free (libdir);
      monoeg_g_free (installed);
      D.5804 = line;
      return D.5804;
    }
  finally
    {
      buf = {CLOBBER};
    }
}


read_string (char * p, struct FILE * file)
{
  char D.5882;
  const short unsigned int * * D.5884;
  const short unsigned int * D.5885;
  long unsigned int D.5886;
  long unsigned int D.5887;
  const short unsigned int * D.5888;
  short unsigned int D.5889;
  int D.5890;
  int D.5891;
  char * D.5894;
  char * iftmp.3;
  int D.5904;
  int D.5905;
  long int endp.4;
  long int startp.5;
  long int D.5912;
  unsigned int D.5913;
  unsigned int D.5914;
  long int p.6;
  long int D.5919;
  unsigned int D.5920;
  unsigned int D.5921;
  char * endp;
  char * startp;

  goto <D.5578>;
  <D.5577>:
  p = p + 1;
  <D.5578>:
  D.5882 = *p;
  if (D.5882 != 0) goto <D.5883>; else goto <D.5579>;
  <D.5883>:
  D.5884 = __ctype_b_loc ();
  D.5885 = *D.5884;
  D.5882 = *p;
  D.5886 = (long unsigned int) D.5882;
  D.5887 = D.5886 * 2;
  D.5888 = D.5885 + D.5887;
  D.5889 = *D.5888;
  D.5890 = (int) D.5889;
  D.5891 = D.5890 & 8192;
  if (D.5891 != 0) goto <D.5577>; else goto <D.5579>;
  <D.5579>:
  D.5882 = *p;
  if (D.5882 == 0) goto <D.5892>; else goto <D.5893>;
  <D.5892>:
  D.5894 = 0B;
  return D.5894;
  <D.5893>:
  D.5882 = *p;
  if (D.5882 == 61) goto <D.5895>; else goto <D.5896>;
  <D.5895>:
  p = p + 1;
  <D.5896>:
  goto <D.5581>;
  <D.5580>:
  p = p + 1;
  <D.5581>:
  D.5882 = *p;
  if (D.5882 != 0) goto <D.5897>; else goto <D.5582>;
  <D.5897>:
  D.5884 = __ctype_b_loc ();
  D.5885 = *D.5884;
  D.5882 = *p;
  D.5886 = (long unsigned int) D.5882;
  D.5887 = D.5886 * 2;
  D.5888 = D.5885 + D.5887;
  D.5889 = *D.5888;
  D.5890 = (int) D.5889;
  D.5891 = D.5890 & 8192;
  if (D.5891 != 0) goto <D.5580>; else goto <D.5582>;
  <D.5582>:
  D.5882 = *p;
  if (D.5882 == 39) goto <D.5898>; else goto <D.5900>;
  <D.5900>:
  D.5882 = *p;
  if (D.5882 == 34) goto <D.5898>; else goto <D.5899>;
  <D.5898>:
  {
    char t;

    t = *p;
    p = p + 1;
    startp = p;
    D.5904 = (int) t;
    D.5905 = __builtin_constant_p (D.5904);
    if (D.5905 != 0) goto <D.5906>; else goto <D.5902>;
    <D.5906>:
    if (t == 0) goto <D.5907>; else goto <D.5902>;
    <D.5907>:
    D.5904 = (int) t;
    iftmp.3 = __rawmemchr (p, D.5904);
    goto <D.5903>;
    <D.5902>:
    D.5904 = (int) t;
    iftmp.3 = __builtin_strchr (p, D.5904);
    <D.5903>:
    endp = iftmp.3;
    if (endp == 0B) goto <D.5908>; else goto <D.5909>;
    <D.5908>:
    D.5894 = 0B;
    return D.5894;
    <D.5909>:
    *endp = 0;
    endp.4 = (long int) endp;
    startp.5 = (long int) startp;
    D.5912 = endp.4 - startp.5;
    D.5913 = (unsigned int) D.5912;
    D.5914 = D.5913 + 1;
    D.5894 = monoeg_g_memdup (startp, D.5914);
    return D.5894;
  }
  <D.5899>:
  D.5882 = *p;
  if (D.5882 == 0) goto <D.5915>; else goto <D.5916>;
  <D.5915>:
  D.5894 = 0B;
  return D.5894;
  <D.5916>:
  startp = p;
  goto <D.5585>;
  <D.5584>:
  p = p + 1;
  <D.5585>:
  D.5882 = *p;
  if (D.5882 != 0) goto <D.5917>; else goto <D.5586>;
  <D.5917>:
  D.5884 = __ctype_b_loc ();
  D.5885 = *D.5884;
  D.5882 = *p;
  D.5886 = (long unsigned int) D.5882;
  D.5887 = D.5886 * 2;
  D.5888 = D.5885 + D.5887;
  D.5889 = *D.5888;
  D.5890 = (int) D.5889;
  D.5891 = D.5890 & 8192;
  if (D.5891 == 0) goto <D.5584>; else goto <D.5586>;
  <D.5586>:
  *p = 0;
  p.6 = (long int) p;
  startp.5 = (long int) startp;
  D.5919 = p.6 - startp.5;
  D.5920 = (unsigned int) D.5919;
  D.5921 = D.5920 + 1;
  D.5894 = monoeg_g_memdup (startp, D.5921);
  return D.5894;
}


fgets (char * restrict __s, int __n, struct FILE * restrict __stream)
{
  long unsigned int D.5923;
  int D.5928;
  char * D.5930;
  long unsigned int D.5931;
  long unsigned int D.5932;
  long unsigned int D.5933;
  long unsigned int D.5936;

  D.5923 = __builtin_object_size (__s, 1);
  if (D.5923 != 18446744073709551615) goto <D.5924>; else goto <D.5925>;
  <D.5924>:
  D.5928 = __builtin_constant_p (__n);
  if (D.5928 == 0) goto <D.5926>; else goto <D.5929>;
  <D.5929>:
  if (__n <= 0) goto <D.5926>; else goto <D.5927>;
  <D.5926>:
  D.5931 = __builtin_object_size (__s, 1);
  D.5930 = __fgets_chk (__s, D.5931, __n, __stream);
  return D.5930;
  <D.5927>:
  D.5932 = (long unsigned int) __n;
  D.5933 = __builtin_object_size (__s, 1);
  if (D.5932 > D.5933) goto <D.5934>; else goto <D.5935>;
  <D.5934>:
  D.5936 = __builtin_object_size (__s, 1);
  D.5930 = __fgets_chk_warn (__s, D.5936, __n, __stream);
  return D.5930;
  <D.5935>:
  <D.5925>:
  D.5930 = __fgets_alias (__s, __n, __stream);
  return D.5930;
}


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

  if (str != 0B) goto <D.5938>; else goto <D.5939>;
  <D.5938>:
  D.5940 = __strdup (str);
  return D.5940;
  <D.5939>:
  D.5940 = 0B;
  return D.5940;
}


mono_dl_symbol (struct MonoDl * module, const char * name, void * * symbol)
{
  struct MonoDlFallbackHandler * D.5942;
  void * (*<T3bd>) (void *, const char *, char * *, void *) D.5945;
  void * D.5946;
  void * D.5947;
  char * D.5953;
  char * iftmp.7;
  char * D.5959;
  void * sym;
  char * err;

  try
    {
      err = 0B;
      D.5942 = module->dl_fallback;
      if (D.5942 != 0B) goto <D.5943>; else goto <D.5944>;
      <D.5943>:
      D.5942 = module->dl_fallback;
      D.5945 = D.5942->symbol_func;
      D.5946 = module->handle;
      D.5942 = module->dl_fallback;
      D.5947 = D.5942->user_data;
      sym = D.5945 (D.5946, name, &err, D.5947);
      goto <D.5948>;
      <D.5944>:
      D.5946 = module->handle;
      sym = dlsym (D.5946, name);
      <D.5948>:
      if (sym != 0B) goto <D.5949>; else goto <D.5950>;
      <D.5949>:
      if (symbol != 0B) goto <D.5951>; else goto <D.5952>;
      <D.5951>:
      *symbol = sym;
      <D.5952>:
      D.5953 = 0B;
      return D.5953;
      <D.5950>:
      if (symbol != 0B) goto <D.5954>; else goto <D.5955>;
      <D.5954>:
      *symbol = 0B;
      <D.5955>:
      D.5942 = module->dl_fallback;
      if (D.5942 == 0B) goto <D.5957>; else goto <D.5958>;
      <D.5957>:
      D.5959 = dlerror ();
      iftmp.7 = monoeg_strdup (D.5959);
      goto <D.5960>;
      <D.5958>:
      iftmp.7 = err;
      <D.5960>:
      D.5953 = iftmp.7;
      return D.5953;
    }
  finally
    {
      err = {CLOBBER};
    }
}


mono_dl_close (struct MonoDl * module)
{
  void * (*<T3c0>) (void *, void *) D.5965;
  void * D.5968;
  void * D.5969;
  struct MonoDlFallbackHandler * dl_fallback;

  dl_fallback = module->dl_fallback;
  if (dl_fallback != 0B) goto <D.5963>; else goto <D.5964>;
  <D.5963>:
  D.5965 = dl_fallback->close_func;
  if (D.5965 != 0B) goto <D.5966>; else goto <D.5967>;
  <D.5966>:
  D.5965 = dl_fallback->close_func;
  D.5968 = module->handle;
  D.5969 = dl_fallback->user_data;
  D.5965 (D.5968, D.5969);
  <D.5967>:
  goto <D.5970>;
  <D.5964>:
  D.5968 = module->handle;
  dlclose (D.5968);
  <D.5970>:
  free (module);
}


mono_dl_build_path (const char * directory, const char * name, void * * iter)
{
  char * D.5973;
  void * D.5974;
  long int D.5975;
  long unsigned int D.5981;
  int D.5987;
  long unsigned int D.5989;
  int D.5697;
  int iftmp.8;
  int D.5696;
  const char[4] * D.5994;
  unsigned char D.5995;
  int D.5996;
  unsigned char D.5997;
  int D.5998;
  const unsigned char * D.6003;
  unsigned char D.6004;
  int D.6005;
  const unsigned char * D.6006;
  unsigned char D.6007;
  int D.6008;
  const unsigned char * D.6013;
  unsigned char D.6014;
  int D.6015;
  const unsigned char * D.6016;
  unsigned char D.6017;
  int D.6018;
  const unsigned char * D.6023;
  unsigned char D.6024;
  int D.6025;
  const unsigned char * D.6026;
  unsigned char D.6027;
  int D.6028;
  long unsigned int D.6031;
  int D.6032;
  char * D.6038;
  long unsigned int D.6039;
  sizetype D.6040;
  sizetype D.6041;
  const char * D.6042;
  char D.6046;
  long unsigned int D.6050;
  void * D.6051;
  int idx;
  const char * prefix;
  const char * suffix;
  gboolean first_call;
  int prlen;
  int suffixlen;
  char * res;

  if (iter == 0B) goto <D.5971>; else goto <D.5972>;
  <D.5971>:
  D.5973 = 0B;
  return D.5973;
  <D.5972>:
  D.5974 = *iter;
  D.5975 = (long int) D.5974;
  idx = (int) D.5975;
  if (idx == 0) goto <D.5976>; else goto <D.5977>;
  <D.5976>:
  first_call = 1;
  suffix = "";
  suffixlen = 0;
  goto <D.5978>;
  <D.5977>:
  idx = idx + -1;
  if (idx != 0) goto <D.5979>; else goto <D.5980>;
  <D.5979>:
  D.5973 = 0B;
  return D.5973;
  <D.5980>:
  first_call = 0;
  suffix = &suffixes[idx];
  D.5981 = strlen (suffix);
  suffixlen = (int) D.5981;
  <D.5978>:
  prlen = 3;
  if (prlen != 0) goto <D.5984>; else goto <D.5982>;
  <D.5984>:
  D.5987 = __builtin_constant_p (prlen);
  if (D.5987 != 0) goto <D.5988>; else goto <D.5985>;
  <D.5988>:
  D.5989 = (long unsigned int) prlen;
  if (D.5989 > 3) goto <D.5990>; else goto <D.5985>;
  <D.5990>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      __s2 = name;
      D.5994 = "lib";
      D.5995 = MEM[(const unsigned char *)D.5994];
      D.5996 = (int) D.5995;
      D.5997 = *__s2;
      D.5998 = (int) D.5997;
      __result = D.5996 - D.5998;
      {
        if (__s2_len != 0) goto <D.5999>; else goto <D.6000>;
        <D.5999>:
        if (__result == 0) goto <D.6001>; else goto <D.6002>;
        <D.6001>:
        D.6003 = &MEM[(void *)"lib" + 1B];
        D.6004 = *D.6003;
        D.6005 = (int) D.6004;
        D.6006 = __s2 + 1;
        D.6007 = *D.6006;
        D.6008 = (int) D.6007;
        __result = D.6005 - D.6008;
        if (__s2_len > 1) goto <D.6009>; else goto <D.6010>;
        <D.6009>:
        if (__result == 0) goto <D.6011>; else goto <D.6012>;
        <D.6011>:
        D.6013 = &MEM[(void *)"lib" + 2B];
        D.6014 = *D.6013;
        D.6015 = (int) D.6014;
        D.6016 = __s2 + 2;
        D.6017 = *D.6016;
        D.6018 = (int) D.6017;
        __result = D.6015 - D.6018;
        if (__s2_len > 2) goto <D.6019>; else goto <D.6020>;
        <D.6019>:
        if (__result == 0) goto <D.6021>; else goto <D.6022>;
        <D.6021>:
        D.6023 = &MEM[(void *)"lib" + 3B];
        D.6024 = *D.6023;
        D.6025 = (int) D.6024;
        D.6026 = __s2 + 3;
        D.6027 = *D.6026;
        D.6028 = (int) D.6027;
        __result = D.6025 - D.6028;
        <D.6022>:
        <D.6020>:
        <D.6012>:
        <D.6010>:
        <D.6002>:
        <D.6000>:
      }
      D.5696 = __result;
    }
    iftmp.8 = -D.5696;
    goto <D.6029>;
    <D.5993>:
    iftmp.8 = __builtin_strcmp (name, "lib");
    <D.6029>:
    D.5697 = iftmp.8;
  }
  if (D.5697 != 0) goto <D.6030>; else goto <D.5982>;
  <D.6030>:
  goto <D.5986>;
  <D.5985>:
  D.6031 = (long unsigned int) prlen;
  D.6032 = strncmp (name, "lib", D.6031);
  if (D.6032 != 0) goto <D.6033>; else goto <D.5982>;
  <D.6033>:
  <D.5986>:
  prefix = "lib";
  goto <D.5983>;
  <D.5982>:
  prefix = "";
  <D.5983>:
  if (first_call != 0) goto <D.6034>; else goto <D.6036>;
  <D.6036>:
  if (suffixlen != 0) goto <D.6037>; else goto <D.6035>;
  <D.6037>:
  D.6038 = strstr (name, suffix);
  D.6039 = strlen (name);
  D.6040 = (sizetype) suffixlen;
  D.6041 = D.6039 - D.6040;
  D.6042 = name + D.6041;
  if (D.6038 == D.6042) goto <D.6034>; else goto <D.6035>;
  <D.6034>:
  suffix = "";
  <D.6035>:
  if (directory != 0B) goto <D.6045>; else goto <D.6043>;
  <D.6045>:
  D.6046 = *directory;
  if (D.6046 != 0) goto <D.6047>; else goto <D.6043>;
  <D.6047>:
  res = monoeg_g_strconcat (directory, "/", prefix, name, suffix, 0B);
  goto <D.6044>;
  <D.6043>:
  res = monoeg_g_strconcat (prefix, name, suffix, 0B);
  <D.6044>:
  idx = idx + 1;
  if (first_call == 0) goto <D.6048>; else goto <D.6049>;
  <D.6048>:
  idx = idx + 1;
  <D.6049>:
  D.6050 = (long unsigned int) idx;
  D.6051 = (void *) D.6050;
  *iter = D.6051;
  D.5973 = res;
  return D.5973;
}


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.6055;
  struct GSList * fallback_handlers.9;
  struct GSList * fallback_handlers.10;
  struct MonoDlFallbackHandler * handler;

  if (load_func == 0B) goto <D.6053>; else goto <D.6054>;
  <D.6053>:
  monoeg_g_log (0B, 8, "%s:%d: assertion \'%s\' failed", "mono-dl.c", 528, "load_func != NULL");
  D.6055 = 0B;
  return D.6055;
  <D.6054>:
  if (symbol_func == 0B) goto <D.6056>; else goto <D.6057>;
  <D.6056>:
  monoeg_g_log (0B, 8, "%s:%d: assertion \'%s\' failed", "mono-dl.c", 529, "symbol_func != NULL");
  D.6055 = 0B;
  return D.6055;
  <D.6057>:
  handler = monoeg_malloc (32);
  handler->load_func = load_func;
  handler->symbol_func = symbol_func;
  handler->close_func = close_func;
  handler->user_data = user_data;
  fallback_handlers.9 = fallback_handlers;
  fallback_handlers.10 = monoeg_g_slist_prepend (fallback_handlers.9, handler);
  fallback_handlers = fallback_handlers.10;
  D.6055 = handler;
  return D.6055;
}


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

  fallback_handlers.11 = fallback_handlers;
  found = monoeg_g_slist_find (fallback_handlers.11, handler);
  if (found == 0B) goto <D.6062>; else goto <D.6063>;
  <D.6062>:
  return;
  <D.6063>:
  fallback_handlers.11 = fallback_handlers;
  monoeg_g_slist_remove (fallback_handlers.11, handler);
  monoeg_g_free (handler);
}


