GC_register_dynamic_libraries_dl_iterate_phdr ()
{
  int did_something.0;
  char * GC_data_start.1;
  GC_bool D.8267;

  if (dl_iterate_phdr != 0B) goto <D.8261>; else goto <D.8262>;
  <D.8261>:
  {
    int did_something;

    try
      {
        did_something = 0;
        dl_iterate_phdr (GC_register_dynlib_callback, &did_something);
        did_something.0 = did_something;
        if (did_something.0 == 0) goto <D.8264>; else goto <D.8265>;
        <D.8264>:
        GC_data_start.1 = GC_data_start;
        GC_add_roots_inner (GC_data_start.1, &_end, 1);
        <D.8265>:
        D.8267 = 1;
        return D.8267;
      }
    finally
      {
        did_something = {CLOBBER};
      }
  }
  <D.8262>:
  D.8267 = 0;
  return D.8267;
}


GC_register_dynlib_callback (struct dl_phdr_info * info, size_t size, void * ptr)
{
  int D.8272;
  unsigned int D.8273;
  unsigned int D.8274;
  unsigned int D.8275;
  unsigned int D.8277;
  unsigned int D.8278;
  sizetype D.8279;
  unsigned int D.8280;
  char * D.8281;
  short unsigned int D.8282;
  int D.8283;
  const struct Elf32_Phdr * p;
  char * start;
  register int i;

  if (size <= 13) goto <D.8270>; else goto <D.8271>;
  <D.8270>:
  D.8272 = -1;
  return D.8272;
  <D.8271>:
  p = info->dlpi_phdr;
  i = 0;
  goto <D.8223>;
  <D.8222>:
  D.8273 = p->p_type;
  switch (D.8273) <default: <D.8221>, case 1: <D.8219>>
  <D.8219>:
  D.8274 = p->p_flags;
  D.8275 = D.8274 & 2;
  if (D.8275 == 0) goto <D.8220>; else goto <D.8276>;
  <D.8276>:
  D.8277 = info->dlpi_addr;
  D.8278 = p->p_vaddr;
  D.8279 = D.8277 + D.8278;
  start = (char *) D.8279;
  D.8280 = p->p_memsz;
  D.8281 = start + D.8280;
  GC_add_roots_inner (start, D.8281, 1);
  goto <D.8220>;
  <D.8221>:
  goto <D.8220>;
  <D.8220>:
  i = i + 1;
  p = p + 32;
  <D.8223>:
  D.8282 = info->dlpi_phnum;
  D.8283 = (int) D.8282;
  if (D.8283 > i) goto <D.8222>; else goto <D.8224>;
  <D.8224>:
  MEM[(int *)ptr] = 1;
  D.8272 = 0;
  return D.8272;
}


GC_register_main_static_data ()
{
  GC_bool D.8286;
  _Bool D.8287;

  D.8287 = dl_iterate_phdr == 0B;
  D.8286 = (GC_bool) D.8287;
  return D.8286;
}


GC_register_dynamic_libraries ()
{
  int D.8289;
  unsigned int D.8292;
  unsigned int D.8295;
  unsigned int D.8296;
  unsigned int D.8297;
  unsigned int D.8298;
  unsigned int D.8300;
  sizetype D.8301;
  unsigned int D.8302;
  char * D.8303;
  short unsigned int D.8304;
  int D.8305;
  struct link_map * lm;

  D.8289 = GC_register_dynamic_libraries_dl_iterate_phdr ();
  if (D.8289 != 0) goto <D.8290>; else goto <D.8291>;
  <D.8290>:
  return;
  <D.8291>:
  lm = GC_FirstDLOpenedLinkMap ();
  lm = GC_FirstDLOpenedLinkMap ();
  goto <D.8256>;
  <D.8255>:
  {
    struct Elf32_Ehdr * e;
    struct Elf32_Phdr * p;
    long unsigned int offset;
    char * start;
    register int i;

    D.8292 = lm->l_addr;
    e = (struct Elf32_Ehdr *) D.8292;
    if (e == 0B) goto <D.8293>; else goto <D.8294>;
    <D.8293>:
    // predicted unlikely by continue predictor.
    goto <D.8248>;
    <D.8294>:
    D.8295 = e->e_phoff;
    p = e + D.8295;
    offset = lm->l_addr;
    i = 0;
    goto <D.8253>;
    <D.8252>:
    D.8296 = p->p_type;
    switch (D.8296) <default: <D.8251>, case 1: <D.8249>>
    <D.8249>:
    D.8297 = p->p_flags;
    D.8298 = D.8297 & 2;
    if (D.8298 == 0) goto <D.8250>; else goto <D.8299>;
    <D.8299>:
    D.8300 = p->p_vaddr;
    D.8301 = D.8300 + offset;
    start = (char *) D.8301;
    D.8302 = p->p_memsz;
    D.8303 = start + D.8302;
    GC_add_roots_inner (start, D.8303, 1);
    goto <D.8250>;
    <D.8251>:
    goto <D.8250>;
    <D.8250>:
    i = i + 1;
    p = p + 32;
    <D.8253>:
    D.8304 = e->e_phnum;
    D.8305 = (int) D.8304;
    if (D.8305 > i) goto <D.8252>; else goto <D.8254>;
    <D.8254>:
  }
  <D.8248>:
  lm = lm->l_next;
  <D.8256>:
  if (lm != 0B) goto <D.8255>; else goto <D.8257>;
  <D.8257>:
}


GC_FirstDLOpenedLinkMap ()
{
  struct link_map * D.8310;
  struct link_map * cachedResult.2;
  unsigned int D.8316;
  struct r_debug * D.8317;
  struct link_map * cachedResult.3;
  struct Elf32_Dyn * dp;
  static struct link_map * cachedResult = 0B;

  if (&_DYNAMIC == 0B) goto <D.8308>; else goto <D.8309>;
  <D.8308>:
  D.8310 = 0B;
  return D.8310;
  <D.8309>:
  cachedResult.2 = cachedResult;
  if (cachedResult.2 == 0B) goto <D.8312>; else goto <D.8313>;
  <D.8312>:
  {
    int tag;

    dp = &_DYNAMIC;
    goto <D.8239>;
    <D.8238>:
    if (tag == 21) goto <D.8314>; else goto <D.8315>;
    <D.8314>:
    {
      struct link_map * lm;

      D.8316 = dp->d_un.d_ptr;
      D.8317 = (struct r_debug *) D.8316;
      lm = D.8317->r_map;
      if (lm != 0B) goto <D.8318>; else goto <D.8319>;
      <D.8318>:
      cachedResult.3 = lm->l_next;
      cachedResult = cachedResult.3;
      <D.8319>:
      goto <D.8237>;
    }
    <D.8315>:
    dp = dp + 8;
    <D.8239>:
    tag = dp->d_tag;
    if (tag != 0) goto <D.8238>; else goto <D.8237>;
    <D.8237>:
  }
  <D.8313>:
  D.8310 = cachedResult;
  return D.8310;
}


