mono_profiler_startup (const char * desc)
{
  struct GHashTable * D.7209;
  int D.7212;
  const char * D.7214;
  char D.7215;
  const gchar * D.7217;
  gchar * D.7218;
  char * D.7219;
  char * D.7222;
  gchar * D.7223;
  struct MonoProfiler * prof;

  prof = monoeg_malloc0 (20);
  D.7209 = monoeg_g_hash_table_new (0B, 0B);
  prof->hash = D.7209;
  D.7212 = strncmp ("cov:", desc, 4);
  if (D.7212 == 0) goto <D.7213>; else goto <D.7210>;
  <D.7213>:
  D.7214 = desc + 4;
  D.7215 = *D.7214;
  if (D.7215 != 0) goto <D.7216>; else goto <D.7210>;
  <D.7216>:
  {
    char * cname;

    D.7217 = desc + 4;
    D.7218 = monoeg_strdup (D.7217);
    prof->assembly_name = D.7218;
    D.7219 = prof->assembly_name;
    cname = __builtin_strchr (D.7219, 47);
    if (cname != 0B) goto <D.7220>; else goto <D.7221>;
    <D.7220>:
    *cname = 0;
    D.7222 = cname + 1;
    prof->class_name = D.7222;
    <D.7221>:
  }
  goto <D.7211>;
  <D.7210>:
  D.7223 = monoeg_strdup ("mscorlib");
  prof->assembly_name = D.7223;
  <D.7211>:
  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.7228;

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


cov_shutdown (struct MonoProfiler * prof)
{
  struct MonoAssembly * D.7229;
  char * D.7232;
  int D.7233;
  unsigned int D.7234;
  unsigned int D.7237;
  unsigned int D.7238;
  char * D.7241;
  char D.7244;
  const char * D.7247;
  char * D.7248;
  const char * D.7251;
  char * D.7252;
  struct GHashTable * D.7255;
  void * D.7256;
  int D.7259;
  struct MonoImage * image;
  struct MonoMethod * method;
  int i;
  char * name;

  mono_assembly_foreach (get_assembly, prof);
  D.7229 = prof->assembly;
  if (D.7229 == 0B) goto <D.7230>; else goto <D.7231>;
  <D.7230>:
  D.7232 = prof->assembly_name;
  monoeg_g_print ("Assembly \'%s\' was not loaded\n", D.7232);
  return;
  <D.7231>:
  D.7229 = prof->assembly;
  image = mono_assembly_get_image (D.7229);
  i = 1;
  goto <D.7182>;
  <D.7181>:
  {
    struct MonoClass * klass;

    D.7233 = i | 100663296;
    D.7234 = (unsigned int) D.7233;
    method = mono_get_method (image, D.7234, 0B);
    if (method == 0B) goto <D.7235>; else goto <D.7236>;
    <D.7235>:
    // predicted unlikely by continue predictor.
    goto <D.7180>;
    <D.7236>:
    D.7237 = mono_method_get_flags (method, 0B);
    D.7238 = D.7237 & 1024;
    if (D.7238 != 0) goto <D.7239>; else goto <D.7240>;
    <D.7239>:
    // predicted unlikely by continue predictor.
    goto <D.7180>;
    <D.7240>:
    D.7241 = prof->class_name;
    if (D.7241 != 0B) goto <D.7242>; else goto <D.7243>;
    <D.7242>:
    D.7241 = prof->class_name;
    D.7244 = *D.7241;
    if (D.7244 != 0) goto <D.7245>; else goto <D.7246>;
    <D.7245>:
    klass = mono_method_get_class (method);
    D.7241 = prof->class_name;
    D.7247 = mono_class_get_name (klass);
    D.7248 = strstr (D.7247, D.7241);
    if (D.7248 == 0B) goto <D.7249>; else goto <D.7250>;
    <D.7249>:
    D.7241 = prof->class_name;
    D.7251 = mono_class_get_namespace (klass);
    D.7252 = strstr (D.7251, D.7241);
    if (D.7252 == 0B) goto <D.7253>; else goto <D.7254>;
    <D.7253>:
    // predicted unlikely by continue predictor.
    goto <D.7180>;
    <D.7254>:
    <D.7250>:
    <D.7246>:
    <D.7243>:
    D.7255 = prof->hash;
    D.7256 = monoeg_g_hash_table_lookup (D.7255, method);
    if (D.7256 != 0B) goto <D.7257>; else goto <D.7258>;
    <D.7257>:
    check_partial_coverage (prof, method);
    // predicted unlikely by continue predictor.
    goto <D.7180>;
    <D.7258>:
    name = mono_method_full_name (method, 1);
    monoeg_g_print ("Not covered: %s\n", name);
    monoeg_g_free (name);
  }
  <D.7180>:
  i = i + 1;
  <D.7182>:
  D.7259 = mono_image_get_table_rows (image, 6);
  if (D.7259 >= i) goto <D.7181>; else goto <D.7183>;
  <D.7183>:
}


get_assembly (struct MonoAssembly * ass, struct MonoProfiler * prof)
{
  int D.7157;
  struct MonoImage * D.7270;
  const char * D.7271;
  char * D.7272;

  {
    size_t __s1_len;
    size_t __s2_len;

    D.7270 = mono_assembly_get_image (ass);
    D.7271 = mono_image_get_name (D.7270);
    D.7272 = prof->assembly_name;
    D.7157 = __builtin_strcmp (D.7272, D.7271);
  }
  if (D.7157 == 0) goto <D.7273>; else goto <D.7274>;
  <D.7273>:
  prof->assembly = ass;
  <D.7274>:
}


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

  mono_profiler_coverage_get (prof, method, coverage_callback);
  D.7277 = prof->bb_coverage;
  if (D.7277 != 0B) goto <D.7278>; else goto <D.7279>;
  <D.7278>:
  {
    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.7170>;
    <D.7169>:
    D.7280 = tmp->data;
    monoeg_g_print ("\t%s\n", D.7280);
    D.7280 = tmp->data;
    monoeg_g_free (D.7280);
    tmp = tmp->next;
    <D.7170>:
    if (tmp != 0B) goto <D.7169>; else goto <D.7171>;
    <D.7171>:
    D.7277 = prof->bb_coverage;
    monoeg_g_list_free (D.7277);
    prof->bb_coverage = 0B;
  }
  <D.7279>:
}


coverage_callback (struct MonoProfiler * prof, const struct MonoProfileCoverageEntry * entry)
{
  int D.7282;
  const char * D.7285;
  int D.7288;
  int D.7289;
  int D.7290;
  struct GList * D.7292;
  struct GList * D.7293;
  char * cmsg;

  D.7282 = entry->counter;
  if (D.7282 != 0) goto <D.7283>; else goto <D.7284>;
  <D.7283>:
  return;
  <D.7284>:
  D.7285 = entry->filename;
  if (D.7285 != 0B) goto <D.7286>; else goto <D.7287>;
  <D.7286>:
  D.7288 = entry->col;
  D.7289 = entry->line;
  D.7285 = entry->filename;
  D.7290 = entry->iloffset;
  cmsg = monoeg_g_strdup_printf ("offset 0x%04x (%s: line: %d, col: %d)", D.7290, D.7285, D.7289, D.7288);
  goto <D.7291>;
  <D.7287>:
  D.7290 = entry->iloffset;
  cmsg = monoeg_g_strdup_printf ("offset 0x%04x", D.7290);
  <D.7291>:
  D.7292 = prof->bb_coverage;
  D.7293 = monoeg_g_list_append (D.7292, cmsg);
  prof->bb_coverage = D.7293;
}


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

  if (str != 0B) goto <D.7298>; else goto <D.7299>;
  <D.7298>:
  D.7300 = __strdup (str);
  return D.7300;
  <D.7299>:
  D.7300 = 0B;
  return D.7300;
}


