GC_invalidate_map (struct hdr * hhdr)
{
  map_entry_type * GC_invalid_map.0;
  char * D.4952;
  sizetype D.4955;
  map_entry_type * D.4956;
  unsigned int displ.1;
  register int displ;

  GC_invalid_map.0 = GC_invalid_map;
  if (GC_invalid_map.0 == 0B) goto <D.4950>; else goto <D.4951>;
  <D.4950>:
  D.4952 = GC_scratch_alloc (4096);
  GC_invalid_map = D.4952;
  GC_invalid_map.0 = GC_invalid_map;
  if (GC_invalid_map.0 == 0B) goto <D.4953>; else goto <D.4954>;
  <D.4953>:
  GC_err_puts ("Cant initialize GC_invalid_map: insufficient memory\n");
  exit (1);
  <D.4954>:
  displ = 0;
  goto <D.4914>;
  <D.4913>:
  GC_invalid_map.0 = GC_invalid_map;
  D.4955 = (sizetype) displ;
  D.4956 = GC_invalid_map.0 + D.4955;
  *D.4956 = 255;
  displ = displ + 1;
  <D.4914>:
  displ.1 = (unsigned int) displ;
  if (displ.1 <= 4095) goto <D.4913>; else goto <D.4915>;
  <D.4915>:
  <D.4951>:
  GC_invalid_map.0 = GC_invalid_map;
  hhdr->hb_map = GC_invalid_map.0;
}


GC_register_displacement (GC_word offset)
{
  int D.4958;

  D.4958 = pthread_mutex_trylock (&GC_allocate_ml);
  if (D.4958 != 0) goto <D.4959>; else goto <D.4960>;
  <D.4959>:
  GC_lock ();
  <D.4960>:
  GC_register_displacement_inner (offset);
  pthread_mutex_unlock (&GC_allocate_ml);
}


GC_register_displacement_inner (word offset)
{
  char D.4965;
  long unsigned int D.4968;
  long unsigned int max_valid_offset.2;
  int GC_all_interior_pointers.3;
  map_entry_type * D.4975;
  map_entry_type * D.4980;
  unsigned char D.4981;
  long unsigned int D.4983;
  sizetype D.4986;
  map_entry_type * D.4987;
  register unsigned int i;
  word map_entry;

  map_entry = offset >> 3;
  if (offset > 2048) goto <D.4961>; else goto <D.4962>;
  <D.4961>:
  GC_abort ("Bad argument to GC_register_displacement");
  <D.4962>:
  if (map_entry > 253) goto <D.4963>; else goto <D.4964>;
  <D.4963>:
  map_entry = 254;
  <D.4964>:
  D.4965 = GC_arrays._valid_offsets[offset];
  if (D.4965 == 0) goto <D.4966>; else goto <D.4967>;
  <D.4966>:
  GC_arrays._valid_offsets[offset] = 1;
  D.4968 = offset & 7;
  GC_arrays._modws_valid_offsets[D.4968] = 1;
  max_valid_offset.2 = max_valid_offset;
  if (offset > max_valid_offset.2) goto <D.4970>; else goto <D.4971>;
  <D.4970>:
  max_valid_offset = offset;
  <D.4971>:
  GC_all_interior_pointers.3 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.3 == 0) goto <D.4973>; else goto <D.4974>;
  <D.4973>:
  i = 0;
  goto <D.4930>;
  <D.4929>:
  D.4975 = GC_arrays._obj_map[i];
  if (D.4975 != 0B) goto <D.4976>; else goto <D.4977>;
  <D.4976>:
  if (i == 0) goto <D.4978>; else goto <D.4979>;
  <D.4978>:
  D.4975 = GC_arrays._obj_map[i];
  D.4980 = D.4975 + offset;
  D.4981 = (unsigned char) map_entry;
  *D.4980 = D.4981;
  goto <D.4982>;
  <D.4979>:
  {
    register unsigned int j;
    register unsigned int lb;

    lb = i << 3;
    D.4983 = (long unsigned int) lb;
    if (D.4983 > offset) goto <D.4984>; else goto <D.4985>;
    <D.4984>:
    j = (unsigned int) offset;
    goto <D.4927>;
    <D.4926>:
    D.4975 = GC_arrays._obj_map[i];
    D.4986 = (sizetype) j;
    D.4987 = D.4975 + D.4986;
    D.4981 = (unsigned char) map_entry;
    *D.4987 = D.4981;
    j = j + lb;
    <D.4927>:
    if (j <= 4095) goto <D.4926>; else goto <D.4928>;
    <D.4928>:
    <D.4985>:
  }
  <D.4982>:
  <D.4977>:
  i = i + 1;
  <D.4930>:
  if (i <= 256) goto <D.4929>; else goto <D.4931>;
  <D.4931>:
  <D.4974>:
  <D.4967>:
}


GC_add_map_entry (word sz)
{
  map_entry_type * D.4990;
  GC_bool D.4993;
  int GC_all_interior_pointers.4;
  char D.5002;
  unsigned int D.5003;
  sizetype D.5006;
  map_entry_type * D.5007;
  unsigned char D.5008;
  long unsigned int D.5009;
  long unsigned int max_valid_offset.5;
  unsigned int D.5017;
  sizetype D.5018;
  map_entry_type * D.5019;
  unsigned int D.5020;
  unsigned int D.5021;
  long unsigned int D.5022;
  long unsigned int D.5023;
  long unsigned int D.5024;
  register unsigned int obj_start;
  register unsigned int displ;
  register map_entry_type * new_map;
  word map_entry;

  if (sz > 256) goto <D.4988>; else goto <D.4989>;
  <D.4988>:
  sz = 0;
  <D.4989>:
  D.4990 = GC_arrays._obj_map[sz];
  if (D.4990 != 0B) goto <D.4991>; else goto <D.4992>;
  <D.4991>:
  D.4993 = 1;
  return D.4993;
  <D.4992>:
  new_map = GC_scratch_alloc (4096);
  if (new_map == 0B) goto <D.4994>; else goto <D.4995>;
  <D.4994>:
  D.4993 = 0;
  return D.4993;
  <D.4995>:
  memset (new_map, 255, 4096);
  if (sz == 0) goto <D.4996>; else goto <D.4997>;
  <D.4996>:
  displ = 0;
  goto <D.4940>;
  <D.4939>:
  GC_all_interior_pointers.4 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.4 != 0) goto <D.4998>; else goto <D.5001>;
  <D.5001>:
  D.5002 = GC_arrays._valid_offsets[displ];
  if (D.5002 != 0) goto <D.4998>; else goto <D.4999>;
  <D.4998>:
  D.5003 = displ >> 3;
  map_entry = (word) D.5003;
  if (map_entry > 253) goto <D.5004>; else goto <D.5005>;
  <D.5004>:
  map_entry = 254;
  <D.5005>:
  D.5006 = (sizetype) displ;
  D.5007 = new_map + D.5006;
  D.5008 = (unsigned char) map_entry;
  *D.5007 = D.5008;
  <D.4999>:
  displ = displ + 1;
  <D.4940>:
  D.5009 = (long unsigned int) displ;
  max_valid_offset.5 = max_valid_offset;
  if (D.5009 <= max_valid_offset.5) goto <D.4939>; else goto <D.4941>;
  <D.4941>:
  goto <D.5011>;
  <D.4997>:
  obj_start = 0;
  goto <D.4946>;
  <D.4945>:
  displ = 0;
  goto <D.4943>;
  <D.4942>:
  GC_all_interior_pointers.4 = GC_all_interior_pointers;
  if (GC_all_interior_pointers.4 != 0) goto <D.5012>; else goto <D.5014>;
  <D.5014>:
  D.5002 = GC_arrays._valid_offsets[displ];
  if (D.5002 != 0) goto <D.5012>; else goto <D.5013>;
  <D.5012>:
  D.5003 = displ >> 3;
  map_entry = (word) D.5003;
  if (map_entry > 253) goto <D.5015>; else goto <D.5016>;
  <D.5015>:
  map_entry = 254;
  <D.5016>:
  D.5017 = obj_start + displ;
  D.5018 = (sizetype) D.5017;
  D.5019 = new_map + D.5018;
  D.5008 = (unsigned char) map_entry;
  *D.5019 = D.5008;
  <D.5013>:
  displ = displ + 1;
  <D.4943>:
  D.5009 = (long unsigned int) displ;
  max_valid_offset.5 = max_valid_offset;
  if (D.5009 <= max_valid_offset.5) goto <D.4942>; else goto <D.4944>;
  <D.4944>:
  D.5020 = (unsigned int) sz;
  D.5021 = D.5020 << 3;
  obj_start = D.5021 + obj_start;
  <D.4946>:
  D.5022 = (long unsigned int) obj_start;
  D.5023 = sz << 3;
  D.5024 = D.5022 + D.5023;
  if (D.5024 <= 4096) goto <D.4945>; else goto <D.4947>;
  <D.4947>:
  <D.5011>:
  GC_arrays._obj_map[sz] = new_map;
  D.4993 = 1;
  return D.4993;
}


__attribute__((__artificial__, __gnu_inline__, __always_inline__, __nothrow__, __leaf__))
memset (void * __dest, int __ch, size_t __len)
{
  void * D.5026;
  long unsigned int D.5027;

  D.5027 = __builtin_object_size (__dest, 0);
  D.5026 = __builtin___memset_chk (__dest, __ch, __len, D.5027);
  return D.5026;
}


