mono_profiler_startup (const char * desc)
{
  struct GHashTable * D.7229;
  int D.7232;
  const char * D.7234;
  char D.7235;
  const gchar * D.7237;
  gchar * D.7238;
  char * D.7239;
  char * D.7242;
  gchar * D.7243;
  struct MonoProfiler * prof;

  prof = monoeg_malloc0 (20);
  D.7229 = monoeg_g_hash_table_new (0B, 0B);
  prof->hash = D.7229;
  D.7232 = strncmp ("cov:", desc, 4);
  if (D.7232 == 0) goto <D.7233>; else goto <D.7230>;
  <D.7233>:
  D.7234 = desc + 4;
  D.7235 = *D.7234;
  if (D.7235 != 0) goto <D.7236>; else goto <D.7230>;
  <D.7236>:
  {
    char * cname;

    D.7237 = desc + 4;
    D.7238 = monoeg_strdup (D.7237);
    prof->assembly_name = D.7238;
    D.7239 = prof->assembly_name;
    cname = __builtin_strchr (D.7239, 47);
    if (cname != 0B) goto <D.7240>; else goto <D.7241>;
    <D.7240>:
    *cname = 0;
    D.7242 = cname + 1;
    prof->class_name = D.7242;
    <D.7241>:
  }
  goto <D.7231>;
  <D.7230>:
  D.7243 = monoeg_strdup ("mscorlib");
  prof->assembly_name = D.7243;
  <D.7231>:
  mono_profiler_install (prof, cov_shutdown);
  mono_profiler_install_enter_leave (cov_method_enter, cov_method_leave);
  mono_profiler_set_events (12288);
}


cov_method_leave (struct MonoProfiler * prof, struct MonoMethod * method)
{

}


cov_method_enter (struct MonoProfiler * prof, struct MonoMethod * method)
{
  struct GHashTable * D.7248;

  D.7248 = prof->hash;
  monoeg_g_hash_table_insert_replace (D.7248, method, 1B, 0);
}


cov_shutdown (struct MonoProfiler * prof)
{
  struct MonoAssembly * D.7249;
  char * D.7252;
  int D.7253;
  unsigned int D.7254;
  unsigned int D.7257;
  unsigned int D.7258;
  char * D.7261;
  char D.7264;
  const char * D.7267;
  char * D.7268;
  const char * D.7271;
  char * D.7272;
  struct GHashTable * D.7275;
  void * D.7276;
  int D.7279;
  struct MonoImage * image;
  struct MonoMethod * method;
  int i;
  char * name;

  mono_assembly_foreach (get_assembly, prof);
  D.7249 = prof->assembly;
  if (D.7249 == 0B) goto <D.7250>; else goto <D.7251>;
  <D.7250>:
  D.7252 = prof->assembly_name;
  monoeg_g_print ("Assembly \'%s\' was not loaded\n", D.7252);
  return;
  <D.7251>:
  D.7249 = prof->assembly;
  image = mono_assembly_get_image (D.7249);
  i = 1;
  goto <D.7202>;
  <D.7201>:
  {
    struct MonoClass * klass;

    D.7253 = i | 100663296;
    D.7254 = (unsigned int) D.7253;
    method = mono_get_method (image, D.7254, 0B);
    if (method == 0B) goto <D.7255>; else goto <D.7256>;
    <D.7255>:
    // predicted unlikely by continue predictor.
    goto <D.7200>;
    <D.7256>:
    D.7257 = mono_method_get_flags (method, 0B);
    D.7258 = D.7257 & 1024;
    if (D.7258 != 0) goto <D.7259>; else goto <D.7260>;
    <D.7259>:
    // predicted unlikely by continue predictor.
    goto <D.7200>;
    <D.7260>:
    D.7261 = prof->class_name;
    if (D.7261 != 0B) goto <D.7262>; else goto <D.7263>;
    <D.7262>:
    D.7261 = prof->class_name;
    D.7264 = *D.7261;
    if (D.7264 != 0) goto <D.7265>; else goto <D.7266>;
    <D.7265>:
    klass = mono_method_get_class (method);
    D.7267 = mono_class_get_name (klass);
    D.7261 = prof->class_name;
    D.7268 = strstr (D.7267, D.7261);
    if (D.7268 == 0B) goto <D.7269>; else goto <D.7270>;
    <D.7269>:
    D.7271 = mono_class_get_namespace (klass);
    D.7261 = prof->class_name;
    D.7272 = strstr (D.7271, D.7261);
    if (D.7272 == 0B) goto <D.7273>; else goto <D.7274>;
    <D.7273>:
    // predicted unlikely by continue predictor.
    goto <D.7200>;
    <D.7274>:
    <D.7270>:
    <D.7266>:
    <D.7263>:
    D.7275 = prof->hash;
    D.7276 = monoeg_g_hash_table_lookup (D.7275, method);
    if (D.7276 != 0B) goto <D.7277>; else goto <D.7278>;
    <D.7277>:
    check_partial_coverage (prof, method);
    // predicted unlikely by continue predictor.
    goto <D.7200>;
    <D.7278>:
    name = mono_method_full_name (method, 1);
    monoeg_g_print ("Not covered: %s\n", name);
    monoeg_g_free (name);
  }
  <D.7200>:
  i = i + 1;
  <D.7202>:
  D.7279 = mono_image_get_table_rows (image, 6);
  if (D.7279 >= i) goto <D.7201>; else goto <D.7203>;
  <D.7203>:
}


get_assembly (struct MonoAssembly * ass, struct MonoProfiler * prof)
{
  int D.7177;
  char * D.7290;
  struct MonoImage * D.7291;
  const char * D.7292;

  {
    size_t __s1_len;
    size_t __s2_len;

    D.7290 = prof->assembly_name;
    D.7291 = mono_assembly_get_image (ass);
    D.7292 = mono_image_get_name (D.7291);
    D.7177 = __builtin_strcmp (D.7290, D.7292);
  }
  if (D.7177 == 0) goto <D.7293>; else goto <D.7294>;
  <D.7293>:
  prof->assembly = ass;
  <D.7294>:
}


check_partial_coverage (struct MonoProfiler * prof, struct MonoMethod * method)
{
  struct GList * D.7297;
  void * D.7300;
  struct GList * tmp;

  mono_profiler_coverage_get (prof, method, coverage_callback);
  D.7297 = prof->bb_coverage;
  if (D.7297 != 0B) goto <D.7298>; else goto <D.7299>;
  <D.7298>:
  {
    char * name;

    name = mono_method_full_name (method, 1);
    monoeg_g_print ("Partial coverage: %s\n", name);
    monoeg_g_free (name);
    tmp = prof->bb_coverage;
    goto <D.7190>;
    <D.7189>:
    D.7300 = tmp->data;
    monoeg_g_print ("\t%s\n", D.7300);
    D.7300 = tmp->data;
    monoeg_g_free (D.7300);
    tmp = tmp->next;
    <D.7190>:
    if (tmp != 0B) goto <D.7189>; else goto <D.7191>;
    <D.7191>:
    D.7297 = prof->bb_coverage;
    monoeg_g_list_free (D.7297);
    prof->bb_coverage = 0B;
  }
  <D.7299>:
}


coverage_callback (struct MonoProfiler * prof, const struct MonoProfileCoverageEntry * entry)
{
  int D.7302;
  const char * D.7305;
  int D.7308;
  int D.7309;
  int D.7310;
  struct GList * D.7312;
  struct GList * D.7313;
  char * cmsg;

  D.7302 = entry->counter;
  if (D.7302 != 0) goto <D.7303>; else goto <D.7304>;
  <D.7303>:
  return;
  <D.7304>:
  D.7305 = entry->filename;
  if (D.7305 != 0B) goto <D.7306>; else goto <D.7307>;
  <D.7306>:
  D.7308 = entry->iloffset;
  D.7305 = entry->filename;
  D.7309 = entry->line;
  D.7310 = entry->col;
  cmsg = monoeg_g_strdup_printf ("offset 0x%04x (%s: line: %d, col: %d)", D.7308, D.7305, D.7309, D.7310);
  goto <D.7311>;
  <D.7307>:
  D.7308 = entry->iloffset;
  cmsg = monoeg_g_strdup_printf ("offset 0x%04x", D.7308);
  <D.7311>:
  D.7312 = prof->bb_coverage;
  D.7313 = monoeg_g_list_append (D.7312, cmsg);
  prof->bb_coverage = D.7313;
}


monoeg_strdup (const gchar * str)
{
  gchar * D.7320;

  if (str != 0B) goto <D.7318>; else goto <D.7319>;
  <D.7318>:
  D.7320 = __strdup (str);
  return D.7320;
  <D.7319>:
  D.7320 = 0B;
  return D.7320;
}


