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

  if (dl_iterate_phdr != 0B) goto <D.6185>; else goto <D.6186>;
  <D.6185>:
  {
    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.6188>; else goto <D.6189>;
        <D.6188>:
        GC_add_roots_inner (&__data_start, &_end, 1);
        <D.6189>:
        D.6190 = 1;
        return D.6190;
      }
    finally
      {
        did_something = {CLOBBER};
      }
  }
  <D.6186>:
  D.6190 = 0;
  return D.6190;
}


GC_register_dynlib_callback (struct dl_phdr_info * info, size_t size, void * ptr)
{
  int D.6195;
  unsigned int D.6196;
  unsigned int D.6197;
  unsigned int D.6198;
  long unsigned int D.6200;
  long unsigned int D.6201;
  sizetype D.6202;
  long unsigned int D.6203;
  char * D.6204;
  short unsigned int D.6205;
  int D.6206;
  const struct Elf64_Phdr * p;
  char * start;
  register int i;

  if (size <= 25) goto <D.6193>; else goto <D.6194>;
  <D.6193>:
  D.6195 = -1;
  return D.6195;
  <D.6194>:
  p = info->dlpi_phdr;
  i = 0;
  goto <D.6149>;
  <D.6148>:
  D.6196 = p->p_type;
  switch (D.6196) <default: <D.6147>, case 1: <D.6145>>
  <D.6145>:
  D.6197 = p->p_flags;
  D.6198 = D.6197 & 2;
  if (D.6198 == 0) goto <D.6146>; else goto <D.6199>;
  <D.6199>:
  D.6200 = info->dlpi_addr;
  D.6201 = p->p_vaddr;
  D.6202 = D.6200 + D.6201;
  start = (char *) D.6202;
  D.6203 = p->p_memsz;
  D.6204 = start + D.6203;
  GC_add_roots_inner (start, D.6204, 1);
  goto <D.6146>;
  <D.6147>:
  goto <D.6146>;
  <D.6146>:
  i = i + 1;
  p = p + 56;
  <D.6149>:
  D.6205 = info->dlpi_phnum;
  D.6206 = (int) D.6205;
  if (D.6206 > i) goto <D.6148>; else goto <D.6150>;
  <D.6150>:
  MEM[(int *)ptr] = 1;
  D.6195 = 0;
  return D.6195;
}


GC_register_main_static_data ()
{
  GC_bool D.6209;
  _Bool D.6210;

  D.6210 = dl_iterate_phdr == 0B;
  D.6209 = (GC_bool) D.6210;
  return D.6209;
}


GC_register_dynamic_libraries ()
{
  int D.6212;
  long unsigned int D.6215;
  long unsigned int D.6218;
  unsigned int D.6219;
  unsigned int D.6220;
  unsigned int D.6221;
  long unsigned int D.6223;
  sizetype D.6224;
  long unsigned int D.6225;
  char * D.6226;
  short unsigned int D.6227;
  int D.6228;
  struct link_map * lm;

  D.6212 = GC_register_dynamic_libraries_dl_iterate_phdr ();
  if (D.6212 != 0) goto <D.6213>; else goto <D.6214>;
  <D.6213>:
  return;
  <D.6214>:
  lm = GC_FirstDLOpenedLinkMap ();
  lm = GC_FirstDLOpenedLinkMap ();
  goto <D.6182>;
  <D.6181>:
  {
    struct Elf64_Ehdr * e;
    struct Elf64_Phdr * p;
    long unsigned int offset;
    char * start;
    register int i;

    D.6215 = lm->l_addr;
    e = (struct Elf64_Ehdr *) D.6215;
    if (e == 0B) goto <D.6216>; else goto <D.6217>;
    <D.6216>:
    // predicted unlikely by continue predictor.
    goto <D.6174>;
    <D.6217>:
    D.6218 = e->e_phoff;
    p = e + D.6218;
    offset = lm->l_addr;
    i = 0;
    goto <D.6179>;
    <D.6178>:
    D.6219 = p->p_type;
    switch (D.6219) <default: <D.6177>, case 1: <D.6175>>
    <D.6175>:
    D.6220 = p->p_flags;
    D.6221 = D.6220 & 2;
    if (D.6221 == 0) goto <D.6176>; else goto <D.6222>;
    <D.6222>:
    D.6223 = p->p_vaddr;
    D.6224 = D.6223 + offset;
    start = (char *) D.6224;
    D.6225 = p->p_memsz;
    D.6226 = start + D.6225;
    GC_add_roots_inner (start, D.6226, 1);
    goto <D.6176>;
    <D.6177>:
    goto <D.6176>;
    <D.6176>:
    i = i + 1;
    p = p + 56;
    <D.6179>:
    D.6227 = e->e_phnum;
    D.6228 = (int) D.6227;
    if (D.6228 > i) goto <D.6178>; else goto <D.6180>;
    <D.6180>:
  }
  <D.6174>:
  lm = lm->l_next;
  <D.6182>:
  if (lm != 0B) goto <D.6181>; else goto <D.6183>;
  <D.6183>:
}


GC_FirstDLOpenedLinkMap ()
{
  struct link_map * D.6233;
  struct link_map * cachedResult.1;
  long unsigned int D.6239;
  struct r_debug * D.6240;
  struct link_map * cachedResult.2;
  long int D.6244;
  struct Elf64_Dyn * dp;
  static struct link_map * cachedResult = 0B;

  if (&_DYNAMIC == 0B) goto <D.6231>; else goto <D.6232>;
  <D.6231>:
  D.6233 = 0B;
  return D.6233;
  <D.6232>:
  cachedResult.1 = cachedResult;
  if (cachedResult.1 == 0B) goto <D.6235>; else goto <D.6236>;
  <D.6235>:
  {
    int tag;

    dp = &_DYNAMIC;
    goto <D.6165>;
    <D.6164>:
    if (tag == 21) goto <D.6237>; else goto <D.6238>;
    <D.6237>:
    {
      struct link_map * lm;

      D.6239 = dp->d_un.d_ptr;
      D.6240 = (struct r_debug *) D.6239;
      lm = D.6240->r_map;
      if (lm != 0B) goto <D.6241>; else goto <D.6242>;
      <D.6241>:
      cachedResult.2 = lm->l_next;
      cachedResult = cachedResult.2;
      <D.6242>:
      goto <D.6163>;
    }
    <D.6238>:
    dp = dp + 16;
    <D.6165>:
    D.6244 = dp->d_tag;
    tag = (int) D.6244;
    if (tag != 0) goto <D.6164>; else goto <D.6163>;
    <D.6163>:
  }
  <D.6236>:
  D.6233 = cachedResult;
  return D.6233;
}


