GC_invalidate_map (struct hdr * hhdr)
{
  map_entry_type * GC_invalid_map.0;
  char * GC_invalid_map.1;
  sizetype D.4873;
  map_entry_type * D.4874;
  unsigned int displ.2;
  register int displ;

  GC_invalid_map.0 = GC_invalid_map;
  if (GC_invalid_map.0 == 0B) goto <D.4868>; else goto <D.4869>;
  <D.4868>:
  GC_invalid_map.1 = GC_scratch_alloc (4096);
  GC_invalid_map = GC_invalid_map.1;
  GC_invalid_map.0 = GC_invalid_map;
  if (GC_invalid_map.0 == 0B) goto <D.4871>; else goto <D.4872>;
  <D.4871>:
  GC_err_puts ("Cant initialize GC_invalid_map: insufficient memory\n");
  exit (1);
  <D.4872>:
  displ = 0;
  goto <D.4832>;
  <D.4831>:
  GC_invalid_map.0 = GC_invalid_map;
  D.4873 = (sizetype) displ;
  D.4874 = GC_invalid_map.0 + D.4873;
  *D.4874 = 255;
  displ = displ + 1;
  <D.4832>:
  displ.2 = (unsigned int) displ;
  if (displ.2 <= 4095) goto <D.4831>; else goto <D.4833>;
  <D.4833>:
  <D.4869>:
  GC_invalid_map.0 = GC_invalid_map;
  hhdr->hb_map = GC_invalid_map.0;
}


GC_register_displacement (GC_word offset)
{
  int D.4876;

  D.4876 = pthread_mutex_trylock (&GC_allocate_ml);
  if (D.4876 != 0) goto <D.4877>; else goto <D.4878>;
  <D.4877>:
  GC_lock ();
  <D.4878>:
  GC_register_displacement_inner (offset);
  pthread_mutex_unlock (&GC_allocate_ml);
}


GC_register_displacement_inner (word offset)
{
  char D.4883;
  long unsigned int D.4886;
  long unsigned int max_valid_offset.3;
  int GC_all_interior_pointers.4;
  map_entry_type * D.4893;
  map_entry_type * D.4898;
  unsigned char D.4899;
  long unsigned int D.4901;
  sizetype D.4904;
  map_entry_type * D.4905;
  register unsigned int i;
  word map_entry;

  map_entry = offset >> 3;
  if (offset > 2048) goto <D.4879>; else goto <D.4880>;
  <D.4879>:
  GC_abort ("Bad argument to GC_register_displacement");
  <D.4880>:
  if (map_entry > 253) goto <D.4881>; else goto <D.4882>;
  <D.4881>:
  map_entry = 254;
  <D.4882>:
  D.4883 = GC_arrays._valid_offsets[offset];
  if (D.4883 == 0) goto <D.4884>; else goto <D.4885>;
  <D.4884>:
  GC_arrays._valid_offsets[offset] = 1;
  D.4886 = offset & 7;
  GC_arrays._modws_valid_offsets[D.4886] = 1;
  max_valid_offset.3 = max_valid_offset;
  if (offset > max_valid_offset.3) goto <D.4888>; else goto <D.4889>;
  <D.4888>:
  max_valid_offset = offset;
  <D.4889>:
  GC_all_interior_pointers.4 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.4 == 0) goto <D.4891>; else goto <D.4892>;
  <D.4891>:
  i = 0;
  goto <D.4848>;
  <D.4847>:
  D.4893 = GC_arrays._obj_map[i];
  if (D.4893 != 0B) goto <D.4894>; else goto <D.4895>;
  <D.4894>:
  if (i == 0) goto <D.4896>; else goto <D.4897>;
  <D.4896>:
  D.4893 = GC_arrays._obj_map[i];
  D.4898 = D.4893 + offset;
  D.4899 = (unsigned char) map_entry;
  *D.4898 = D.4899;
  goto <D.4900>;
  <D.4897>:
  {
    register unsigned int j;
    register unsigned int lb;

    lb = i << 3;
    D.4901 = (long unsigned int) lb;
    if (D.4901 > offset) goto <D.4902>; else goto <D.4903>;
    <D.4902>:
    j = (unsigned int) offset;
    goto <D.4845>;
    <D.4844>:
    D.4893 = GC_arrays._obj_map[i];
    D.4904 = (sizetype) j;
    D.4905 = D.4893 + D.4904;
    D.4899 = (unsigned char) map_entry;
    *D.4905 = D.4899;
    j = j + lb;
    <D.4845>:
    if (j <= 4095) goto <D.4844>; else goto <D.4846>;
    <D.4846>:
    <D.4903>:
  }
  <D.4900>:
  <D.4895>:
  i = i + 1;
  <D.4848>:
  if (i <= 256) goto <D.4847>; else goto <D.4849>;
  <D.4849>:
  <D.4892>:
  <D.4885>:
}


GC_add_map_entry (word sz)
{
  map_entry_type * D.4908;
  GC_bool D.4911;
  int GC_all_interior_pointers.5;
  char D.4920;
  unsigned int D.4921;
  sizetype D.4924;
  map_entry_type * D.4925;
  unsigned char D.4926;
  long unsigned int D.4927;
  long unsigned int max_valid_offset.6;
  unsigned int D.4935;
  sizetype D.4936;
  map_entry_type * D.4937;
  unsigned int D.4938;
  unsigned int D.4939;
  long unsigned int D.4940;
  long unsigned int D.4941;
  long unsigned int D.4942;
  register unsigned int obj_start;
  register unsigned int displ;
  register map_entry_type * new_map;
  word map_entry;

  if (sz > 256) goto <D.4906>; else goto <D.4907>;
  <D.4906>:
  sz = 0;
  <D.4907>:
  D.4908 = GC_arrays._obj_map[sz];
  if (D.4908 != 0B) goto <D.4909>; else goto <D.4910>;
  <D.4909>:
  D.4911 = 1;
  return D.4911;
  <D.4910>:
  new_map = GC_scratch_alloc (4096);
  if (new_map == 0B) goto <D.4912>; else goto <D.4913>;
  <D.4912>:
  D.4911 = 0;
  return D.4911;
  <D.4913>:
  memset (new_map, 255, 4096);
  if (sz == 0) goto <D.4914>; else goto <D.4915>;
  <D.4914>:
  displ = 0;
  goto <D.4858>;
  <D.4857>:
  GC_all_interior_pointers.5 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.5 != 0) goto <D.4916>; else goto <D.4919>;
  <D.4919>:
  D.4920 = GC_arrays._valid_offsets[displ];
  if (D.4920 != 0) goto <D.4916>; else goto <D.4917>;
  <D.4916>:
  D.4921 = displ >> 3;
  map_entry = (word) D.4921;
  if (map_entry > 253) goto <D.4922>; else goto <D.4923>;
  <D.4922>:
  map_entry = 254;
  <D.4923>:
  D.4924 = (sizetype) displ;
  D.4925 = new_map + D.4924;
  D.4926 = (unsigned char) map_entry;
  *D.4925 = D.4926;
  <D.4917>:
  displ = displ + 1;
  <D.4858>:
  D.4927 = (long unsigned int) displ;
  max_valid_offset.6 = max_valid_offset;
  if (D.4927 <= max_valid_offset.6) goto <D.4857>; else goto <D.4859>;
  <D.4859>:
  goto <D.4929>;
  <D.4915>:
  obj_start = 0;
  goto <D.4864>;
  <D.4863>:
  displ = 0;
  goto <D.4861>;
  <D.4860>:
  GC_all_interior_pointers.5 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.5 != 0) goto <D.4930>; else goto <D.4932>;
  <D.4932>:
  D.4920 = GC_arrays._valid_offsets[displ];
  if (D.4920 != 0) goto <D.4930>; else goto <D.4931>;
  <D.4930>:
  D.4921 = displ >> 3;
  map_entry = (word) D.4921;
  if (map_entry > 253) goto <D.4933>; else goto <D.4934>;
  <D.4933>:
  map_entry = 254;
  <D.4934>:
  D.4935 = obj_start + displ;
  D.4936 = (sizetype) D.4935;
  D.4937 = new_map + D.4936;
  D.4926 = (unsigned char) map_entry;
  *D.4937 = D.4926;
  <D.4931>:
  displ = displ + 1;
  <D.4861>:
  D.4927 = (long unsigned int) displ;
  max_valid_offset.6 = max_valid_offset;
  if (D.4927 <= max_valid_offset.6) goto <D.4860>; else goto <D.4862>;
  <D.4862>:
  D.4938 = (unsigned int) sz;
  D.4939 = D.4938 << 3;
  obj_start = D.4939 + obj_start;
  <D.4864>:
  D.4940 = (long unsigned int) obj_start;
  D.4941 = sz << 3;
  D.4942 = D.4940 + D.4941;
  if (D.4942 <= 4096) goto <D.4863>; else goto <D.4865>;
  <D.4865>:
  <D.4929>:
  GC_arrays._obj_map[sz] = new_map;
  D.4911 = 1;
  return D.4911;
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.4946;
  int D.4951;
  void * D.4953;
  long unsigned int D.4954;

  D.4946 = __builtin_constant_p (__len);
  if (D.4946 != 0) goto <D.4947>; else goto <D.4948>;
  <D.4947>:
  if (__len == 0) goto <D.4949>; else goto <D.4950>;
  <D.4949>:
  D.4951 = __builtin_constant_p (__ch);
  if (D.4951 == 0) goto <D.4944>; else goto <D.4952>;
  <D.4952>:
  if (__ch != 0) goto <D.4944>; else goto <D.4945>;
  <D.4944>:
  __warn_memset_zero_len ();
  D.4953 = __dest;
  return D.4953;
  <D.4945>:
  <D.4950>:
  <D.4948>:
  D.4954 = __builtin_object_size (__dest, 0);
  D.4953 = __builtin___memset_chk (__dest, __ch, __len, D.4954);
  return D.4953;
}


