__jit_debug_register_code ()
{
  __asm__ __volatile__("");
}


mono_xdebug_init (const char * options)
{
  int D.25156;
  int iftmp.0;
  int D.25155;
  const char[4] * D.25206;
  unsigned char D.25207;
  int D.25208;
  unsigned char D.25209;
  int D.25210;
  _Bool D.25211;
  _Bool D.25212;
  _Bool D.25213;
  const unsigned char * D.25216;
  unsigned char D.25217;
  int D.25218;
  const unsigned char * D.25219;
  unsigned char D.25220;
  int D.25221;
  _Bool D.25222;
  _Bool D.25223;
  const unsigned char * D.25226;
  unsigned char D.25227;
  int D.25228;
  const unsigned char * D.25229;
  unsigned char D.25230;
  int D.25231;
  _Bool D.25232;
  _Bool D.25233;
  const unsigned char * D.25236;
  unsigned char D.25237;
  int D.25238;
  const unsigned char * D.25239;
  unsigned char D.25240;
  int D.25241;
  int D.25165;
  int iftmp.1;
  int D.25164;
  const char[14] * D.25248;
  unsigned char D.25249;
  int D.25250;
  unsigned char D.25251;
  int D.25252;
  _Bool D.25253;
  _Bool D.25254;
  _Bool D.25255;
  const unsigned char * D.25258;
  unsigned char D.25259;
  int D.25260;
  const unsigned char * D.25261;
  unsigned char D.25262;
  int D.25263;
  _Bool D.25264;
  _Bool D.25265;
  const unsigned char * D.25268;
  unsigned char D.25269;
  int D.25270;
  const unsigned char * D.25271;
  unsigned char D.25272;
  int D.25273;
  _Bool D.25274;
  _Bool D.25275;
  const unsigned char * D.25278;
  unsigned char D.25279;
  int D.25280;
  const unsigned char * D.25281;
  unsigned char D.25282;
  int D.25283;
  char * D.25288;
  struct FILE * il_file.2;
  struct FILE * il_file.3;
  int use_gdb_interface.4;
  struct FILE * xdebug_fp.5;
  struct FILE * xdebug_fp.6;
  struct MonoDwarfWriter * xdebug_writer.7;
  struct MonoDwarfWriter * xdebug_writer.8;
  struct GSList * D.25300;
  struct MonoImageWriter * w;
  char * * args;
  char * * ptr;

  args = monoeg_g_strsplit (options, ",", -1);
  ptr = args;
  goto <D.25167>;
  <D.25166>:
  {
    char * arg;

    arg = *ptr;
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 3;
      if (__s2_len <= 3) goto <D.25204>; else goto <D.25205>;
      <D.25204>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = arg;
        D.25206 = "gdb";
        D.25207 = MEM[(const unsigned char *)D.25206];
        D.25208 = (int) D.25207;
        D.25209 = *__s2;
        D.25210 = (int) D.25209;
        __result = D.25208 - D.25210;
        {
          D.25211 = __s2_len != 0;
          D.25212 = __result == 0;
          D.25213 = D.25211 & D.25212;
          if (D.25213 != 0) goto <D.25214>; else goto <D.25215>;
          <D.25214>:
          D.25216 = &MEM[(void *)"gdb" + 1B];
          D.25217 = *D.25216;
          D.25218 = (int) D.25217;
          D.25219 = __s2 + 1;
          D.25220 = *D.25219;
          D.25221 = (int) D.25220;
          __result = D.25218 - D.25221;
          D.25222 = __s2_len > 1;
          D.25212 = __result == 0;
          D.25223 = D.25222 & D.25212;
          if (D.25223 != 0) goto <D.25224>; else goto <D.25225>;
          <D.25224>:
          D.25226 = &MEM[(void *)"gdb" + 2B];
          D.25227 = *D.25226;
          D.25228 = (int) D.25227;
          D.25229 = __s2 + 2;
          D.25230 = *D.25229;
          D.25231 = (int) D.25230;
          __result = D.25228 - D.25231;
          D.25232 = __s2_len > 2;
          D.25212 = __result == 0;
          D.25233 = D.25232 & D.25212;
          if (D.25233 != 0) goto <D.25234>; else goto <D.25235>;
          <D.25234>:
          D.25236 = &MEM[(void *)"gdb" + 3B];
          D.25237 = *D.25236;
          D.25238 = (int) D.25237;
          D.25239 = __s2 + 3;
          D.25240 = *D.25239;
          D.25241 = (int) D.25240;
          __result = D.25238 - D.25241;
          <D.25235>:
          <D.25225>:
          <D.25215>:
        }
        D.25155 = __result;
      }
      iftmp.0 = -D.25155;
      goto <D.25242>;
      <D.25205>:
      iftmp.0 = __builtin_strcmp (arg, "gdb");
      <D.25242>:
      D.25156 = iftmp.0;
    }
    if (D.25156 == 0) goto <D.25243>; else goto <D.25244>;
    <D.25243>:
    use_gdb_interface = 1;
    <D.25244>:
    {
      size_t __s1_len;
      size_t __s2_len;

      __s2_len = 13;
      if (__s2_len <= 3) goto <D.25246>; else goto <D.25247>;
      <D.25246>:
      {
        const unsigned char * __s2;
        int __result;

        __s2 = arg;
        D.25248 = "save-symfiles";
        D.25249 = MEM[(const unsigned char *)D.25248];
        D.25250 = (int) D.25249;
        D.25251 = *__s2;
        D.25252 = (int) D.25251;
        __result = D.25250 - D.25252;
        {
          D.25253 = __s2_len != 0;
          D.25254 = __result == 0;
          D.25255 = D.25253 & D.25254;
          if (D.25255 != 0) goto <D.25256>; else goto <D.25257>;
          <D.25256>:
          D.25258 = &MEM[(void *)"save-symfiles" + 1B];
          D.25259 = *D.25258;
          D.25260 = (int) D.25259;
          D.25261 = __s2 + 1;
          D.25262 = *D.25261;
          D.25263 = (int) D.25262;
          __result = D.25260 - D.25263;
          D.25264 = __s2_len > 1;
          D.25254 = __result == 0;
          D.25265 = D.25264 & D.25254;
          if (D.25265 != 0) goto <D.25266>; else goto <D.25267>;
          <D.25266>:
          D.25268 = &MEM[(void *)"save-symfiles" + 2B];
          D.25269 = *D.25268;
          D.25270 = (int) D.25269;
          D.25271 = __s2 + 2;
          D.25272 = *D.25271;
          D.25273 = (int) D.25272;
          __result = D.25270 - D.25273;
          D.25274 = __s2_len > 2;
          D.25254 = __result == 0;
          D.25275 = D.25274 & D.25254;
          if (D.25275 != 0) goto <D.25276>; else goto <D.25277>;
          <D.25276>:
          D.25278 = &MEM[(void *)"save-symfiles" + 3B];
          D.25279 = *D.25278;
          D.25280 = (int) D.25279;
          D.25281 = __s2 + 3;
          D.25282 = *D.25281;
          D.25283 = (int) D.25282;
          __result = D.25280 - D.25283;
          <D.25277>:
          <D.25267>:
          <D.25257>:
        }
        D.25164 = __result;
      }
      iftmp.1 = -D.25164;
      goto <D.25284>;
      <D.25247>:
      iftmp.1 = __builtin_strcmp (arg, "save-symfiles");
      <D.25284>:
      D.25165 = iftmp.1;
    }
    if (D.25165 == 0) goto <D.25285>; else goto <D.25286>;
    <D.25285>:
    save_symfiles = 1;
    <D.25286>:
  }
  ptr = ptr + 4;
  <D.25167>:
  if (ptr != 0B) goto <D.25287>; else goto <D.25168>;
  <D.25287>:
  D.25288 = *ptr;
  if (D.25288 != 0B) goto <D.25166>; else goto <D.25168>;
  <D.25168>:
  il_file.2 = fopen ("xdb.il", "w");
  il_file = il_file.2;
  il_file.3 = il_file;
  if (il_file.3 == 0B) goto <D.25291>; else goto <D.25292>;
  <D.25291>:
  use_gdb_interface = 0;
  monoeg_g_log (0B, 16, "** Unable to create xdb.il. Managed symbol names won\'t be available.");
  return;
  <D.25292>:
  use_gdb_interface.4 = use_gdb_interface;
  if (use_gdb_interface.4 != 0) goto <D.25294>; else goto <D.25295>;
  <D.25294>:
  return;
  <D.25295>:
  unlink ("xdb.s");
  xdebug_fp.5 = fopen ("xdb.s", "w");
  xdebug_fp = xdebug_fp.5;
  xdebug_fp.6 = xdebug_fp;
  w = img_writer_create (xdebug_fp.6, 0);
  img_writer_emit_start (w);
  il_file.3 = il_file;
  xdebug_writer.7 = mono_dwarf_writer_create (w, il_file.3, 0, 1, 1);
  xdebug_writer = xdebug_writer.7;
  img_writer_emit_section_change (w, ".text", 0);
  img_writer_emit_string (w, "");
  xdebug_writer.8 = xdebug_writer;
  D.25300 = mono_unwind_get_cie_program ();
  mono_dwarf_writer_emit_base_info (xdebug_writer.8, "JITted code", D.25300);
}


mono_xdebug_flush ()
{
  struct MonoImageWriter * xdebug_w.9;
  struct MonoDwarfWriter * xdebug_writer.10;

  xdebug_w.9 = xdebug_w;
  if (xdebug_w.9 != 0B) goto <D.25303>; else goto <D.25304>;
  <D.25303>:
  xdebug_w.9 = xdebug_w;
  xdebug_writer.10 = xdebug_writer;
  xdebug_end_emit (xdebug_w.9, xdebug_writer.10, 0B);
  <D.25304>:
  xdebug_begin_emit (&xdebug_w, &xdebug_writer);
}


xdebug_end_emit (struct MonoImageWriter * w, struct MonoDwarfWriter * dw, struct MonoMethod * method)
{
  int il_file_line_index.11;
  int file_counter.12;
  int file_counter.13;
  unsigned int img_size.14;
  long long unsigned int D.25312;
  struct jit_code_entry * D.25313;
  guint8 * img;
  guint32 img_size;
  struct jit_code_entry * entry;
  guint64 * psize;

  try
    {
      il_file_line_index.11 = mono_dwarf_writer_get_il_file_line_index (dw);
      il_file_line_index = il_file_line_index.11;
      mono_dwarf_writer_close (dw);
      img_writer_emit_writeout (w);
      img = img_writer_get_output (w, &img_size);
      img_writer_destroy (w);
      if (0 != 0) goto <D.25307>; else goto <D.25308>;
      <D.25307>:
      {
        struct FILE * fp;
        char * file_name;
        static int file_counter;

        file_counter.12 = file_counter;
        file_counter.13 = file_counter.12 + 1;
        file_counter = file_counter.13;
        file_counter.12 = file_counter;
        file_name = monoeg_g_strdup_printf ("xdb-%d.o", file_counter.12);
        img_size.14 = img_size;
        printf ("%s %p %d\n", file_name, img, img_size.14);
        fp = fopen (file_name, "w");
        img_size.14 = img_size;
        fwrite (img, img_size.14, 1, fp);
        fclose (fp);
        monoeg_g_free (file_name);
      }
      <D.25308>:
      entry = monoeg_malloc0 (20);
      entry->symfile_addr = img;
      psize = &entry->symfile_size1;
      img_size.14 = img_size;
      D.25312 = (long long unsigned int) img_size.14;
      *psize = D.25312;
      D.25313 = __jit_debug_descriptor.first_entry;
      entry->next_entry = D.25313;
      D.25313 = __jit_debug_descriptor.first_entry;
      if (D.25313 != 0B) goto <D.25314>; else goto <D.25315>;
      <D.25314>:
      D.25313 = __jit_debug_descriptor.first_entry;
      D.25313->prev_entry = entry;
      <D.25315>:
      __jit_debug_descriptor.first_entry = entry;
      __jit_debug_descriptor.relevant_entry = entry;
      __jit_debug_descriptor.action_flag = 1;
      __jit_debug_register_code ();
    }
  finally
    {
      img_size = {CLOBBER};
    }
}


xdebug_begin_emit (struct MonoImageWriter * * out_w, struct MonoDwarfWriter * * out_dw)
{
  struct FILE * il_file.15;
  struct FILE * il_file.16;
  int il_file_line_index.17;
  struct GSList * D.25321;
  struct MonoImageWriter * w;
  struct MonoDwarfWriter * dw;

  w = img_writer_create (0B, 1);
  img_writer_emit_start (w);
  il_file.15 = il_file;
  if (il_file.15 == 0B) goto <D.25317>; else goto <D.25318>;
  <D.25317>:
  il_file.16 = fopen ("xdb.il", "w");
  il_file = il_file.16;
  <D.25318>:
  il_file.15 = il_file;
  il_file_line_index.17 = il_file_line_index;
  dw = mono_dwarf_writer_create (w, il_file.15, il_file_line_index.17, 0, 1);
  D.25321 = mono_unwind_get_cie_program ();
  mono_dwarf_writer_emit_base_info (dw, "JITted code", D.25321);
  *out_w = w;
  *out_dw = dw;
}


mono_save_xdebug_info (struct MonoCompile * cfg)
{
  int use_gdb_interface.18;
  struct GHashTable * xdebug_syms.19;
  struct GHashTable * xdebug_syms.20;
  int xdebug_method_count.21;
  int D.25330;
  int xdebug_method_count.22;
  struct MonoJitInfo * D.25334;
  struct MonoMethod * D.25335;
  struct MonoDomain * D.25336;
  struct MonoDwarfWriter * xdebug_writer.23;
  struct MonoMethod * D.25338;
  void * D.25339;
  int D.25340;
  unsigned int D.25341;
  struct MonoInst * * D.25342;
  struct MonoInst * * D.25343;
  struct GSList * D.25344;
  struct MonoMethod * D.25348;
  struct MonoDomain * D.25349;
  struct MonoMethod * D.25350;
  struct FILE * xdebug_fp.24;
  struct MonoDebugMethodJitInfo * dmji;

  use_gdb_interface.18 = use_gdb_interface;
  if (use_gdb_interface.18 != 0) goto <D.25323>; else goto <D.25324>;
  <D.25323>:
  mono_loader_lock ();
  xdebug_syms.19 = xdebug_syms;
  if (xdebug_syms.19 == 0B) goto <D.25326>; else goto <D.25327>;
  <D.25326>:
  xdebug_syms.20 = monoeg_g_hash_table_new_full (monoeg_g_str_hash, monoeg_g_str_equal, monoeg_g_free, 0B);
  xdebug_syms = xdebug_syms.20;
  <D.25327>:
  xdebug_method_count.21 = xdebug_method_count;
  D.25330 = xdebug_method_count.21 % 100;
  if (D.25330 == 0) goto <D.25331>; else goto <D.25332>;
  <D.25331>:
  mono_xdebug_flush ();
  <D.25332>:
  xdebug_method_count.21 = xdebug_method_count;
  xdebug_method_count.22 = xdebug_method_count.21 + 1;
  xdebug_method_count = xdebug_method_count.22;
  D.25334 = cfg->jit_info;
  D.25335 = jinfo_get_method (D.25334);
  D.25336 = mono_domain_get ();
  dmji = mono_debug_find_method (D.25335, D.25336);
  xdebug_writer.23 = xdebug_writer;
  D.25334 = cfg->jit_info;
  D.25338 = jinfo_get_method (D.25334);
  D.25334 = cfg->jit_info;
  D.25339 = D.25334->code_start;
  D.25334 = cfg->jit_info;
  D.25340 = D.25334->code_size;
  D.25341 = (unsigned int) D.25340;
  D.25342 = cfg->args;
  D.25343 = cfg->locals;
  D.25344 = cfg->unwind_ops;
  mono_dwarf_writer_emit_method (xdebug_writer.23, cfg, D.25338, 0B, 0B, D.25339, D.25341, D.25342, D.25343, D.25344, dmji);
  mono_debug_free_method_jit_info (dmji);
  mono_loader_unlock ();
  goto <D.25345>;
  <D.25324>:
  xdebug_writer.23 = xdebug_writer;
  if (xdebug_writer.23 == 0B) goto <D.25346>; else goto <D.25347>;
  <D.25346>:
  return;
  <D.25347>:
  mono_loader_lock ();
  D.25334 = cfg->jit_info;
  D.25348 = jinfo_get_method (D.25334);
  D.25349 = mono_domain_get ();
  dmji = mono_debug_find_method (D.25348, D.25349);
  xdebug_writer.23 = xdebug_writer;
  D.25334 = cfg->jit_info;
  D.25350 = jinfo_get_method (D.25334);
  D.25334 = cfg->jit_info;
  D.25339 = D.25334->code_start;
  D.25334 = cfg->jit_info;
  D.25340 = D.25334->code_size;
  D.25341 = (unsigned int) D.25340;
  D.25342 = cfg->args;
  D.25343 = cfg->locals;
  D.25344 = cfg->unwind_ops;
  mono_dwarf_writer_emit_method (xdebug_writer.23, cfg, D.25350, 0B, 0B, D.25339, D.25341, D.25342, D.25343, D.25344, dmji);
  mono_debug_free_method_jit_info (dmji);
  xdebug_fp.24 = xdebug_fp;
  fflush (xdebug_fp.24);
  mono_loader_unlock ();
  <D.25345>:
}


jinfo_get_method (struct MonoJitInfo * ji)
{
  struct MonoMethod * D.25353;

  D.25353 = mono_jit_info_get_method (ji);
  return D.25353;
}


mono_save_trampoline_xdebug_info (struct MonoTrampInfo * info)
{
  int use_gdb_interface.25;
  struct MonoDwarfWriter * dw.26;
  char * D.25359;
  guint8 * D.25360;
  unsigned int D.25361;
  struct GSList * D.25362;
  struct MonoImageWriter * w.27;
  struct MonoDwarfWriter * xdebug_writer.28;
  struct FILE * xdebug_fp.29;

  use_gdb_interface.25 = use_gdb_interface;
  if (use_gdb_interface.25 != 0) goto <D.25356>; else goto <D.25357>;
  <D.25356>:
  {
    struct MonoImageWriter * w;
    struct MonoDwarfWriter * dw;

    try
      {
        mono_loader_lock_if_inited ();
        xdebug_begin_emit (&w, &dw);
        dw.26 = dw;
        D.25359 = info->name;
        D.25360 = info->code;
        D.25361 = info->code_size;
        D.25362 = info->unwind_ops;
        mono_dwarf_writer_emit_trampoline (dw.26, D.25359, 0B, 0B, D.25360, D.25361, D.25362);
        w.27 = w;
        dw.26 = dw;
        xdebug_end_emit (w.27, dw.26, 0B);
        mono_loader_unlock_if_inited ();
      }
    finally
      {
        w = {CLOBBER};
        dw = {CLOBBER};
      }
  }
  goto <D.25364>;
  <D.25357>:
  xdebug_writer.28 = xdebug_writer;
  if (xdebug_writer.28 == 0B) goto <D.25366>; else goto <D.25367>;
  <D.25366>:
  return;
  <D.25367>:
  mono_loader_lock_if_inited ();
  xdebug_writer.28 = xdebug_writer;
  D.25359 = info->name;
  D.25360 = info->code;
  D.25361 = info->code_size;
  D.25362 = info->unwind_ops;
  mono_dwarf_writer_emit_trampoline (xdebug_writer.28, D.25359, 0B, 0B, D.25360, D.25361, D.25362);
  xdebug_fp.29 = xdebug_fp;
  fflush (xdebug_fp.29);
  mono_loader_unlock_if_inited ();
  <D.25364>:
}


