mono_dl_open (const char * name, int flags, char * * error_msg)
{
  gchar * D.5202;
  struct MonoDl * D.5203;
  _Bool D.5204;
  int D.5205;
  void * (*<T3b9>) (const char *, int, char * *, void *) D.5210;
  void * D.5211;
  char * D.5214;
  _Bool D.5219;
  _Bool D.5220;
  _Bool D.5221;
  int D.5151;
  int iftmp.0;
  int D.5150;
  const char[4] * D.5231;
  unsigned char D.5232;
  int D.5233;
  unsigned char D.5234;
  int D.5235;
  _Bool D.5236;
  _Bool D.5237;
  _Bool D.5238;
  const unsigned char * D.5241;
  unsigned char D.5242;
  int D.5243;
  const unsigned char * D.5244;
  unsigned char D.5245;
  int D.5246;
  _Bool D.5247;
  _Bool D.5248;
  const unsigned char * D.5251;
  unsigned char D.5252;
  int D.5253;
  const unsigned char * D.5254;
  unsigned char D.5255;
  int D.5256;
  _Bool D.5257;
  _Bool D.5258;
  const unsigned char * D.5261;
  unsigned char D.5262;
  int D.5263;
  const unsigned char * D.5264;
  unsigned char D.5265;
  int D.5266;
  char * D.5276;
  gchar * D.5277;
  struct MonoDl * module;
  void * lib;
  struct MonoDlFallbackHandler * dl_fallback;
  int lflags;

  dl_fallback = 0B;
  lflags = convert_flags (flags);
  if (error_msg != 0B) goto <D.5196>; else goto <D.5197>;
  <D.5196>:
  *error_msg = 0B;
  <D.5197>:
  module = malloc (24);
  if (module == 0B) goto <D.5198>; else goto <D.5199>;
  <D.5198>:
  if (error_msg != 0B) goto <D.5200>; else goto <D.5201>;
  <D.5200>:
  D.5202 = monoeg_strdup ("Out of memory");
  *error_msg = D.5202;
  <D.5201>:
  D.5203 = 0B;
  return D.5203;
  <D.5199>:
  D.5204 = name == 0B;
  D.5205 = (int) D.5204;
  module->main_module = D.5205;
  lib = dlopen (name, lflags);
  if (lib == 0B) goto <D.5206>; else goto <D.5207>;
  <D.5206>:
  {
    struct GSList * node;

    node = fallback_handlers;
    goto <D.5138>;
    <D.5137>:
    {
      struct MonoDlFallbackHandler * handler;

      handler = node->data;
      if (error_msg != 0B) goto <D.5208>; else goto <D.5209>;
      <D.5208>:
      *error_msg = 0B;
      <D.5209>:
      D.5210 = handler->load_func;
      D.5211 = handler->user_data;
      lib = D.5210 (name, lflags, error_msg, D.5211);
      if (error_msg != 0B) goto <D.5212>; else goto <D.5213>;
      <D.5212>:
      D.5214 = *error_msg;
      if (D.5214 != 0B) goto <D.5215>; else goto <D.5216>;
      <D.5215>:
      D.5214 = *error_msg;
      monoeg_g_free (D.5214);
      <D.5216>:
      <D.5213>:
      if (lib != 0B) goto <D.5217>; else goto <D.5218>;
      <D.5217>:
      dl_fallback = handler;
      goto <D.5136>;
      <D.5218>:
    }
    node = node->next;
    <D.5138>:
    if (node != 0B) goto <D.5137>; else goto <D.5136>;
    <D.5136>:
  }
  <D.5207>:
  D.5219 = lib == 0B;
  D.5220 = dl_fallback == 0B;
  D.5221 = D.5219 & D.5220;
  if (D.5221 != 0) goto <D.5222>; else goto <D.5223>;
  <D.5222>:
  {
    char * lname;
    char * llname;
    const char * suff;
    const char * ext;

    if (name == 0B) goto <D.5224>; else goto <D.5225>;
    <D.5224>:
    free (module);
    D.5203 = 0B;
    return D.5203;
    <D.5225>:
    suff = ".la";
    ext = strrchr (name, 46);
    if (ext != 0B) goto <D.5226>; else goto <D.5227>;
    <D.5226>:
    {
      size_t __s1_len;
      size_t __s2_len;

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

        __s2 = ext;
        D.5231 = ".la";
        D.5232 = MEM[(const unsigned char *)D.5231];
        D.5233 = (int) D.5232;
        D.5234 = *__s2;
        D.5235 = (int) D.5234;
        __result = D.5233 - D.5235;
        {
          D.5236 = __s2_len != 0;
          D.5237 = __result == 0;
          D.5238 = D.5236 & D.5237;
          if (D.5238 != 0) goto <D.5239>; else goto <D.5240>;
          <D.5239>:
          D.5241 = &MEM[(void *)".la" + 1B];
          D.5242 = *D.5241;
          D.5243 = (int) D.5242;
          D.5244 = __s2 + 1;
          D.5245 = *D.5244;
          D.5246 = (int) D.5245;
          __result = D.5243 - D.5246;
          D.5247 = __s2_len > 1;
          D.5237 = __result == 0;
          D.5248 = D.5247 & D.5237;
          if (D.5248 != 0) goto <D.5249>; else goto <D.5250>;
          <D.5249>:
          D.5251 = &MEM[(void *)".la" + 2B];
          D.5252 = *D.5251;
          D.5253 = (int) D.5252;
          D.5254 = __s2 + 2;
          D.5255 = *D.5254;
          D.5256 = (int) D.5255;
          __result = D.5253 - D.5256;
          D.5257 = __s2_len > 2;
          D.5237 = __result == 0;
          D.5258 = D.5257 & D.5237;
          if (D.5258 != 0) goto <D.5259>; else goto <D.5260>;
          <D.5259>:
          D.5261 = &MEM[(void *)".la" + 3B];
          D.5262 = *D.5261;
          D.5263 = (int) D.5262;
          D.5264 = __s2 + 3;
          D.5265 = *D.5264;
          D.5266 = (int) D.5265;
          __result = D.5263 - D.5266;
          <D.5260>:
          <D.5250>:
          <D.5240>:
        }
        D.5150 = __result;
      }
      iftmp.0 = -D.5150;
      goto <D.5267>;
      <D.5230>:
      iftmp.0 = __builtin_strcmp (ext, ".la");
      <D.5267>:
      D.5151 = iftmp.0;
    }
    if (D.5151 == 0) goto <D.5268>; else goto <D.5269>;
    <D.5268>:
    suff = "";
    <D.5269>:
    <D.5227>:
    lname = monoeg_g_strconcat (name, suff, 0B);
    llname = get_dl_name_from_libtool (lname);
    monoeg_g_free (lname);
    if (llname != 0B) goto <D.5270>; else goto <D.5271>;
    <D.5270>:
    lib = dlopen (llname, lflags);
    monoeg_g_free (llname);
    <D.5271>:
    if (lib == 0B) goto <D.5272>; else goto <D.5273>;
    <D.5272>:
    if (error_msg != 0B) goto <D.5274>; else goto <D.5275>;
    <D.5274>:
    D.5276 = dlerror ();
    D.5277 = monoeg_strdup (D.5276);
    *error_msg = D.5277;
    <D.5275>:
    free (module);
    D.5203 = 0B;
    return D.5203;
    <D.5273>:
  }
  <D.5223>:
  module->handle = lib;
  module->dl_fallback = dl_fallback;
  D.5203 = module;
  return D.5203;
}


convert_flags (int flags)
{
  int iftmp.1;
  int D.5280;
  int D.5284;
  int D.5288;
  int lflags;

  D.5280 = flags & 2;
  if (D.5280 != 0) goto <D.5281>; else goto <D.5282>;
  <D.5281>:
  iftmp.1 = 0;
  goto <D.5283>;
  <D.5282>:
  iftmp.1 = 256;
  <D.5283>:
  lflags = iftmp.1;
  D.5284 = flags & 1;
  if (D.5284 != 0) goto <D.5285>; else goto <D.5286>;
  <D.5285>:
  lflags = lflags | 1;
  goto <D.5287>;
  <D.5286>:
  lflags = lflags | 2;
  <D.5287>:
  D.5288 = lflags;
  return D.5288;
}


get_dl_name_from_libtool (const char * libtool_file)
{
  char * D.5292;
  char D.5293;
  const short unsigned int * * D.5295;
  const short unsigned int * D.5296;
  long unsigned int D.5297;
  long unsigned int D.5298;
  const short unsigned int * D.5299;
  short unsigned int D.5300;
  int D.5301;
  int D.5302;
  char D.5303;
  _Bool D.5304;
  _Bool D.5305;
  _Bool D.5306;
  int D.5309;
  char * D.5312;
  int D.5314;
  int D.5318;
  char * D.5321;
  int D.5123;
  int iftmp.2;
  int D.5122;
  const char[3] * D.5328;
  unsigned char D.5329;
  int D.5330;
  unsigned char D.5331;
  int D.5332;
  _Bool D.5333;
  _Bool D.5334;
  _Bool D.5335;
  const unsigned char * D.5338;
  unsigned char D.5339;
  int D.5340;
  const unsigned char * D.5341;
  unsigned char D.5342;
  int D.5343;
  _Bool D.5344;
  _Bool D.5345;
  const unsigned char * D.5348;
  unsigned char D.5349;
  int D.5350;
  const unsigned char * D.5351;
  unsigned char D.5352;
  int D.5353;
  _Bool D.5354;
  _Bool D.5355;
  const unsigned char * D.5358;
  unsigned char D.5359;
  int D.5360;
  const unsigned char * D.5361;
  unsigned char D.5362;
  int D.5363;
  _Bool D.5368;
  _Bool D.5369;
  _Bool D.5370;
  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.5290>; else goto <D.5291>;
      <D.5290>:
      D.5292 = 0B;
      return D.5292;
      <D.5291>:
      goto <D.5085>;
      <D.5113>:
      goto <D.5083>;
      <D.5082>:
      line = line + 1;
      <D.5083>:
      D.5293 = *line;
      if (D.5293 != 0) goto <D.5294>; else goto <D.5084>;
      <D.5294>:
      D.5295 = __ctype_b_loc ();
      D.5296 = *D.5295;
      D.5293 = *line;
      D.5297 = (long unsigned int) D.5293;
      D.5298 = D.5297 * 2;
      D.5299 = D.5296 + D.5298;
      D.5300 = *D.5299;
      D.5301 = (int) D.5300;
      D.5302 = D.5301 & 8192;
      if (D.5302 != 0) goto <D.5082>; else goto <D.5084>;
      <D.5084>:
      D.5303 = *line;
      D.5304 = D.5303 == 35;
      D.5305 = D.5303 == 0;
      D.5306 = D.5304 | D.5305;
      if (D.5306 != 0) goto <D.5307>; else goto <D.5308>;
      <D.5307>:
      // predicted unlikely by continue predictor.
      goto <D.5085>;
      <D.5308>:
      D.5309 = strncmp ("dlname", line, 6);
      if (D.5309 == 0) goto <D.5310>; else goto <D.5311>;
      <D.5310>:
      monoeg_g_free (dlname);
      D.5312 = line + 6;
      dlname = read_string (D.5312, file);
      goto <D.5313>;
      <D.5311>:
      D.5314 = strncmp ("libdir", line, 6);
      if (D.5314 == 0) goto <D.5315>; else goto <D.5316>;
      <D.5315>:
      monoeg_g_free (libdir);
      D.5312 = line + 6;
      libdir = read_string (D.5312, file);
      goto <D.5317>;
      <D.5316>:
      D.5318 = strncmp ("installed", line, 9);
      if (D.5318 == 0) goto <D.5319>; else goto <D.5320>;
      <D.5319>:
      monoeg_g_free (installed);
      D.5321 = line + 9;
      installed = read_string (D.5321, file);
      <D.5320>:
      <D.5317>:
      <D.5313>:
      <D.5085>:
      line = fgets (&buf, 512, file);
      if (line != 0B) goto <D.5113>; else goto <D.5114>;
      <D.5114>:
      fclose (file);
      line = 0B;
      if (installed != 0B) goto <D.5324>; else goto <D.5322>;
      <D.5324>:
      {
        size_t __s1_len;
        size_t __s2_len;

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

          __s2 = installed;
          D.5328 = "no";
          D.5329 = MEM[(const unsigned char *)D.5328];
          D.5330 = (int) D.5329;
          D.5331 = *__s2;
          D.5332 = (int) D.5331;
          __result = D.5330 - D.5332;
          {
            D.5333 = __s2_len != 0;
            D.5334 = __result == 0;
            D.5335 = D.5333 & D.5334;
            if (D.5335 != 0) goto <D.5336>; else goto <D.5337>;
            <D.5336>:
            D.5338 = &MEM[(void *)"no" + 1B];
            D.5339 = *D.5338;
            D.5340 = (int) D.5339;
            D.5341 = __s2 + 1;
            D.5342 = *D.5341;
            D.5343 = (int) D.5342;
            __result = D.5340 - D.5343;
            D.5344 = __s2_len > 1;
            D.5334 = __result == 0;
            D.5345 = D.5344 & D.5334;
            if (D.5345 != 0) goto <D.5346>; else goto <D.5347>;
            <D.5346>:
            D.5348 = &MEM[(void *)"no" + 2B];
            D.5349 = *D.5348;
            D.5350 = (int) D.5349;
            D.5351 = __s2 + 2;
            D.5352 = *D.5351;
            D.5353 = (int) D.5352;
            __result = D.5350 - D.5353;
            D.5354 = __s2_len > 2;
            D.5334 = __result == 0;
            D.5355 = D.5354 & D.5334;
            if (D.5355 != 0) goto <D.5356>; else goto <D.5357>;
            <D.5356>:
            D.5358 = &MEM[(void *)"no" + 3B];
            D.5359 = *D.5358;
            D.5360 = (int) D.5359;
            D.5361 = __s2 + 3;
            D.5362 = *D.5361;
            D.5363 = (int) D.5362;
            __result = D.5360 - D.5363;
            <D.5357>:
            <D.5347>:
            <D.5337>:
          }
          D.5122 = __result;
        }
        iftmp.2 = -D.5122;
        goto <D.5364>;
        <D.5327>:
        iftmp.2 = __builtin_strcmp (installed, "no");
        <D.5364>:
        D.5123 = iftmp.2;
      }
      if (D.5123 == 0) goto <D.5365>; else goto <D.5322>;
      <D.5365>:
      {
        char * dir;

        dir = monoeg_g_path_get_dirname (libtool_file);
        if (dlname != 0B) goto <D.5366>; else goto <D.5367>;
        <D.5366>:
        line = monoeg_g_strconcat (dir, "/.libs/", dlname, 0B);
        <D.5367>:
        monoeg_g_free (dir);
      }
      goto <D.5323>;
      <D.5322>:
      D.5368 = libdir != 0B;
      D.5369 = dlname != 0B;
      D.5370 = D.5368 & D.5369;
      if (D.5370 != 0) goto <D.5371>; else goto <D.5372>;
      <D.5371>:
      line = monoeg_g_strconcat (libdir, "/", dlname, 0B);
      <D.5372>:
      <D.5323>:
      monoeg_g_free (dlname);
      monoeg_g_free (libdir);
      monoeg_g_free (installed);
      D.5292 = line;
      return D.5292;
    }
  finally
    {
      buf = {CLOBBER};
    }
}


read_string (char * p, struct FILE * file)
{
  char D.5375;
  const short unsigned int * * D.5377;
  const short unsigned int * D.5378;
  long unsigned int D.5379;
  long unsigned int D.5380;
  const short unsigned int * D.5381;
  short unsigned int D.5382;
  int D.5383;
  int D.5384;
  char * D.5387;
  char D.5391;
  _Bool D.5392;
  _Bool D.5393;
  _Bool D.5394;
  char * iftmp.3;
  int D.5400;
  int D.5401;
  long int endp.4;
  long int startp.5;
  long int D.5408;
  unsigned int D.5409;
  unsigned int D.5410;
  long int p.6;
  long int D.5415;
  unsigned int D.5416;
  unsigned int D.5417;
  char * endp;
  char * startp;

  goto <D.5064>;
  <D.5063>:
  p = p + 1;
  <D.5064>:
  D.5375 = *p;
  if (D.5375 != 0) goto <D.5376>; else goto <D.5065>;
  <D.5376>:
  D.5377 = __ctype_b_loc ();
  D.5378 = *D.5377;
  D.5375 = *p;
  D.5379 = (long unsigned int) D.5375;
  D.5380 = D.5379 * 2;
  D.5381 = D.5378 + D.5380;
  D.5382 = *D.5381;
  D.5383 = (int) D.5382;
  D.5384 = D.5383 & 8192;
  if (D.5384 != 0) goto <D.5063>; else goto <D.5065>;
  <D.5065>:
  D.5375 = *p;
  if (D.5375 == 0) goto <D.5385>; else goto <D.5386>;
  <D.5385>:
  D.5387 = 0B;
  return D.5387;
  <D.5386>:
  D.5375 = *p;
  if (D.5375 == 61) goto <D.5388>; else goto <D.5389>;
  <D.5388>:
  p = p + 1;
  <D.5389>:
  goto <D.5067>;
  <D.5066>:
  p = p + 1;
  <D.5067>:
  D.5375 = *p;
  if (D.5375 != 0) goto <D.5390>; else goto <D.5068>;
  <D.5390>:
  D.5377 = __ctype_b_loc ();
  D.5378 = *D.5377;
  D.5375 = *p;
  D.5379 = (long unsigned int) D.5375;
  D.5380 = D.5379 * 2;
  D.5381 = D.5378 + D.5380;
  D.5382 = *D.5381;
  D.5383 = (int) D.5382;
  D.5384 = D.5383 & 8192;
  if (D.5384 != 0) goto <D.5066>; else goto <D.5068>;
  <D.5068>:
  D.5391 = *p;
  D.5392 = D.5391 == 39;
  D.5393 = D.5391 == 34;
  D.5394 = D.5392 | D.5393;
  if (D.5394 != 0) goto <D.5395>; else goto <D.5396>;
  <D.5395>:
  {
    char t;

    t = *p;
    p = p + 1;
    startp = p;
    D.5400 = (int) t;
    D.5401 = __builtin_constant_p (D.5400);
    if (D.5401 != 0) goto <D.5402>; else goto <D.5398>;
    <D.5402>:
    if (t == 0) goto <D.5403>; else goto <D.5398>;
    <D.5403>:
    D.5400 = (int) t;
    iftmp.3 = __rawmemchr (p, D.5400);
    goto <D.5399>;
    <D.5398>:
    D.5400 = (int) t;
    iftmp.3 = __builtin_strchr (p, D.5400);
    <D.5399>:
    endp = iftmp.3;
    if (endp == 0B) goto <D.5404>; else goto <D.5405>;
    <D.5404>:
    D.5387 = 0B;
    return D.5387;
    <D.5405>:
    *endp = 0;
    endp.4 = (long int) endp;
    startp.5 = (long int) startp;
    D.5408 = endp.4 - startp.5;
    D.5409 = (unsigned int) D.5408;
    D.5410 = D.5409 + 1;
    D.5387 = monoeg_g_memdup (startp, D.5410);
    return D.5387;
  }
  <D.5396>:
  D.5375 = *p;
  if (D.5375 == 0) goto <D.5411>; else goto <D.5412>;
  <D.5411>:
  D.5387 = 0B;
  return D.5387;
  <D.5412>:
  startp = p;
  goto <D.5071>;
  <D.5070>:
  p = p + 1;
  <D.5071>:
  D.5375 = *p;
  if (D.5375 != 0) goto <D.5413>; else goto <D.5072>;
  <D.5413>:
  D.5377 = __ctype_b_loc ();
  D.5378 = *D.5377;
  D.5375 = *p;
  D.5379 = (long unsigned int) D.5375;
  D.5380 = D.5379 * 2;
  D.5381 = D.5378 + D.5380;
  D.5382 = *D.5381;
  D.5383 = (int) D.5382;
  D.5384 = D.5383 & 8192;
  if (D.5384 == 0) goto <D.5070>; else goto <D.5072>;
  <D.5072>:
  *p = 0;
  p.6 = (long int) p;
  startp.5 = (long int) startp;
  D.5415 = p.6 - startp.5;
  D.5416 = (unsigned int) D.5415;
  D.5417 = D.5416 + 1;
  D.5387 = monoeg_g_memdup (startp, D.5417);
  return D.5387;
}


fgets (char * restrict __s, int __n, struct FILE * restrict __stream)
{
  long unsigned int D.5419;
  int D.5424;
  char * D.5426;
  long unsigned int D.5427;
  long unsigned int D.5428;
  long unsigned int D.5429;
  long unsigned int D.5432;

  D.5419 = __builtin_object_size (__s, 1);
  if (D.5419 != 18446744073709551615) goto <D.5420>; else goto <D.5421>;
  <D.5420>:
  D.5424 = __builtin_constant_p (__n);
  if (D.5424 == 0) goto <D.5422>; else goto <D.5425>;
  <D.5425>:
  if (__n <= 0) goto <D.5422>; else goto <D.5423>;
  <D.5422>:
  D.5427 = __builtin_object_size (__s, 1);
  D.5426 = __fgets_chk (__s, D.5427, __n, __stream);
  return D.5426;
  <D.5423>:
  D.5428 = (long unsigned int) __n;
  D.5429 = __builtin_object_size (__s, 1);
  if (D.5428 > D.5429) goto <D.5430>; else goto <D.5431>;
  <D.5430>:
  D.5432 = __builtin_object_size (__s, 1);
  D.5426 = __fgets_chk_warn (__s, D.5432, __n, __stream);
  return D.5426;
  <D.5431>:
  <D.5421>:
  D.5426 = __fgets_alias (__s, __n, __stream);
  return D.5426;
}


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

  if (str != 0B) goto <D.5434>; else goto <D.5435>;
  <D.5434>:
  D.5436 = __strdup (str);
  return D.5436;
  <D.5435>:
  D.5436 = 0B;
  return D.5436;
}


mono_dl_symbol (struct MonoDl * module, const char * name, void * * symbol)
{
  struct MonoDlFallbackHandler * D.5438;
  void * (*<T3bc>) (void *, const char *, char * *, void *) D.5441;
  void * D.5442;
  void * D.5443;
  char * D.5449;
  char * iftmp.7;
  char * D.5455;
  void * sym;
  char * err;

  try
    {
      err = 0B;
      D.5438 = module->dl_fallback;
      if (D.5438 != 0B) goto <D.5439>; else goto <D.5440>;
      <D.5439>:
      D.5438 = module->dl_fallback;
      D.5441 = D.5438->symbol_func;
      D.5438 = module->dl_fallback;
      D.5442 = D.5438->user_data;
      D.5443 = module->handle;
      sym = D.5441 (D.5443, name, &err, D.5442);
      goto <D.5444>;
      <D.5440>:
      D.5443 = module->handle;
      sym = dlsym (D.5443, name);
      <D.5444>:
      if (sym != 0B) goto <D.5445>; else goto <D.5446>;
      <D.5445>:
      if (symbol != 0B) goto <D.5447>; else goto <D.5448>;
      <D.5447>:
      *symbol = sym;
      <D.5448>:
      D.5449 = 0B;
      return D.5449;
      <D.5446>:
      if (symbol != 0B) goto <D.5450>; else goto <D.5451>;
      <D.5450>:
      *symbol = 0B;
      <D.5451>:
      D.5438 = module->dl_fallback;
      if (D.5438 == 0B) goto <D.5453>; else goto <D.5454>;
      <D.5453>:
      D.5455 = dlerror ();
      iftmp.7 = monoeg_strdup (D.5455);
      goto <D.5456>;
      <D.5454>:
      iftmp.7 = err;
      <D.5456>:
      D.5449 = iftmp.7;
      return D.5449;
    }
  finally
    {
      err = {CLOBBER};
    }
}


mono_dl_close (struct MonoDl * module)
{
  void * (*<T3bf>) (void *, void *) D.5461;
  void * D.5464;
  void * D.5465;
  struct MonoDlFallbackHandler * dl_fallback;

  dl_fallback = module->dl_fallback;
  if (dl_fallback != 0B) goto <D.5459>; else goto <D.5460>;
  <D.5459>:
  D.5461 = dl_fallback->close_func;
  if (D.5461 != 0B) goto <D.5462>; else goto <D.5463>;
  <D.5462>:
  D.5461 = dl_fallback->close_func;
  D.5464 = dl_fallback->user_data;
  D.5465 = module->handle;
  D.5461 (D.5465, D.5464);
  <D.5463>:
  goto <D.5466>;
  <D.5460>:
  D.5465 = module->handle;
  dlclose (D.5465);
  <D.5466>:
  free (module);
}


mono_dl_build_path (const char * directory, const char * name, void * * iter)
{
  char * D.5469;
  void * D.5470;
  long int D.5471;
  long unsigned int D.5477;
  int D.5483;
  long unsigned int D.5485;
  int D.5183;
  int iftmp.8;
  int D.5182;
  const char[4] * D.5490;
  unsigned char D.5491;
  int D.5492;
  unsigned char D.5493;
  int D.5494;
  _Bool D.5495;
  _Bool D.5496;
  _Bool D.5497;
  const unsigned char * D.5500;
  unsigned char D.5501;
  int D.5502;
  const unsigned char * D.5503;
  unsigned char D.5504;
  int D.5505;
  _Bool D.5506;
  _Bool D.5507;
  const unsigned char * D.5510;
  unsigned char D.5511;
  int D.5512;
  const unsigned char * D.5513;
  unsigned char D.5514;
  int D.5515;
  _Bool D.5516;
  _Bool D.5517;
  const unsigned char * D.5520;
  unsigned char D.5521;
  int D.5522;
  const unsigned char * D.5523;
  unsigned char D.5524;
  int D.5525;
  long unsigned int D.5528;
  int D.5529;
  char * D.5535;
  long unsigned int D.5536;
  sizetype D.5537;
  sizetype D.5538;
  const char * D.5539;
  char D.5543;
  long unsigned int D.5547;
  void * D.5548;
  int idx;
  const char * prefix;
  const char * suffix;
  gboolean first_call;
  int prlen;
  int suffixlen;
  char * res;

  if (iter == 0B) goto <D.5467>; else goto <D.5468>;
  <D.5467>:
  D.5469 = 0B;
  return D.5469;
  <D.5468>:
  D.5470 = *iter;
  D.5471 = (long int) D.5470;
  idx = (int) D.5471;
  if (idx == 0) goto <D.5472>; else goto <D.5473>;
  <D.5472>:
  first_call = 1;
  suffix = "";
  suffixlen = 0;
  goto <D.5474>;
  <D.5473>:
  idx = idx + -1;
  if (idx != 0) goto <D.5475>; else goto <D.5476>;
  <D.5475>:
  D.5469 = 0B;
  return D.5469;
  <D.5476>:
  first_call = 0;
  suffix = &suffixes[idx];
  D.5477 = strlen (suffix);
  suffixlen = (int) D.5477;
  <D.5474>:
  prlen = 3;
  if (prlen != 0) goto <D.5480>; else goto <D.5478>;
  <D.5480>:
  D.5483 = __builtin_constant_p (prlen);
  if (D.5483 != 0) goto <D.5484>; else goto <D.5481>;
  <D.5484>:
  D.5485 = (long unsigned int) prlen;
  if (D.5485 > 3) goto <D.5486>; else goto <D.5481>;
  <D.5486>:
  {
    size_t __s1_len;
    size_t __s2_len;

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

      __s2 = name;
      D.5490 = "lib";
      D.5491 = MEM[(const unsigned char *)D.5490];
      D.5492 = (int) D.5491;
      D.5493 = *__s2;
      D.5494 = (int) D.5493;
      __result = D.5492 - D.5494;
      {
        D.5495 = __s2_len != 0;
        D.5496 = __result == 0;
        D.5497 = D.5495 & D.5496;
        if (D.5497 != 0) goto <D.5498>; else goto <D.5499>;
        <D.5498>:
        D.5500 = &MEM[(void *)"lib" + 1B];
        D.5501 = *D.5500;
        D.5502 = (int) D.5501;
        D.5503 = __s2 + 1;
        D.5504 = *D.5503;
        D.5505 = (int) D.5504;
        __result = D.5502 - D.5505;
        D.5506 = __s2_len > 1;
        D.5496 = __result == 0;
        D.5507 = D.5506 & D.5496;
        if (D.5507 != 0) goto <D.5508>; else goto <D.5509>;
        <D.5508>:
        D.5510 = &MEM[(void *)"lib" + 2B];
        D.5511 = *D.5510;
        D.5512 = (int) D.5511;
        D.5513 = __s2 + 2;
        D.5514 = *D.5513;
        D.5515 = (int) D.5514;
        __result = D.5512 - D.5515;
        D.5516 = __s2_len > 2;
        D.5496 = __result == 0;
        D.5517 = D.5516 & D.5496;
        if (D.5517 != 0) goto <D.5518>; else goto <D.5519>;
        <D.5518>:
        D.5520 = &MEM[(void *)"lib" + 3B];
        D.5521 = *D.5520;
        D.5522 = (int) D.5521;
        D.5523 = __s2 + 3;
        D.5524 = *D.5523;
        D.5525 = (int) D.5524;
        __result = D.5522 - D.5525;
        <D.5519>:
        <D.5509>:
        <D.5499>:
      }
      D.5182 = __result;
    }
    iftmp.8 = -D.5182;
    goto <D.5526>;
    <D.5489>:
    iftmp.8 = __builtin_strcmp (name, "lib");
    <D.5526>:
    D.5183 = iftmp.8;
  }
  if (D.5183 != 0) goto <D.5527>; else goto <D.5478>;
  <D.5527>:
  goto <D.5482>;
  <D.5481>:
  D.5528 = (long unsigned int) prlen;
  D.5529 = strncmp (name, "lib", D.5528);
  if (D.5529 != 0) goto <D.5530>; else goto <D.5478>;
  <D.5530>:
  <D.5482>:
  prefix = "lib";
  goto <D.5479>;
  <D.5478>:
  prefix = "";
  <D.5479>:
  if (first_call != 0) goto <D.5531>; else goto <D.5533>;
  <D.5533>:
  if (suffixlen != 0) goto <D.5534>; else goto <D.5532>;
  <D.5534>:
  D.5535 = strstr (name, suffix);
  D.5536 = strlen (name);
  D.5537 = (sizetype) suffixlen;
  D.5538 = D.5536 - D.5537;
  D.5539 = name + D.5538;
  if (D.5535 == D.5539) goto <D.5531>; else goto <D.5532>;
  <D.5531>:
  suffix = "";
  <D.5532>:
  if (directory != 0B) goto <D.5542>; else goto <D.5540>;
  <D.5542>:
  D.5543 = *directory;
  if (D.5543 != 0) goto <D.5544>; else goto <D.5540>;
  <D.5544>:
  res = monoeg_g_strconcat (directory, "/", prefix, name, suffix, 0B);
  goto <D.5541>;
  <D.5540>:
  res = monoeg_g_strconcat (prefix, name, suffix, 0B);
  <D.5541>:
  idx = idx + 1;
  if (first_call == 0) goto <D.5545>; else goto <D.5546>;
  <D.5545>:
  idx = idx + 1;
  <D.5546>:
  D.5547 = (long unsigned int) idx;
  D.5548 = (void *) D.5547;
  *iter = D.5548;
  D.5469 = res;
  return D.5469;
}


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

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


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


