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

  if (dl_iterate_phdr != 0B) goto <D.6099>; else goto <D.6100>;
  <D.6099>:
  {
    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.6102>; else goto <D.6103>;
        <D.6102>:
        GC_data_start.1 = GC_data_start;
        GC_add_roots_inner (GC_data_start.1, &_end, 1);
        <D.6103>:
        D.6105 = 1;
        return D.6105;
      }
    finally
      {
        did_something = {CLOBBER};
      }
  }
  <D.6100>:
  D.6105 = 0;
  return D.6105;
}


GC_register_dynlib_callback (struct dl_phdr_info * info, size_t size, void * ptr)
{
  int D.6110;
  unsigned int D.6111;
  unsigned int D.6112;
  unsigned int D.6113;
  long unsigned int D.6115;
  long unsigned int D.6116;
  sizetype D.6117;
  long unsigned int D.6118;
  char * D.6119;
  short unsigned int D.6120;
  int D.6121;
  const struct Elf64_Phdr * p;
  char * start;
  register int i;

  if (size <= 25) goto <D.6108>; else goto <D.6109>;
  <D.6108>:
  D.6110 = -1;
  return D.6110;
  <D.6109>:
  p = info->dlpi_phdr;
  i = 0;
  goto <D.6063>;
  <D.6062>:
  D.6111 = p->p_type;
  switch (D.6111) <default: <D.6061>, case 1: <D.6059>>
  <D.6059>:
  D.6112 = p->p_flags;
  D.6113 = D.6112 & 2;
  if (D.6113 == 0) goto <D.6060>; else goto <D.6114>;
  <D.6114>:
  D.6115 = info->dlpi_addr;
  D.6116 = p->p_vaddr;
  D.6117 = D.6115 + D.6116;
  start = (char *) D.6117;
  D.6118 = p->p_memsz;
  D.6119 = start + D.6118;
  GC_add_roots_inner (start, D.6119, 1);
  goto <D.6060>;
  <D.6061>:
  goto <D.6060>;
  <D.6060>:
  i = i + 1;
  p = p + 56;
  <D.6063>:
  D.6120 = info->dlpi_phnum;
  D.6121 = (int) D.6120;
  if (D.6121 > i) goto <D.6062>; else goto <D.6064>;
  <D.6064>:
  MEM[(int *)ptr] = 1;
  D.6110 = 0;
  return D.6110;
}


GC_register_main_static_data ()
{
  GC_bool D.6124;
  _Bool D.6125;

  D.6125 = dl_iterate_phdr == 0B;
  D.6124 = (GC_bool) D.6125;
  return D.6124;
}


GC_register_dynamic_libraries ()
{
  int D.6127;
  long unsigned int D.6130;
  long unsigned int D.6133;
  unsigned int D.6134;
  unsigned int D.6135;
  unsigned int D.6136;
  long unsigned int D.6138;
  sizetype D.6139;
  long unsigned int D.6140;
  char * D.6141;
  short unsigned int D.6142;
  int D.6143;
  struct link_map * lm;

  D.6127 = GC_register_dynamic_libraries_dl_iterate_phdr ();
  if (D.6127 != 0) goto <D.6128>; else goto <D.6129>;
  <D.6128>:
  return;
  <D.6129>:
  lm = GC_FirstDLOpenedLinkMap ();
  lm = GC_FirstDLOpenedLinkMap ();
  goto <D.6096>;
  <D.6095>:
  {
    struct Elf64_Ehdr * e;
    struct Elf64_Phdr * p;
    long unsigned int offset;
    char * start;
    register int i;

    D.6130 = lm->l_addr;
    e = (struct Elf64_Ehdr *) D.6130;
    if (e == 0B) goto <D.6131>; else goto <D.6132>;
    <D.6131>:
    // predicted unlikely by continue predictor.
    goto <D.6088>;
    <D.6132>:
    D.6133 = e->e_phoff;
    p = e + D.6133;
    offset = lm->l_addr;
    i = 0;
    goto <D.6093>;
    <D.6092>:
    D.6134 = p->p_type;
    switch (D.6134) <default: <D.6091>, case 1: <D.6089>>
    <D.6089>:
    D.6135 = p->p_flags;
    D.6136 = D.6135 & 2;
    if (D.6136 == 0) goto <D.6090>; else goto <D.6137>;
    <D.6137>:
    D.6138 = p->p_vaddr;
    D.6139 = D.6138 + offset;
    start = (char *) D.6139;
    D.6140 = p->p_memsz;
    D.6141 = start + D.6140;
    GC_add_roots_inner (start, D.6141, 1);
    goto <D.6090>;
    <D.6091>:
    goto <D.6090>;
    <D.6090>:
    i = i + 1;
    p = p + 56;
    <D.6093>:
    D.6142 = e->e_phnum;
    D.6143 = (int) D.6142;
    if (D.6143 > i) goto <D.6092>; else goto <D.6094>;
    <D.6094>:
  }
  <D.6088>:
  lm = lm->l_next;
  <D.6096>:
  if (lm != 0B) goto <D.6095>; else goto <D.6097>;
  <D.6097>:
}


GC_FirstDLOpenedLinkMap ()
{
  struct link_map * D.6148;
  struct link_map * cachedResult.2;
  long unsigned int D.6154;
  struct r_debug * D.6155;
  struct link_map * cachedResult.3;
  long int D.6159;
  struct Elf64_Dyn * dp;
  static struct link_map * cachedResult = 0B;

  if (&_DYNAMIC == 0B) goto <D.6146>; else goto <D.6147>;
  <D.6146>:
  D.6148 = 0B;
  return D.6148;
  <D.6147>:
  cachedResult.2 = cachedResult;
  if (cachedResult.2 == 0B) goto <D.6150>; else goto <D.6151>;
  <D.6150>:
  {
    int tag;

    dp = &_DYNAMIC;
    goto <D.6079>;
    <D.6078>:
    if (tag == 21) goto <D.6152>; else goto <D.6153>;
    <D.6152>:
    {
      struct link_map * lm;

      D.6154 = dp->d_un.d_ptr;
      D.6155 = (struct r_debug *) D.6154;
      lm = D.6155->r_map;
      if (lm != 0B) goto <D.6156>; else goto <D.6157>;
      <D.6156>:
      cachedResult.3 = lm->l_next;
      cachedResult = cachedResult.3;
      <D.6157>:
      goto <D.6077>;
    }
    <D.6153>:
    dp = dp + 16;
    <D.6079>:
    D.6159 = dp->d_tag;
    tag = (int) D.6159;
    if (tag != 0) goto <D.6078>; else goto <D.6077>;
    <D.6077>:
  }
  <D.6151>:
  D.6148 = cachedResult;
  return D.6148;
}


