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

  if (dl_iterate_phdr != 0B) goto <D.5717>; else goto <D.5718>;
  <D.5717>:
  {
    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.5720>; else goto <D.5721>;
        <D.5720>:
        GC_data_start.1 = GC_data_start;
        GC_add_roots_inner (GC_data_start.1, &_end, 1);
        <D.5721>:
        D.5723 = 1;
        return D.5723;
      }
    finally
      {
        did_something = {CLOBBER};
      }
  }
  <D.5718>:
  D.5723 = 0;
  return D.5723;
}


GC_register_dynlib_callback (struct dl_phdr_info * info, size_t size, void * ptr)
{
  int D.5728;
  unsigned int D.5729;
  unsigned int D.5730;
  unsigned int D.5731;
  unsigned int D.5733;
  unsigned int D.5734;
  sizetype D.5735;
  unsigned int D.5736;
  char * D.5737;
  short unsigned int D.5738;
  int D.5739;
  const struct Elf32_Phdr * p;
  char * start;
  register int i;

  if (size <= 13) goto <D.5726>; else goto <D.5727>;
  <D.5726>:
  D.5728 = -1;
  return D.5728;
  <D.5727>:
  p = info->dlpi_phdr;
  i = 0;
  goto <D.5681>;
  <D.5680>:
  D.5729 = p->p_type;
  switch (D.5729) <default: <D.5679>, case 1: <D.5677>>
  <D.5677>:
  D.5730 = p->p_flags;
  D.5731 = D.5730 & 2;
  if (D.5731 == 0) goto <D.5678>; else goto <D.5732>;
  <D.5732>:
  D.5733 = info->dlpi_addr;
  D.5734 = p->p_vaddr;
  D.5735 = D.5733 + D.5734;
  start = (char *) D.5735;
  D.5736 = p->p_memsz;
  D.5737 = start + D.5736;
  GC_add_roots_inner (start, D.5737, 1);
  goto <D.5678>;
  <D.5679>:
  goto <D.5678>;
  <D.5678>:
  i = i + 1;
  p = p + 32;
  <D.5681>:
  D.5738 = info->dlpi_phnum;
  D.5739 = (int) D.5738;
  if (D.5739 > i) goto <D.5680>; else goto <D.5682>;
  <D.5682>:
  MEM[(int *)ptr] = 1;
  D.5728 = 0;
  return D.5728;
}


GC_register_main_static_data ()
{
  GC_bool D.5742;
  _Bool D.5743;

  D.5743 = dl_iterate_phdr == 0B;
  D.5742 = (GC_bool) D.5743;
  return D.5742;
}


GC_register_dynamic_libraries ()
{
  int D.5745;
  unsigned int D.5748;
  unsigned int D.5751;
  unsigned int D.5752;
  unsigned int D.5753;
  unsigned int D.5754;
  unsigned int D.5756;
  sizetype D.5757;
  unsigned int D.5758;
  char * D.5759;
  short unsigned int D.5760;
  int D.5761;
  struct link_map * lm;

  D.5745 = GC_register_dynamic_libraries_dl_iterate_phdr ();
  if (D.5745 != 0) goto <D.5746>; else goto <D.5747>;
  <D.5746>:
  return;
  <D.5747>:
  lm = GC_FirstDLOpenedLinkMap ();
  lm = GC_FirstDLOpenedLinkMap ();
  goto <D.5714>;
  <D.5713>:
  {
    struct Elf32_Ehdr * e;
    struct Elf32_Phdr * p;
    long unsigned int offset;
    char * start;
    register int i;

    D.5748 = lm->l_addr;
    e = (struct Elf32_Ehdr *) D.5748;
    if (e == 0B) goto <D.5749>; else goto <D.5750>;
    <D.5749>:
    // predicted unlikely by continue predictor.
    goto <D.5706>;
    <D.5750>:
    D.5751 = e->e_phoff;
    p = e + D.5751;
    offset = lm->l_addr;
    i = 0;
    goto <D.5711>;
    <D.5710>:
    D.5752 = p->p_type;
    switch (D.5752) <default: <D.5709>, case 1: <D.5707>>
    <D.5707>:
    D.5753 = p->p_flags;
    D.5754 = D.5753 & 2;
    if (D.5754 == 0) goto <D.5708>; else goto <D.5755>;
    <D.5755>:
    D.5756 = p->p_vaddr;
    D.5757 = D.5756 + offset;
    start = (char *) D.5757;
    D.5758 = p->p_memsz;
    D.5759 = start + D.5758;
    GC_add_roots_inner (start, D.5759, 1);
    goto <D.5708>;
    <D.5709>:
    goto <D.5708>;
    <D.5708>:
    i = i + 1;
    p = p + 32;
    <D.5711>:
    D.5760 = e->e_phnum;
    D.5761 = (int) D.5760;
    if (D.5761 > i) goto <D.5710>; else goto <D.5712>;
    <D.5712>:
  }
  <D.5706>:
  lm = lm->l_next;
  <D.5714>:
  if (lm != 0B) goto <D.5713>; else goto <D.5715>;
  <D.5715>:
}


GC_FirstDLOpenedLinkMap ()
{
  struct link_map * D.5766;
  struct link_map * cachedResult.2;
  unsigned int D.5772;
  struct r_debug * D.5773;
  struct link_map * cachedResult.3;
  struct Elf32_Dyn * dp;
  static struct link_map * cachedResult = 0B;

  if (&_DYNAMIC == 0B) goto <D.5764>; else goto <D.5765>;
  <D.5764>:
  D.5766 = 0B;
  return D.5766;
  <D.5765>:
  cachedResult.2 = cachedResult;
  if (cachedResult.2 == 0B) goto <D.5768>; else goto <D.5769>;
  <D.5768>:
  {
    int tag;

    dp = &_DYNAMIC;
    goto <D.5697>;
    <D.5696>:
    if (tag == 21) goto <D.5770>; else goto <D.5771>;
    <D.5770>:
    {
      struct link_map * lm;

      D.5772 = dp->d_un.d_ptr;
      D.5773 = (struct r_debug *) D.5772;
      lm = D.5773->r_map;
      if (lm != 0B) goto <D.5774>; else goto <D.5775>;
      <D.5774>:
      cachedResult.3 = lm->l_next;
      cachedResult = cachedResult.3;
      <D.5775>:
      goto <D.5695>;
    }
    <D.5771>:
    dp = dp + 8;
    <D.5697>:
    tag = dp->d_tag;
    if (tag != 0) goto <D.5696>; else goto <D.5695>;
    <D.5695>:
  }
  <D.5769>:
  D.5766 = cachedResult;
  return D.5766;
}


