mono_counters_enable (int section_mask)
{
  int valid_mask.0;

  valid_mask.0 = section_mask & -256;
  valid_mask = valid_mask.0;
}


mono_counters_register (const char * name, int type, void * addr)
{
  int valid_mask.1;
  int D.5079;
  int set_mask.2;
  int set_mask.3;
  struct MonoCounter * counters.4;
  struct MonoCounter * D.5089;
  struct MonoCounter * counter;

  valid_mask.1 = valid_mask;
  D.5079 = type & valid_mask.1;
  if (D.5079 == 0) goto <D.5080>; else goto <D.5081>;
  <D.5080>:
  return;
  <D.5081>:
  counter = malloc (32);
  if (counter == 0B) goto <D.5082>; else goto <D.5083>;
  <D.5082>:
  return;
  <D.5083>:
  counter->name = name;
  counter->type = type;
  counter->addr = addr;
  counter->next = 0B;
  set_mask.2 = set_mask;
  set_mask.3 = set_mask.2 | type;
  set_mask = set_mask.3;
  counters.4 = counters;
  if (counters.4 != 0B) goto <D.5087>; else goto <D.5088>;
  <D.5087>:
  {
    struct MonoCounter * item;

    item = counters;
    goto <D.5000>;
    <D.4999>:
    item = item->next;
    <D.5000>:
    D.5089 = item->next;
    if (D.5089 != 0B) goto <D.4999>; else goto <D.5001>;
    <D.5001>:
    item->next = counter;
  }
  goto <D.5090>;
  <D.5088>:
  counters = counter;
  <D.5090>:
}


mono_counters_dump (int section_mask, struct FILE * outfile)
{
  int valid_mask.5;
  struct MonoCounter * counters.6;
  int D.5096;
  int set_mask.7;
  int D.5100;
  const char[10] * D.5103;
  int i;
  int j;

  valid_mask.5 = valid_mask;
  section_mask = section_mask & valid_mask.5;
  counters.6 = counters;
  if (counters.6 == 0B) goto <D.5094>; else goto <D.5095>;
  <D.5094>:
  return;
  <D.5095>:
  j = 0;
  i = 256;
  goto <D.5052>;
  <D.5051>:
  D.5096 = section_mask & i;
  if (D.5096 != 0) goto <D.5097>; else goto <D.5098>;
  <D.5097>:
  set_mask.7 = set_mask;
  D.5100 = set_mask.7 & i;
  if (D.5100 != 0) goto <D.5101>; else goto <D.5102>;
  <D.5101>:
  D.5103 = &section_names[j];
  fprintf (outfile, "\n%s statistics\n", D.5103);
  mono_counters_dump_section (i, outfile);
  <D.5102>:
  <D.5098>:
  j = j + 1;
  i = i << 1;
  <D.5052>:
  if (i <= 4096) goto <D.5051>; else goto <D.5053>;
  <D.5053>:
  fflush (outfile);
}


fprintf (struct FILE * restrict __stream, const char * restrict __fmt)
{
  int D.5105;

  D.5105 = __fprintf_chk (__stream, 1, __fmt, __builtin_va_arg_pack ());
  return D.5105;
}


mono_counters_dump_section (int section, struct FILE * outfile)
{
  int D.5107;
  int D.5108;
  struct MonoCounter * counter;

  counter = counters;
  goto <D.5043>;
  <D.5042>:
  D.5107 = counter->type;
  D.5108 = D.5107 & section;
  if (D.5108 != 0) goto <D.5109>; else goto <D.5110>;
  <D.5109>:
  dump_counter (counter, outfile);
  <D.5110>:
  counter = counter->next;
  <D.5043>:
  if (counter != 0B) goto <D.5042>; else goto <D.5044>;
  <D.5044>:
}


dump_counter (struct MonoCounter * counter, struct FILE * outfile)
{
  int D.5111;
  int D.5112;
  int D.5113;
  void * D.5116;
  int (*<Ta3b>) (void) D.5117;
  const char * D.5119;
  guint (*<Tea9>) (void) D.5122;
  gint64 (*<Teae>) (void) D.5126;
  guint64 (*<Teb3>) (void) D.5130;
  gssize (*<Teb8>) (void) D.5134;
  int D.5136;
  double (*<Tebb>) (void) D.5139;
  char * (*<Tebe>) (void) D.5143;
  double D.5148;
  double D.5149;
  int intval;
  guint uintval;
  gint64 int64val;
  guint64 uint64val;
  gssize wordval;
  double dval;
  const char * str;

  D.5111 = counter->type;
  D.5112 = D.5111 & 15;
  switch (D.5112) <default: <D.5150>, case 0: <D.5027>, case 1: <D.5029>, case 2: <D.5032>, case 3: <D.5030>, case 4: <D.5031>, case 5: <D.5033>, case 6: <D.5034>, case 7: <D.5035>>
  <D.5027>:
  D.5111 = counter->type;
  D.5113 = D.5111 & 128;
  if (D.5113 != 0) goto <D.5114>; else goto <D.5115>;
  <D.5114>:
  D.5116 = counter->addr;
  D.5117 = (int (*<Ta3b>) (void)) D.5116;
  intval = D.5117 ();
  goto <D.5118>;
  <D.5115>:
  D.5116 = counter->addr;
  intval = MEM[(int *)D.5116];
  <D.5118>:
  D.5119 = counter->name;
  fprintf (outfile, "%-36s: %d\n", D.5119, intval);
  goto <D.5028>;
  <D.5029>:
  D.5111 = counter->type;
  D.5113 = D.5111 & 128;
  if (D.5113 != 0) goto <D.5120>; else goto <D.5121>;
  <D.5120>:
  D.5116 = counter->addr;
  D.5122 = (guint (*<Tea9>) (void)) D.5116;
  uintval = D.5122 ();
  goto <D.5123>;
  <D.5121>:
  D.5116 = counter->addr;
  uintval = MEM[(guint *)D.5116];
  <D.5123>:
  D.5119 = counter->name;
  fprintf (outfile, "%-36s: %u\n", D.5119, uintval);
  goto <D.5028>;
  <D.5030>:
  D.5111 = counter->type;
  D.5113 = D.5111 & 128;
  if (D.5113 != 0) goto <D.5124>; else goto <D.5125>;
  <D.5124>:
  D.5116 = counter->addr;
  D.5126 = (gint64 (*<Teae>) (void)) D.5116;
  int64val = D.5126 ();
  goto <D.5127>;
  <D.5125>:
  D.5116 = counter->addr;
  int64val = MEM[(gint64 *)D.5116];
  <D.5127>:
  D.5119 = counter->name;
  fprintf (outfile, "%-36s: %lld\n", D.5119, int64val);
  goto <D.5028>;
  <D.5031>:
  D.5111 = counter->type;
  D.5113 = D.5111 & 128;
  if (D.5113 != 0) goto <D.5128>; else goto <D.5129>;
  <D.5128>:
  D.5116 = counter->addr;
  D.5130 = (guint64 (*<Teb3>) (void)) D.5116;
  uint64val = D.5130 ();
  goto <D.5131>;
  <D.5129>:
  D.5116 = counter->addr;
  uint64val = MEM[(guint64 *)D.5116];
  <D.5131>:
  D.5119 = counter->name;
  fprintf (outfile, "%-36s: %llu\n", D.5119, uint64val);
  goto <D.5028>;
  <D.5032>:
  D.5111 = counter->type;
  D.5113 = D.5111 & 128;
  if (D.5113 != 0) goto <D.5132>; else goto <D.5133>;
  <D.5132>:
  D.5116 = counter->addr;
  D.5134 = (gssize (*<Teb8>) (void)) D.5116;
  wordval = D.5134 ();
  goto <D.5135>;
  <D.5133>:
  D.5116 = counter->addr;
  wordval = MEM[(gssize *)D.5116];
  <D.5135>:
  D.5136 = (int) wordval;
  D.5119 = counter->name;
  fprintf (outfile, "%-36s: %d\n", D.5119, D.5136);
  goto <D.5028>;
  <D.5033>:
  D.5111 = counter->type;
  D.5113 = D.5111 & 128;
  if (D.5113 != 0) goto <D.5137>; else goto <D.5138>;
  <D.5137>:
  D.5116 = counter->addr;
  D.5139 = (double (*<Tebb>) (void)) D.5116;
  dval = D.5139 ();
  goto <D.5140>;
  <D.5138>:
  D.5116 = counter->addr;
  dval = MEM[(double *)D.5116];
  <D.5140>:
  D.5119 = counter->name;
  fprintf (outfile, "%-36s: %.4f\n", D.5119, dval);
  goto <D.5028>;
  <D.5034>:
  D.5111 = counter->type;
  D.5113 = D.5111 & 128;
  if (D.5113 != 0) goto <D.5141>; else goto <D.5142>;
  <D.5141>:
  D.5116 = counter->addr;
  D.5143 = (char * (*<Tebe>) (void)) D.5116;
  str = D.5143 ();
  goto <D.5144>;
  <D.5142>:
  D.5116 = counter->addr;
  str = MEM[(char * *)D.5116];
  <D.5144>:
  D.5119 = counter->name;
  fprintf (outfile, "%-36s: %s\n", D.5119, str);
  goto <D.5028>;
  <D.5035>:
  D.5111 = counter->type;
  D.5113 = D.5111 & 128;
  if (D.5113 != 0) goto <D.5145>; else goto <D.5146>;
  <D.5145>:
  D.5116 = counter->addr;
  D.5126 = (gint64 (*<Teae>) (void)) D.5116;
  int64val = D.5126 ();
  goto <D.5147>;
  <D.5146>:
  D.5116 = counter->addr;
  int64val = MEM[(gint64 *)D.5116];
  <D.5147>:
  D.5148 = (double) int64val;
  D.5149 = D.5148 / 1.0e+3;
  D.5119 = counter->name;
  fprintf (outfile, "%-36s: %.2f ms\n", D.5119, D.5149);
  goto <D.5028>;
  <D.5150>:
  <D.5028>:
}


mono_counters_cleanup ()
{
  struct MonoCounter * counter;

  counter = counters;
  goto <D.5060>;
  <D.5059>:
  {
    struct MonoCounter * tmp;

    tmp = counters;
    counter = counter->next;
    free (tmp);
  }
  <D.5060>:
  if (counter != 0B) goto <D.5059>; else goto <D.5061>;
  <D.5061>:
  counters = 0B;
}


mono_runtime_resource_check_limit (int resource_type, uintptr_t value)
{
  void (*<Te96>) (int, uintptr_t, int) limit_reached.8;
  int D.5154;
  int D.5155;
  long unsigned int D.5156;
  long unsigned int D.5159;

  limit_reached.8 = limit_reached;
  if (limit_reached.8 == 0B) goto <D.5152>; else goto <D.5153>;
  <D.5152>:
  return;
  <D.5153>:
  D.5154 = resource_type * 2;
  D.5155 = D.5154 + 1;
  D.5156 = resource_limits[D.5155];
  if (D.5156 < value) goto <D.5157>; else goto <D.5158>;
  <D.5157>:
  limit_reached.8 = limit_reached;
  limit_reached.8 (resource_type, value, 0);
  return;
  <D.5158>:
  D.5154 = resource_type * 2;
  D.5159 = resource_limits[D.5154];
  if (D.5159 < value) goto <D.5160>; else goto <D.5161>;
  <D.5160>:
  limit_reached.8 = limit_reached;
  limit_reached.8 (resource_type, value, 1);
  <D.5161>:
}


mono_runtime_resource_limit (int resource_type, uintptr_t soft_limit, uintptr_t hard_limit)
{
  unsigned int resource_type.9;
  int D.5166;
  int D.5169;
  int D.5170;

  resource_type.9 = (unsigned int) resource_type;
  if (resource_type.9 > 2) goto <D.5164>; else goto <D.5165>;
  <D.5164>:
  D.5166 = 0;
  return D.5166;
  <D.5165>:
  if (soft_limit > hard_limit) goto <D.5167>; else goto <D.5168>;
  <D.5167>:
  D.5166 = 0;
  return D.5166;
  <D.5168>:
  D.5169 = resource_type * 2;
  resource_limits[D.5169] = soft_limit;
  D.5169 = resource_type * 2;
  D.5170 = D.5169 + 1;
  resource_limits[D.5170] = hard_limit;
  D.5166 = 1;
  return D.5166;
}


mono_runtime_resource_set_callback (void (*MonoResourceCallback) (int, uintptr_t, int) callback)
{
  limit_reached = callback;
}


