GC_register_dynamic_libraries_dl_iterate_phdr ()
{
  int did_something.0;
  GC_bool D.5657;

  if (dl_iterate_phdr != 0B) goto <D.5652>; else goto <D.5653>;
  <D.5652>:
  {
    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.5655>; else goto <D.5656>;
        <D.5655>:
        GC_add_roots_inner (&__data_start, &_end, 1);
        <D.5656>:
        D.5657 = 1;
        return D.5657;
      }
    finally
      {
        did_something = {CLOBBER};
      }
  }
  <D.5653>:
  D.5657 = 0;
  return D.5657;
}


GC_register_dynlib_callback (struct dl_phdr_info * info, size_t size, void * ptr)
{
  int D.5662;
  unsigned int D.5663;
  unsigned int D.5664;
  unsigned int D.5665;
  unsigned int D.5667;
  unsigned int D.5668;
  sizetype D.5669;
  unsigned int D.5670;
  char * D.5671;
  short unsigned int D.5672;
  int D.5673;
  const struct Elf32_Phdr * p;
  char * start;
  register int i;

  if (size <= 13) goto <D.5660>; else goto <D.5661>;
  <D.5660>:
  D.5662 = -1;
  return D.5662;
  <D.5661>:
  p = info->dlpi_phdr;
  i = 0;
  goto <D.5616>;
  <D.5615>:
  D.5663 = p->p_type;
  switch (D.5663) <default: <D.5614>, case 1: <D.5612>>
  <D.5612>:
  D.5664 = p->p_flags;
  D.5665 = D.5664 & 2;
  if (D.5665 == 0) goto <D.5613>; else goto <D.5666>;
  <D.5666>:
  D.5667 = info->dlpi_addr;
  D.5668 = p->p_vaddr;
  D.5669 = D.5667 + D.5668;
  start = (char *) D.5669;
  D.5670 = p->p_memsz;
  D.5671 = start + D.5670;
  GC_add_roots_inner (start, D.5671, 1);
  goto <D.5613>;
  <D.5614>:
  goto <D.5613>;
  <D.5613>:
  i = i + 1;
  p = p + 32;
  <D.5616>:
  D.5672 = info->dlpi_phnum;
  D.5673 = (int) D.5672;
  if (D.5673 > i) goto <D.5615>; else goto <D.5617>;
  <D.5617>:
  MEM[(int *)ptr] = 1;
  D.5662 = 0;
  return D.5662;
}


GC_register_main_static_data ()
{
  GC_bool D.5676;
  _Bool D.5677;

  D.5677 = dl_iterate_phdr == 0B;
  D.5676 = (GC_bool) D.5677;
  return D.5676;
}


GC_register_dynamic_libraries ()
{
  int D.5679;
  unsigned int D.5682;
  unsigned int D.5685;
  unsigned int D.5686;
  unsigned int D.5687;
  unsigned int D.5688;
  unsigned int D.5690;
  sizetype D.5691;
  unsigned int D.5692;
  char * D.5693;
  short unsigned int D.5694;
  int D.5695;
  struct link_map * lm;

  D.5679 = GC_register_dynamic_libraries_dl_iterate_phdr ();
  if (D.5679 != 0) goto <D.5680>; else goto <D.5681>;
  <D.5680>:
  return;
  <D.5681>:
  lm = GC_FirstDLOpenedLinkMap ();
  lm = GC_FirstDLOpenedLinkMap ();
  goto <D.5649>;
  <D.5648>:
  {
    struct Elf32_Ehdr * e;
    struct Elf32_Phdr * p;
    long unsigned int offset;
    char * start;
    register int i;

    D.5682 = lm->l_addr;
    e = (struct Elf32_Ehdr *) D.5682;
    if (e == 0B) goto <D.5683>; else goto <D.5684>;
    <D.5683>:
    // predicted unlikely by continue predictor.
    goto <D.5641>;
    <D.5684>:
    D.5685 = e->e_phoff;
    p = e + D.5685;
    offset = lm->l_addr;
    i = 0;
    goto <D.5646>;
    <D.5645>:
    D.5686 = p->p_type;
    switch (D.5686) <default: <D.5644>, case 1: <D.5642>>
    <D.5642>:
    D.5687 = p->p_flags;
    D.5688 = D.5687 & 2;
    if (D.5688 == 0) goto <D.5643>; else goto <D.5689>;
    <D.5689>:
    D.5690 = p->p_vaddr;
    D.5691 = D.5690 + offset;
    start = (char *) D.5691;
    D.5692 = p->p_memsz;
    D.5693 = start + D.5692;
    GC_add_roots_inner (start, D.5693, 1);
    goto <D.5643>;
    <D.5644>:
    goto <D.5643>;
    <D.5643>:
    i = i + 1;
    p = p + 32;
    <D.5646>:
    D.5694 = e->e_phnum;
    D.5695 = (int) D.5694;
    if (D.5695 > i) goto <D.5645>; else goto <D.5647>;
    <D.5647>:
  }
  <D.5641>:
  lm = lm->l_next;
  <D.5649>:
  if (lm != 0B) goto <D.5648>; else goto <D.5650>;
  <D.5650>:
}


GC_FirstDLOpenedLinkMap ()
{
  struct link_map * D.5700;
  struct link_map * cachedResult.1;
  unsigned int D.5706;
  struct r_debug * D.5707;
  struct link_map * cachedResult.2;
  struct Elf32_Dyn * dp;
  static struct link_map * cachedResult = 0B;

  if (&_DYNAMIC == 0B) goto <D.5698>; else goto <D.5699>;
  <D.5698>:
  D.5700 = 0B;
  return D.5700;
  <D.5699>:
  cachedResult.1 = cachedResult;
  if (cachedResult.1 == 0B) goto <D.5702>; else goto <D.5703>;
  <D.5702>:
  {
    int tag;

    dp = &_DYNAMIC;
    goto <D.5632>;
    <D.5631>:
    if (tag == 21) goto <D.5704>; else goto <D.5705>;
    <D.5704>:
    {
      struct link_map * lm;

      D.5706 = dp->d_un.d_ptr;
      D.5707 = (struct r_debug *) D.5706;
      lm = D.5707->r_map;
      if (lm != 0B) goto <D.5708>; else goto <D.5709>;
      <D.5708>:
      cachedResult.2 = lm->l_next;
      cachedResult = cachedResult.2;
      <D.5709>:
      goto <D.5630>;
    }
    <D.5705>:
    dp = dp + 8;
    <D.5632>:
    tag = dp->d_tag;
    if (tag != 0) goto <D.5631>; else goto <D.5630>;
    <D.5630>:
  }
  <D.5703>:
  D.5700 = cachedResult;
  return D.5700;
}


