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

  if (dl_iterate_phdr != 0B) goto <D.6562>; else goto <D.6563>;
  <D.6562>:
  {
    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.6565>; else goto <D.6566>;
        <D.6565>:
        GC_data_start.1 = GC_data_start;
        GC_add_roots_inner (GC_data_start.1, &_end, 1);
        <D.6566>:
        D.6568 = 1;
        return D.6568;
      }
    finally
      {
        did_something = {CLOBBER};
      }
  }
  <D.6563>:
  D.6568 = 0;
  return D.6568;
}


GC_register_dynlib_callback (struct dl_phdr_info * info, size_t size, void * ptr)
{
  int D.6573;
  unsigned int D.6574;
  unsigned int D.6575;
  unsigned int D.6576;
  long unsigned int D.6578;
  long unsigned int D.6579;
  sizetype D.6580;
  long unsigned int D.6581;
  char * D.6582;
  short unsigned int D.6583;
  int D.6584;
  const struct Elf64_Phdr * p;
  char * start;
  register int i;

  if (size <= 25) goto <D.6571>; else goto <D.6572>;
  <D.6571>:
  D.6573 = -1;
  return D.6573;
  <D.6572>:
  p = info->dlpi_phdr;
  i = 0;
  goto <D.6526>;
  <D.6525>:
  D.6574 = p->p_type;
  switch (D.6574) <default: <D.6524>, case 1: <D.6522>>
  <D.6522>:
  D.6575 = p->p_flags;
  D.6576 = D.6575 & 2;
  if (D.6576 == 0) goto <D.6523>; else goto <D.6577>;
  <D.6577>:
  D.6578 = info->dlpi_addr;
  D.6579 = p->p_vaddr;
  D.6580 = D.6578 + D.6579;
  start = (char *) D.6580;
  D.6581 = p->p_memsz;
  D.6582 = start + D.6581;
  GC_add_roots_inner (start, D.6582, 1);
  goto <D.6523>;
  <D.6524>:
  goto <D.6523>;
  <D.6523>:
  i = i + 1;
  p = p + 56;
  <D.6526>:
  D.6583 = info->dlpi_phnum;
  D.6584 = (int) D.6583;
  if (D.6584 > i) goto <D.6525>; else goto <D.6527>;
  <D.6527>:
  MEM[(int *)ptr] = 1;
  D.6573 = 0;
  return D.6573;
}


GC_register_main_static_data ()
{
  GC_bool D.6587;
  _Bool D.6588;

  D.6588 = dl_iterate_phdr == 0B;
  D.6587 = (GC_bool) D.6588;
  return D.6587;
}


GC_register_dynamic_libraries ()
{
  int D.6590;
  long unsigned int D.6593;
  long unsigned int D.6596;
  unsigned int D.6597;
  unsigned int D.6598;
  unsigned int D.6599;
  long unsigned int D.6601;
  sizetype D.6602;
  long unsigned int D.6603;
  char * D.6604;
  short unsigned int D.6605;
  int D.6606;
  struct link_map * lm;

  D.6590 = GC_register_dynamic_libraries_dl_iterate_phdr ();
  if (D.6590 != 0) goto <D.6591>; else goto <D.6592>;
  <D.6591>:
  return;
  <D.6592>:
  lm = GC_FirstDLOpenedLinkMap ();
  lm = GC_FirstDLOpenedLinkMap ();
  goto <D.6559>;
  <D.6558>:
  {
    struct Elf64_Ehdr * e;
    struct Elf64_Phdr * p;
    long unsigned int offset;
    char * start;
    register int i;

    D.6593 = lm->l_addr;
    e = (struct Elf64_Ehdr *) D.6593;
    if (e == 0B) goto <D.6594>; else goto <D.6595>;
    <D.6594>:
    // predicted unlikely by continue predictor.
    goto <D.6551>;
    <D.6595>:
    D.6596 = e->e_phoff;
    p = e + D.6596;
    offset = lm->l_addr;
    i = 0;
    goto <D.6556>;
    <D.6555>:
    D.6597 = p->p_type;
    switch (D.6597) <default: <D.6554>, case 1: <D.6552>>
    <D.6552>:
    D.6598 = p->p_flags;
    D.6599 = D.6598 & 2;
    if (D.6599 == 0) goto <D.6553>; else goto <D.6600>;
    <D.6600>:
    D.6601 = p->p_vaddr;
    D.6602 = D.6601 + offset;
    start = (char *) D.6602;
    D.6603 = p->p_memsz;
    D.6604 = start + D.6603;
    GC_add_roots_inner (start, D.6604, 1);
    goto <D.6553>;
    <D.6554>:
    goto <D.6553>;
    <D.6553>:
    i = i + 1;
    p = p + 56;
    <D.6556>:
    D.6605 = e->e_phnum;
    D.6606 = (int) D.6605;
    if (D.6606 > i) goto <D.6555>; else goto <D.6557>;
    <D.6557>:
  }
  <D.6551>:
  lm = lm->l_next;
  <D.6559>:
  if (lm != 0B) goto <D.6558>; else goto <D.6560>;
  <D.6560>:
}


GC_FirstDLOpenedLinkMap ()
{
  struct link_map * D.6611;
  struct link_map * cachedResult.2;
  long unsigned int D.6617;
  struct r_debug * D.6618;
  struct link_map * cachedResult.3;
  long int D.6622;
  struct Elf64_Dyn * dp;
  static struct link_map * cachedResult = 0B;

  if (&_DYNAMIC == 0B) goto <D.6609>; else goto <D.6610>;
  <D.6609>:
  D.6611 = 0B;
  return D.6611;
  <D.6610>:
  cachedResult.2 = cachedResult;
  if (cachedResult.2 == 0B) goto <D.6613>; else goto <D.6614>;
  <D.6613>:
  {
    int tag;

    dp = &_DYNAMIC;
    goto <D.6542>;
    <D.6541>:
    if (tag == 21) goto <D.6615>; else goto <D.6616>;
    <D.6615>:
    {
      struct link_map * lm;

      D.6617 = dp->d_un.d_ptr;
      D.6618 = (struct r_debug *) D.6617;
      lm = D.6618->r_map;
      if (lm != 0B) goto <D.6619>; else goto <D.6620>;
      <D.6619>:
      cachedResult.3 = lm->l_next;
      cachedResult = cachedResult.3;
      <D.6620>:
      goto <D.6540>;
    }
    <D.6616>:
    dp = dp + 16;
    <D.6542>:
    D.6622 = dp->d_tag;
    tag = (int) D.6622;
    if (tag != 0) goto <D.6541>; else goto <D.6540>;
    <D.6540>:
  }
  <D.6614>:
  D.6611 = cachedResult;
  return D.6611;
}


