mono_dwarf_writer_create (struct MonoImageWriter * writer, struct FILE * il_file, int il_file_start_line, gboolean appending, gboolean emit_line_numbers)
{
  struct MonoImageWriter * D.23609;
  int D.23610;
  _Bool D.23611;
  long int D.23612;
  long int D.23613;
  int D.23618;
  struct FILE * D.23624;
  const char * D.23625;
  struct GHashTable * D.23626;
  struct GHashTable * D.23627;
  struct GHashTable * D.23628;
  struct GHashTable * D.23629;
  struct MonoDwarfWriter * D.23630;
  struct MonoDwarfWriter * w;

  w = monoeg_malloc0 (152);
  w->w = writer;
  w->il_file = il_file;
  w->il_file_line_index = il_file_start_line;
  w->appending = appending;
  if (appending != 0) goto <D.23607>; else goto <D.23608>;
  <D.23607>:
  D.23609 = w->w;
  D.23610 = img_writer_subsections_supported (D.23609);
  D.23611 = D.23610 == 0;
  D.23612 = (long int) D.23611;
  D.23613 = __builtin_expect (D.23612, 0);
  if (D.23613 != 0) goto <D.23614>; else goto <D.23615>;
  <D.23614>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dwarfwriter.c", 94, "img_writer_subsections_supported (w->w)");
  <D.23615>:
  <D.23608>:
  w->emit_line = 1;
  if (appending != 0) goto <D.23616>; else goto <D.23617>;
  <D.23616>:
  D.23609 = w->w;
  D.23618 = img_writer_subsections_supported (D.23609);
  if (D.23618 == 0) goto <D.23619>; else goto <D.23620>;
  <D.23619>:
  w->emit_line = 0;
  <D.23620>:
  goto <D.23621>;
  <D.23617>:
  w->collect_line_info = 1;
  <D.23621>:
  if (emit_line_numbers == 0) goto <D.23622>; else goto <D.23623>;
  <D.23622>:
  w->emit_line = 0;
  w->collect_line_info = 0;
  <D.23623>:
  D.23609 = w->w;
  D.23624 = img_writer_get_fp (D.23609);
  w->fp = D.23624;
  D.23609 = w->w;
  D.23625 = img_writer_get_temp_label_prefix (D.23609);
  w->temp_prefix = D.23625;
  D.23626 = monoeg_g_hash_table_new (0B, 0B);
  w->class_to_die = D.23626;
  D.23627 = monoeg_g_hash_table_new (0B, 0B);
  w->class_to_vtype_die = D.23627;
  D.23628 = monoeg_g_hash_table_new (0B, 0B);
  w->class_to_pointer_die = D.23628;
  D.23629 = monoeg_g_hash_table_new (0B, 0B);
  w->class_to_reference_die = D.23629;
  w->cur_file_index = -1;
  D.23630 = w;
  return D.23630;
}


mono_dwarf_writer_destroy (struct MonoDwarfWriter * w)
{
  monoeg_g_free (w);
}


mono_dwarf_writer_get_il_file_line_index (struct MonoDwarfWriter * w)
{
  int D.23632;

  D.23632 = w->il_file_line_index;
  return D.23632;
}


mono_dwarf_escape_path (const char * name)
{
  char * D.23634;
  long unsigned int D.23637;
  int D.23638;
  int D.23639;
  long unsigned int D.23640;
  sizetype D.23641;
  const char * D.23642;
  char D.23643;
  int j.0;
  sizetype D.23647;
  char * D.23648;
  int j.1;
  sizetype D.23650;
  char * D.23651;
  int j.2;
  sizetype D.23654;
  char * D.23655;
  char * D.23656;

  D.23634 = __builtin_strchr (name, 92);
  if (D.23634 != 0B) goto <D.23635>; else goto <D.23636>;
  <D.23635>:
  {
    char * s;
    int len;
    int i;
    int j;

    D.23637 = strlen (name);
    len = (int) D.23637;
    D.23638 = len + 1;
    D.23639 = D.23638 * 2;
    D.23640 = (long unsigned int) D.23639;
    s = monoeg_malloc0 (D.23640);
    j = 0;
    i = 0;
    goto <D.23210>;
    <D.23209>:
    D.23641 = (sizetype) i;
    D.23642 = name + D.23641;
    D.23643 = *D.23642;
    if (D.23643 == 92) goto <D.23644>; else goto <D.23645>;
    <D.23644>:
    j.0 = j;
    j = j.0 + 1;
    D.23647 = (sizetype) j.0;
    D.23648 = s + D.23647;
    *D.23648 = 92;
    j.1 = j;
    j = j.1 + 1;
    D.23650 = (sizetype) j.1;
    D.23651 = s + D.23650;
    *D.23651 = 92;
    goto <D.23652>;
    <D.23645>:
    j.2 = j;
    j = j.2 + 1;
    D.23654 = (sizetype) j.2;
    D.23655 = s + D.23654;
    D.23641 = (sizetype) i;
    D.23642 = name + D.23641;
    D.23643 = *D.23642;
    *D.23655 = D.23643;
    <D.23652>:
    i = i + 1;
    <D.23210>:
    if (i < len) goto <D.23209>; else goto <D.23211>;
    <D.23211>:
    D.23656 = s;
    return D.23656;
  }
  <D.23636>:
  D.23656 = monoeg_strdup (name);
  return D.23656;
}


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

  if (str != 0B) goto <D.23658>; else goto <D.23659>;
  <D.23658>:
  D.23660 = __strdup (str);
  return D.23660;
  <D.23659>:
  D.23660 = 0B;
  return D.23660;
}


mono_dwarf_writer_emit_base_info (struct MonoDwarfWriter * w, const char * cu_name, struct GSList * base_unwind_program)
{
  struct MonoImageWriter * D.23662;
  int D.23663;
  int D.23666;
  int D.23669;
  const char * D.23673;
  int D.23674;
  unsigned char D.23675;
  int D.23676;
  unsigned char D.23677;
  const char * D.23678;
  unsigned int i.3;
  char * s;
  char * build_info;
  int i;

  w->cie_program = base_unwind_program;
  emit_section_change (w, ".debug_abbrev", 0);
  emit_dwarf_abbrev (w, 1, 17, 1, &compile_unit_attr, 14);
  emit_dwarf_abbrev (w, 2, 46, 1, &subprogram_attr, 10);
  emit_dwarf_abbrev (w, 3, 5, 0, &param_attr, 6);
  emit_dwarf_abbrev (w, 15, 5, 0, &param_loclist_attr, 6);
  emit_dwarf_abbrev (w, 4, 36, 0, &base_type_attr, 6);
  emit_dwarf_abbrev (w, 5, 2, 1, &struct_type_attr, 4);
  emit_dwarf_abbrev (w, 17, 2, 0, &struct_type_attr, 4);
  emit_dwarf_abbrev (w, 6, 13, 0, &data_member_attr, 6);
  emit_dwarf_abbrev (w, 7, 22, 0, &typedef_attr, 4);
  emit_dwarf_abbrev (w, 8, 4, 1, &enum_type_attr, 6);
  emit_dwarf_abbrev (w, 9, 40, 0, &enumerator_attr, 4);
  emit_dwarf_abbrev (w, 10, 57, 1, &namespace_attr, 2);
  emit_dwarf_abbrev (w, 11, 52, 0, &variable_attr, 6);
  emit_dwarf_abbrev (w, 12, 52, 0, &variable_loclist_attr, 6);
  emit_dwarf_abbrev (w, 13, 15, 0, &pointer_type_attr, 2);
  emit_dwarf_abbrev (w, 14, 16, 0, &reference_type_attr, 2);
  emit_dwarf_abbrev (w, 16, 28, 0, &inheritance_attr, 4);
  emit_dwarf_abbrev (w, 18, 46, 0, &tramp_subprogram_attr, 6);
  emit_byte (w, 0);
  emit_section_change (w, ".debug_info", 0);
  emit_label (w, ".Ldebug_info_start");
  emit_symbol_diff (w, ".Ldebug_info_end", ".Ldebug_info_begin", 0);
  emit_label (w, ".Ldebug_info_begin");
  emit_int16 (w, 2);
  emit_int32 (w, 0);
  emit_byte (w, 8);
  D.23662 = w->w;
  D.23663 = img_writer_subsections_supported (D.23662);
  if (D.23663 != 0) goto <D.23664>; else goto <D.23665>;
  <D.23664>:
  D.23666 = w->appending;
  if (D.23666 != 0) goto <D.23667>; else goto <D.23668>;
  <D.23667>:
  emit_section_change (w, ".debug_info", 1);
  emit_byte (w, 0);
  emit_label (w, ".Ldebug_info_end");
  emit_section_change (w, ".debug_info", 0);
  <D.23668>:
  <D.23665>:
  emit_uleb128 (w, 1);
  build_info = mono_get_runtime_build_info ();
  s = monoeg_g_strdup_printf ("Mono AOT Compiler %s", build_info);
  emit_string (w, s);
  monoeg_g_free (build_info);
  monoeg_g_free (s);
  emit_string (w, cu_name);
  emit_string (w, "");
  emit_byte (w, 2);
  emit_pointer_value (w, 0B);
  emit_pointer_value (w, 0B);
  D.23669 = w->emit_line;
  if (D.23669 != 0) goto <D.23670>; else goto <D.23671>;
  <D.23670>:
  emit_symbol_diff (w, ".Ldebug_line_start", ".Ldebug_line_section_start", 0);
  goto <D.23672>;
  <D.23671>:
  emit_pointer_value (w, 0B);
  <D.23672>:
  i = 0;
  goto <D.23267>;
  <D.23266>:
  D.23673 = basic_types[i].die_name;
  emit_label (w, D.23673);
  emit_uleb128 (w, 4);
  D.23674 = basic_types[i].size;
  D.23675 = (unsigned char) D.23674;
  emit_byte (w, D.23675);
  D.23676 = basic_types[i].encoding;
  D.23677 = (unsigned char) D.23676;
  emit_byte (w, D.23677);
  D.23678 = basic_types[i].name;
  emit_string (w, D.23678);
  i = i + 1;
  <D.23267>:
  i.3 = (unsigned int) i;
  if (i.3 <= 16) goto <D.23266>; else goto <D.23268>;
  <D.23268>:
  emit_debug_info_end (w);
  emit_section_change (w, ".debug_loc", 0);
  emit_label (w, ".Ldebug_loc_start");
  emit_cie (w);
}


emit_dwarf_abbrev (struct MonoDwarfWriter * w, int code, int tag, gboolean has_child, int * attrs, int attrs_len)
{
  unsigned int code.4;
  unsigned int tag.5;
  unsigned char D.23682;
  long unsigned int D.23683;
  long unsigned int D.23684;
  int * D.23685;
  int D.23686;
  unsigned int D.23687;
  int i;

  code.4 = (unsigned int) code;
  emit_uleb128 (w, code.4);
  tag.5 = (unsigned int) tag;
  emit_uleb128 (w, tag.5);
  D.23682 = (unsigned char) has_child;
  emit_byte (w, D.23682);
  i = 0;
  goto <D.23123>;
  <D.23122>:
  D.23683 = (long unsigned int) i;
  D.23684 = D.23683 * 4;
  D.23685 = attrs + D.23684;
  D.23686 = *D.23685;
  D.23687 = (unsigned int) D.23686;
  emit_uleb128 (w, D.23687);
  i = i + 1;
  <D.23123>:
  if (i < attrs_len) goto <D.23122>; else goto <D.23124>;
  <D.23124>:
  emit_uleb128 (w, 0);
  emit_uleb128 (w, 0);
}


emit_int16 (struct MonoDwarfWriter * w, int value)
{
  struct MonoImageWriter * D.23688;

  D.23688 = w->w;
  img_writer_emit_int16 (D.23688, value);
}


emit_int32 (struct MonoDwarfWriter * w, int value)
{
  struct MonoImageWriter * D.23689;

  D.23689 = w->w;
  img_writer_emit_int32 (D.23689, value);
}


emit_symbol_diff (struct MonoDwarfWriter * w, const char * end, const char * start, int offset)
{
  struct MonoImageWriter * D.23690;

  D.23690 = w->w;
  img_writer_emit_symbol_diff (D.23690, end, start, offset);
}


emit_pointer_value (struct MonoDwarfWriter * w, void * ptr)
{
  long int ptr.6;
  gssize val;

  try
    {
      ptr.6 = (long int) ptr;
      val = ptr.6;
      emit_bytes (w, &val, 8);
    }
  finally
    {
      val = {CLOBBER};
    }
}


emit_bytes (struct MonoDwarfWriter * w, const guint8 * buf, int size)
{
  struct MonoImageWriter * D.23692;

  D.23692 = w->w;
  img_writer_emit_bytes (D.23692, buf, size);
}


emit_uleb128 (struct MonoDwarfWriter * w, guint32 value)
{
  unsigned char D.23693;

  <D.23078>:
  {
    guint8 b;

    D.23693 = (unsigned char) value;
    b = D.23693 & 127;
    value = value >> 7;
    if (value != 0) goto <D.23694>; else goto <D.23695>;
    <D.23694>:
    b = b | 128;
    <D.23695>:
    emit_byte (w, b);
  }
  if (value != 0) goto <D.23078>; else goto <D.23079>;
  <D.23079>:
}


emit_byte (struct MonoDwarfWriter * w, guint8 val)
{
  struct MonoImageWriter * D.23696;

  D.23696 = w->w;
  img_writer_emit_byte (D.23696, val);
}


emit_string (struct MonoDwarfWriter * w, const char * value)
{
  struct MonoImageWriter * D.23697;

  D.23697 = w->w;
  img_writer_emit_string (D.23697, value);
}


emit_debug_info_end (struct MonoDwarfWriter * w)
{

}


emit_section_change (struct MonoDwarfWriter * w, const char * section_name, int subsection_index)
{
  struct MonoImageWriter * D.23698;

  D.23698 = w->w;
  img_writer_emit_section_change (D.23698, section_name, subsection_index);
}


emit_label (struct MonoDwarfWriter * w, const char * name)
{
  struct MonoImageWriter * D.23699;

  D.23699 = w->w;
  img_writer_emit_label (D.23699, name);
}


emit_cie (struct MonoDwarfWriter * w)
{
  int D.23700;
  long int D.23701;
  int D.23702;
  unsigned int D.23703;
  struct GSList * D.23704;
  unsigned int uw_info_len.7;
  int uw_info_len.8;

  emit_section_change (w, ".debug_frame", 0);
  emit_alignment (w, 8);
  emit_symbol_diff (w, ".Lcie0_end", ".Lcie0_start", 0);
  emit_label (w, ".Lcie0_start");
  emit_int32 (w, -1);
  emit_byte (w, 3);
  emit_string (w, "");
  emit_sleb128 (w, 1);
  D.23700 = mono_unwind_get_dwarf_data_align ();
  D.23701 = (long int) D.23700;
  emit_sleb128 (w, D.23701);
  D.23702 = mono_unwind_get_dwarf_pc_reg ();
  D.23703 = (unsigned int) D.23702;
  emit_uleb128 (w, D.23703);
  D.23704 = w->cie_program;
  w->cie_program = D.23704;
  D.23704 = w->cie_program;
  if (D.23704 != 0B) goto <D.23705>; else goto <D.23706>;
  <D.23705>:
  {
    guint32 uw_info_len;
    guint8 * uw_info;

    try
      {
        D.23704 = w->cie_program;
        uw_info = mono_unwind_ops_encode (D.23704, &uw_info_len);
        uw_info_len.7 = uw_info_len;
        uw_info_len.8 = (int) uw_info_len.7;
        emit_bytes (w, uw_info, uw_info_len.8);
        monoeg_g_free (uw_info);
      }
    finally
      {
        uw_info_len = {CLOBBER};
      }
  }
  <D.23706>:
  emit_alignment (w, 8);
  emit_label (w, ".Lcie0_end");
}


emit_sleb128 (struct MonoDwarfWriter * w, gint64 value)
{
  _Bool D.23709;
  unsigned char D.23710;
  unsigned int D.23713;
  int D.23714;
  long int D.23715;
  long int D.23716;
  int D.23722;
  int D.23723;
  gboolean more;
  gboolean negative;
  guint32 size;
  guint8 byte;

  more = 1;
  D.23709 = value < 0;
  negative = (gboolean) D.23709;
  size = 64;
  goto <D.23089>;
  <D.23088>:
  D.23710 = (unsigned char) value;
  byte = D.23710 & 127;
  value = value >> 7;
  if (negative != 0) goto <D.23711>; else goto <D.23712>;
  <D.23711>:
  D.23713 = size + 4294967289;
  D.23714 = (int) D.23713;
  D.23715 = 1 << D.23714;
  D.23716 = -D.23715;
  value = D.23716 | value;
  <D.23712>:
  if (value == 0) goto <D.23721>; else goto <D.23717>;
  <D.23721>:
  D.23722 = (int) byte;
  D.23723 = D.23722 & 64;
  if (D.23723 == 0) goto <D.23718>; else goto <D.23717>;
  <D.23717>:
  if (value == -1) goto <D.23724>; else goto <D.23719>;
  <D.23724>:
  D.23722 = (int) byte;
  D.23723 = D.23722 & 64;
  if (D.23723 != 0) goto <D.23718>; else goto <D.23719>;
  <D.23718>:
  more = 0;
  goto <D.23720>;
  <D.23719>:
  byte = byte | 128;
  <D.23720>:
  emit_byte (w, byte);
  <D.23089>:
  if (more != 0) goto <D.23088>; else goto <D.23090>;
  <D.23090>:
}


emit_alignment (struct MonoDwarfWriter * w, int size)
{
  struct MonoImageWriter * D.23725;

  D.23725 = w->w;
  img_writer_emit_alignment (D.23725, size);
}


mono_dwarf_writer_close (struct MonoDwarfWriter * w)
{
  int D.23726;
  int D.23729;

  D.23726 = w->appending;
  if (D.23726 == 0) goto <D.23727>; else goto <D.23728>;
  <D.23727>:
  emit_section_change (w, ".debug_info", 0);
  emit_byte (w, 0);
  emit_label (w, ".Ldebug_info_end");
  <D.23728>:
  D.23729 = w->collect_line_info;
  if (D.23729 != 0) goto <D.23730>; else goto <D.23731>;
  <D.23730>:
  emit_all_line_number_info (w);
  <D.23731>:
}


emit_all_line_number_info (struct MonoDwarfWriter * w)
{
  int D.23732;
  _Bool D.23733;
  long int D.23734;
  long int D.23735;
  struct GSList * D.23738;
  struct MonoMethod * D.23739;
  struct GPtrArray * source_file_list.9;
  void * * D.23743;
  long unsigned int D.23744;
  long unsigned int D.23745;
  void * * D.23746;
  char * D.23747;
  unsigned int i.10;
  unsigned int D.23749;
  struct GHashTable * D.23750;
  int D.23751;
  long unsigned int D.23752;
  const void * D.23753;
  int D.23754;
  void * D.23757;
  long int D.23758;
  int D.23761;
  int D.23762;
  int D.23763;
  long unsigned int D.23764;
  void * D.23765;
  int D.23767;
  char * D.23768;
  int D.23769;
  void * D.23772;
  long int D.23773;
  char * D.23777;
  unsigned int dir_index.11;
  struct MonoMethod * D.23779;
  struct MonoDomain * D.23780;
  char * D.23781;
  char * D.23782;
  guint8 * D.23783;
  unsigned int D.23784;
  int i;
  struct GHashTable * dir_to_index;
  struct GHashTable * index_to_dir;
  struct GSList * l;
  struct GSList * info_list;

  D.23732 = w->collect_line_info;
  D.23733 = D.23732 == 0;
  D.23734 = (long int) D.23733;
  D.23735 = __builtin_expect (D.23734, 0);
  if (D.23735 != 0) goto <D.23736>; else goto <D.23737>;
  <D.23736>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dwarfwriter.c", 709, "w->collect_line_info");
  <D.23737>:
  add_line_number_file_name (w, "<unknown>", 0, 0);
  D.23738 = w->line_info;
  info_list = monoeg_g_slist_reverse (D.23738);
  l = info_list;
  goto <D.23230>;
  <D.23229>:
  {
    struct MethodLineNumberInfo * info;
    struct MonoDebugMethodInfo * minfo;
    char * source_file;
    struct GPtrArray * source_file_list;

    try
      {
        info = l->data;
        D.23739 = info->method;
        minfo = mono_debug_lookup_method (D.23739);
        if (minfo == 0B) goto <D.23740>; else goto <D.23741>;
        <D.23740>:
        // predicted unlikely by continue predictor.
        goto <D.23224>;
        <D.23741>:
        mono_debug_symfile_get_line_numbers_full (minfo, &source_file, &source_file_list, 0B, 0B, 0B, 0B, 0B);
        i = 0;
        goto <D.23227>;
        <D.23226>:
        {
          struct MonoDebugSourceInfo * sinfo;

          source_file_list.9 = source_file_list;
          D.23743 = source_file_list.9->pdata;
          D.23744 = (long unsigned int) i;
          D.23745 = D.23744 * 8;
          D.23746 = D.23743 + D.23745;
          sinfo = *D.23746;
          D.23747 = sinfo->source_file;
          add_line_number_file_name (w, D.23747, 0, 0);
        }
        i = i + 1;
        <D.23227>:
        i.10 = (unsigned int) i;
        source_file_list.9 = source_file_list;
        D.23749 = source_file_list.9->len;
        if (i.10 < D.23749) goto <D.23226>; else goto <D.23228>;
        <D.23228>:
      }
    finally
      {
        source_file = {CLOBBER};
        source_file_list = {CLOBBER};
      }
  }
  <D.23224>:
  l = l->next;
  <D.23230>:
  if (l != 0B) goto <D.23229>; else goto <D.23231>;
  <D.23231>:
  dir_to_index = monoeg_g_hash_table_new (monoeg_g_str_hash, monoeg_g_str_equal);
  index_to_dir = monoeg_g_hash_table_new (0B, 0B);
  i = 0;
  goto <D.23237>;
  <D.23236>:
  {
    char * name;
    char * copy;
    int dir_index;

    D.23750 = w->index_to_file;
    D.23751 = i + 1;
    D.23752 = (long unsigned int) D.23751;
    D.23753 = (const void *) D.23752;
    name = monoeg_g_hash_table_lookup (D.23750, D.23753);
    dir_index = 0;
    D.23754 = monoeg_g_path_is_absolute (name);
    if (D.23754 != 0) goto <D.23755>; else goto <D.23756>;
    <D.23755>:
    {
      char * dir;

      dir = monoeg_g_path_get_dirname (name);
      D.23757 = monoeg_g_hash_table_lookup (dir_to_index, dir);
      D.23758 = (long int) D.23757;
      dir_index = (int) D.23758;
      if (dir_index == 0) goto <D.23759>; else goto <D.23760>;
      <D.23759>:
      dir_index = w->line_number_dir_index;
      D.23761 = w->line_number_dir_index;
      D.23762 = D.23761 + 1;
      w->line_number_dir_index = D.23762;
      copy = monoeg_strdup (dir);
      D.23763 = dir_index + 1;
      D.23764 = (long unsigned int) D.23763;
      D.23765 = (void *) D.23764;
      monoeg_g_hash_table_insert_replace (dir_to_index, copy, D.23765, 0);
      D.23763 = dir_index + 1;
      D.23764 = (long unsigned int) D.23763;
      D.23765 = (void *) D.23764;
      monoeg_g_hash_table_insert_replace (index_to_dir, D.23765, copy, 0);
      goto <D.23766>;
      <D.23760>:
      dir_index = dir_index + -1;
      <D.23766>:
      monoeg_g_free (dir);
    }
    <D.23756>:
  }
  i = i + 1;
  <D.23237>:
  D.23767 = w->line_number_file_index;
  if (D.23767 > i) goto <D.23236>; else goto <D.23238>;
  <D.23238>:
  emit_section_change (w, ".debug_line", 0);
  emit_label (w, ".Ldebug_line_section_start");
  emit_label (w, ".Ldebug_line_start");
  emit_symbol_diff (w, ".Ldebug_line_end", ".", -4);
  emit_int16 (w, 2);
  emit_symbol_diff (w, ".Ldebug_line_header_end", ".", -4);
  emit_byte (w, 1);
  emit_byte (w, 1);
  emit_byte (w, 251);
  emit_byte (w, 14);
  emit_byte (w, 13);
  emit_byte (w, 0);
  emit_byte (w, 1);
  emit_byte (w, 1);
  emit_byte (w, 1);
  emit_byte (w, 1);
  emit_byte (w, 0);
  emit_byte (w, 0);
  emit_byte (w, 0);
  emit_byte (w, 1);
  emit_byte (w, 0);
  emit_byte (w, 0);
  emit_byte (w, 1);
  emit_section_change (w, ".debug_line", 0);
  i = 0;
  goto <D.23241>;
  <D.23240>:
  {
    char * dir;

    D.23751 = i + 1;
    D.23752 = (long unsigned int) D.23751;
    D.23753 = (const void *) D.23752;
    dir = monoeg_g_hash_table_lookup (index_to_dir, D.23753);
    D.23768 = mono_dwarf_escape_path (dir);
    emit_string (w, D.23768);
  }
  i = i + 1;
  <D.23241>:
  D.23761 = w->line_number_dir_index;
  if (D.23761 > i) goto <D.23240>; else goto <D.23242>;
  <D.23242>:
  emit_byte (w, 0);
  i = 0;
  goto <D.23248>;
  <D.23247>:
  {
    char * name;
    char * basename;
    char * dir;
    int dir_index;

    D.23750 = w->index_to_file;
    D.23751 = i + 1;
    D.23752 = (long unsigned int) D.23751;
    D.23753 = (const void *) D.23752;
    name = monoeg_g_hash_table_lookup (D.23750, D.23753);
    basename = 0B;
    dir_index = 0;
    D.23769 = monoeg_g_path_is_absolute (name);
    if (D.23769 != 0) goto <D.23770>; else goto <D.23771>;
    <D.23770>:
    dir = monoeg_g_path_get_dirname (name);
    D.23772 = monoeg_g_hash_table_lookup (dir_to_index, dir);
    D.23773 = (long int) D.23772;
    dir_index = (int) D.23773;
    basename = monoeg_g_path_get_basename (name);
    <D.23771>:
    if (basename != 0B) goto <D.23774>; else goto <D.23775>;
    <D.23774>:
    emit_string (w, basename);
    goto <D.23776>;
    <D.23775>:
    D.23777 = mono_dwarf_escape_path (name);
    emit_string (w, D.23777);
    <D.23776>:
    dir_index.11 = (unsigned int) dir_index;
    emit_uleb128 (w, dir_index.11);
    emit_byte (w, 0);
    emit_byte (w, 0);
  }
  i = i + 1;
  <D.23248>:
  D.23767 = w->line_number_file_index;
  if (D.23767 > i) goto <D.23247>; else goto <D.23249>;
  <D.23249>:
  emit_byte (w, 0);
  emit_label (w, ".Ldebug_line_header_end");
  l = info_list;
  goto <D.23253>;
  <D.23252>:
  {
    struct MethodLineNumberInfo * info;
    struct MonoDebugMethodJitInfo * dmji;

    info = l->data;
    D.23779 = info->method;
    D.23780 = mono_domain_get ();
    dmji = mono_debug_find_method (D.23779, D.23780);
    D.23779 = info->method;
    D.23781 = info->start_symbol;
    D.23782 = info->end_symbol;
    D.23783 = info->code;
    D.23784 = info->code_size;
    emit_line_number_info (w, D.23779, D.23781, D.23782, D.23783, D.23784, dmji);
    mono_debug_free_method_jit_info (dmji);
  }
  l = l->next;
  <D.23253>:
  if (l != 0B) goto <D.23252>; else goto <D.23254>;
  <D.23254>:
  monoeg_g_slist_free (info_list);
  emit_byte (w, 0);
  emit_byte (w, 1);
  emit_byte (w, 1);
  emit_label (w, ".Ldebug_line_end");
}


add_line_number_file_name (struct MonoDwarfWriter * w, const char * name, gint64 last_mod_time, gint64 file_size)
{
  struct GHashTable * D.23787;
  struct GHashTable * D.23790;
  struct GHashTable * D.23791;
  void * D.23792;
  long int D.23793;
  int D.23796;
  int D.23797;
  int D.23798;
  int D.23799;
  long unsigned int D.23800;
  void * D.23801;
  struct GHashTable * D.23802;
  int index;
  char * copy;

  D.23787 = w->file_to_index;
  if (D.23787 == 0B) goto <D.23788>; else goto <D.23789>;
  <D.23788>:
  D.23790 = monoeg_g_hash_table_new (monoeg_g_str_hash, monoeg_g_str_equal);
  w->file_to_index = D.23790;
  D.23791 = monoeg_g_hash_table_new (0B, 0B);
  w->index_to_file = D.23791;
  <D.23789>:
  D.23787 = w->file_to_index;
  D.23792 = monoeg_g_hash_table_lookup (D.23787, name);
  D.23793 = (long int) D.23792;
  index = (int) D.23793;
  if (index > 0) goto <D.23794>; else goto <D.23795>;
  <D.23794>:
  D.23796 = index + -1;
  return D.23796;
  <D.23795>:
  index = w->line_number_file_index;
  D.23797 = w->line_number_file_index;
  D.23798 = D.23797 + 1;
  w->line_number_file_index = D.23798;
  copy = monoeg_strdup (name);
  D.23787 = w->file_to_index;
  D.23799 = index + 1;
  D.23800 = (long unsigned int) D.23799;
  D.23801 = (void *) D.23800;
  monoeg_g_hash_table_insert_replace (D.23787, copy, D.23801, 0);
  D.23802 = w->index_to_file;
  D.23799 = index + 1;
  D.23800 = (long unsigned int) D.23799;
  D.23801 = (void *) D.23800;
  monoeg_g_hash_table_insert_replace (D.23802, D.23801, copy, 0);
  D.23796 = index;
  return D.23796;
}


emit_line_number_info (struct MonoDwarfWriter * w, struct MonoMethod * method, char * start_symbol, char * end_symbol, guint8 * code, guint32 code_size, struct MonoDebugMethodJitInfo * debug_info)
{
  int D.23804;
  _Bool D.23807;
  long int D.23808;
  long int D.23809;
  unsigned int D.23812;
  long unsigned int D.23813;
  long unsigned int D.23814;
  struct MonoDebugLineNumberEntry * D.23815;
  long unsigned int D.23816;
  unsigned int D.23817;
  long unsigned int D.23818;
  long unsigned int D.23819;
  long unsigned int D.23820;
  long unsigned int D.23821;
  long unsigned int D.23824;
  long unsigned int D.23825;
  int * D.23826;
  unsigned int j.12;
  unsigned int D.23828;
  unsigned int i.13;
  unsigned int D.23830;
  sizetype D.23833;
  sizetype D.23834;
  sizetype D.23835;
  unsigned int D.23836;
  int D.23837;
  unsigned int D.23838;
  unsigned int j.14;
  long unsigned int D.23847;
  int * D.23848;
  unsigned int i.15;
  unsigned int il_offset.16;
  char * D.23859;
  unsigned int D.23860;
  int D.23861;
  int prev_line.17;
  unsigned int D.23863;
  int D.23869;
  long int D.23870;
  int D.23519;
  int D.23876;
  int D.23879;
  int D.23881;
  unsigned int file_index.18;
  unsigned int D.23887;
  long int D.23888;
  const unsigned char * ip.19;
  struct FILE * D.23893;
  int D.23894;
  int D.23895;
  unsigned int D.23896;
  long unsigned int D.23897;
  long unsigned int D.23898;
  const guint8 * ip.20;
  long int ip.21;
  long int ip.22;
  long int D.23902;
  long unsigned int D.23903;
  long unsigned int D.23904;
  int * D.23905;
  sizetype D.23906;
  const unsigned char * D.23907;
  unsigned int D.23908;
  long unsigned int D.23911;
  long unsigned int D.23912;
  int * D.23913;
  int D.23918;
  unsigned int D.23919;
  int D.23920;
  int D.23921;
  unsigned int prev_native_offset.23;
  unsigned int D.23923;
  long int D.23924;
  guint32 prev_line;
  guint32 prev_native_offset;
  int i;
  int file_index;
  int il_offset;
  int prev_il_offset;
  gboolean first;
  struct MonoDebugSourceLocation * loc;
  char * prev_file_name;
  struct MonoMethodHeader * header;
  struct MonoDebugMethodInfo * minfo;
  struct MonoDebugLineNumberEntry * ln_array;
  int * native_to_il_offset;

  prev_line = 0;
  prev_native_offset = 0;
  first = 1;
  prev_file_name = 0B;
  header = mono_method_get_header (method);
  native_to_il_offset = 0B;
  D.23804 = w->emit_line;
  if (D.23804 == 0) goto <D.23805>; else goto <D.23806>;
  <D.23805>:
  mono_metadata_free_mh (header);
  return;
  <D.23806>:
  minfo = mono_debug_lookup_method (method);
  D.23807 = code_size == 0;
  D.23808 = (long int) D.23807;
  D.23809 = __builtin_expect (D.23808, 0);
  if (D.23809 != 0) goto <D.23810>; else goto <D.23811>;
  <D.23810>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dwarfwriter.c", 1585, "code_size");
  <D.23811>:
  D.23812 = debug_info->num_line_numbers;
  D.23813 = (long unsigned int) D.23812;
  D.23814 = D.23813 * 8;
  ln_array = monoeg_malloc0 (D.23814);
  D.23815 = debug_info->line_numbers;
  D.23812 = debug_info->num_line_numbers;
  D.23813 = (long unsigned int) D.23812;
  D.23814 = D.23813 * 8;
  memcpy (ln_array, D.23815, D.23814);
  D.23812 = debug_info->num_line_numbers;
  D.23816 = (long unsigned int) D.23812;
  qsort (ln_array, D.23816, 8, compare_lne);
  D.23817 = code_size + 1;
  D.23818 = (long unsigned int) D.23817;
  D.23819 = D.23818 * 4;
  native_to_il_offset = monoeg_malloc0 (D.23819);
  i = 0;
  goto <D.23506>;
  <D.23505>:
  {
    int j;
    struct MonoDebugLineNumberEntry * lne;

    D.23820 = (long unsigned int) i;
    D.23821 = D.23820 * 8;
    lne = ln_array + D.23821;
    if (i == 0) goto <D.23822>; else goto <D.23823>;
    <D.23822>:
    j = 0;
    goto <D.23496>;
    <D.23495>:
    D.23824 = (long unsigned int) j;
    D.23825 = D.23824 * 4;
    D.23826 = native_to_il_offset + D.23825;
    *D.23826 = -1;
    j = j + 1;
    <D.23496>:
    j.12 = (unsigned int) j;
    D.23828 = lne->native_offset;
    if (j.12 < D.23828) goto <D.23495>; else goto <D.23497>;
    <D.23497>:
    <D.23823>:
    i.13 = (unsigned int) i;
    D.23812 = debug_info->num_line_numbers;
    D.23830 = D.23812 + 4294967295;
    if (i.13 < D.23830) goto <D.23831>; else goto <D.23832>;
    <D.23831>:
    {
      struct MonoDebugLineNumberEntry * lne_next;

      D.23833 = (sizetype) i;
      D.23834 = D.23833 + 1;
      D.23835 = D.23834 * 8;
      lne_next = ln_array + D.23835;
      D.23828 = lne->native_offset;
      j = (int) D.23828;
      goto <D.23500>;
      <D.23499>:
      D.23824 = (long unsigned int) j;
      D.23825 = D.23824 * 4;
      D.23826 = native_to_il_offset + D.23825;
      D.23836 = lne->il_offset;
      D.23837 = (int) D.23836;
      *D.23826 = D.23837;
      j = j + 1;
      <D.23500>:
      j.12 = (unsigned int) j;
      D.23838 = lne_next->native_offset;
      if (j.12 < D.23838) goto <D.23499>; else goto <D.23501>;
      <D.23501>:
    }
    goto <D.23839>;
    <D.23832>:
    D.23828 = lne->native_offset;
    j = (int) D.23828;
    goto <D.23503>;
    <D.23502>:
    D.23824 = (long unsigned int) j;
    D.23825 = D.23824 * 4;
    D.23826 = native_to_il_offset + D.23825;
    D.23836 = lne->il_offset;
    D.23837 = (int) D.23836;
    *D.23826 = D.23837;
    j = j + 1;
    <D.23503>:
    j.14 = (unsigned int) j;
    if (j.14 < code_size) goto <D.23502>; else goto <D.23504>;
    <D.23504>:
    <D.23839>:
  }
  i = i + 1;
  <D.23506>:
  i.13 = (unsigned int) i;
  D.23812 = debug_info->num_line_numbers;
  if (i.13 < D.23812) goto <D.23505>; else goto <D.23507>;
  <D.23507>:
  monoeg_g_free (ln_array);
  prev_line = 1;
  prev_il_offset = -1;
  i = 0;
  goto <D.23521>;
  <D.23520>:
  {
    int line_diff;
    int addr_diff;

    if (minfo == 0B) goto <D.23841>; else goto <D.23842>;
    <D.23841>:
    // predicted unlikely by continue predictor.
    goto <D.23510>;
    <D.23842>:
    D.23815 = debug_info->line_numbers;
    if (D.23815 == 0B) goto <D.23843>; else goto <D.23844>;
    <D.23843>:
    // predicted unlikely by continue predictor.
    goto <D.23510>;
    <D.23844>:
    if (native_to_il_offset != 0B) goto <D.23845>; else goto <D.23846>;
    <D.23845>:
    D.23820 = (long unsigned int) i;
    D.23847 = D.23820 * 4;
    D.23848 = native_to_il_offset + D.23847;
    il_offset = *D.23848;
    goto <D.23849>;
    <D.23846>:
    i.15 = (unsigned int) i;
    il_offset = il_offset_from_address (method, debug_info, i.15);
    <D.23849>:
    D.23820 = (long unsigned int) i;
    D.23847 = D.23820 * 4;
    D.23848 = native_to_il_offset + D.23847;
    il_offset = *D.23848;
    if (il_offset < 0) goto <D.23851>; else goto <D.23852>;
    <D.23851>:
    // predicted unlikely by continue predictor.
    goto <D.23510>;
    <D.23852>:
    if (il_offset == prev_il_offset) goto <D.23853>; else goto <D.23854>;
    <D.23853>:
    // predicted unlikely by continue predictor.
    goto <D.23510>;
    <D.23854>:
    prev_il_offset = il_offset;
    il_offset.16 = (unsigned int) il_offset;
    loc = mono_debug_symfile_lookup_location (minfo, il_offset.16);
    if (loc == 0B) goto <D.23856>; else goto <D.23858>;
    <D.23858>:
    D.23859 = loc->source_file;
    if (D.23859 == 0B) goto <D.23856>; else goto <D.23857>;
    <D.23856>:
    // predicted unlikely by continue predictor.
    goto <D.23510>;
    <D.23857>:
    D.23860 = loc->row;
    D.23861 = (int) D.23860;
    prev_line.17 = (int) prev_line;
    line_diff = D.23861 - prev_line.17;
    i.15 = (unsigned int) i;
    D.23863 = i.15 - prev_native_offset;
    addr_diff = (int) D.23863;
    if (first != 0) goto <D.23864>; else goto <D.23865>;
    <D.23864>:
    emit_section_change (w, ".debug_line", 4);
    emit_byte (w, 0);
    emit_byte (w, 9);
    emit_byte (w, 2);
    if (start_symbol != 0B) goto <D.23866>; else goto <D.23867>;
    <D.23866>:
    emit_pointer_unaligned (w, start_symbol);
    goto <D.23868>;
    <D.23867>:
    emit_pointer_value (w, code);
    <D.23868>:
    emit_byte (w, 3);
    D.23860 = loc->row;
    D.23861 = (int) D.23860;
    prev_line.17 = (int) prev_line;
    D.23869 = D.23861 - prev_line.17;
    D.23870 = (long int) D.23869;
    emit_sleb128 (w, D.23870);
    prev_line = loc->row;
    prev_native_offset = (guint32) i;
    first = 0;
    <D.23865>:
    D.23860 = loc->row;
    if (D.23860 != prev_line) goto <D.23871>; else goto <D.23872>;
    <D.23871>:
    if (prev_file_name == 0B) goto <D.23873>; else goto <D.23875>;
    <D.23875>:
    {
      size_t __s1_len;
      size_t __s2_len;

      D.23859 = loc->source_file;
      D.23519 = __builtin_strcmp (D.23859, prev_file_name);
    }
    if (D.23519 != 0) goto <D.23873>; else goto <D.23874>;
    <D.23873>:
    D.23876 = w->collect_line_info;
    if (D.23876 != 0) goto <D.23877>; else goto <D.23878>;
    <D.23877>:
    D.23859 = loc->source_file;
    D.23879 = get_line_number_file_name (w, D.23859);
    file_index = D.23879 + 1;
    goto <D.23880>;
    <D.23878>:
    D.23859 = loc->source_file;
    file_index = emit_line_number_file_name (w, D.23859, 0, 0);
    <D.23880>:
    monoeg_g_free (prev_file_name);
    D.23859 = loc->source_file;
    prev_file_name = monoeg_strdup (D.23859);
    D.23881 = w->cur_file_index;
    if (D.23881 != file_index) goto <D.23882>; else goto <D.23883>;
    <D.23882>:
    emit_byte (w, 4);
    file_index.18 = (unsigned int) file_index;
    emit_uleb128 (w, file_index.18);
    emit_byte (w, 1);
    w->cur_file_index = file_index;
    <D.23883>:
    <D.23874>:
    emit_advance_op (w, line_diff, addr_diff);
    prev_line = loc->row;
    prev_native_offset = (guint32) i;
    <D.23872>:
    mono_debug_symfile_free_location (loc);
  }
  <D.23510>:
  i = i + 1;
  <D.23521>:
  i.15 = (unsigned int) i;
  if (i.15 < code_size) goto <D.23520>; else goto <D.23522>;
  <D.23522>:
  monoeg_g_free (native_to_il_offset);
  monoeg_g_free (prev_file_name);
  if (first == 0) goto <D.23885>; else goto <D.23886>;
  <D.23885>:
  emit_byte (w, 2);
  D.23887 = code_size - prev_native_offset;
  D.23888 = (long int) D.23887;
  emit_sleb128 (w, D.23888);
  emit_byte (w, 1);
  emit_byte (w, 0);
  emit_byte (w, 1);
  emit_byte (w, 1);
  goto <D.23889>;
  <D.23886>:
  if (start_symbol == 0B) goto <D.23890>; else goto <D.23891>;
  <D.23890>:
  {
    char * name;
    char * dis;
    const guint8 * ip;
    int prev_line;
    int prev_native_offset;
    int * il_to_line;

    try
      {
        ip.19 = header->code;
        ip = ip.19;
        name = mono_method_full_name (method, 1);
        D.23893 = w->il_file;
        fprintf (D.23893, "// %s\n", name);
        D.23894 = w->il_file_line_index;
        D.23895 = D.23894 + 1;
        w->il_file_line_index = D.23895;
        monoeg_g_free (name);
        D.23896 = header->code_size;
        D.23897 = (long unsigned int) D.23896;
        D.23898 = D.23897 * 4;
        il_to_line = monoeg_malloc0 (D.23898);
        emit_section_change (w, ".debug_line", 4);
        emit_byte (w, 0);
        emit_byte (w, 9);
        emit_byte (w, 2);
        emit_pointer_value (w, code);
        goto <D.23531>;
        <D.23530>:
        {
          int il_offset;

          ip.20 = ip;
          ip.21 = (long int) ip.20;
          ip.19 = header->code;
          ip.22 = (long int) ip.19;
          D.23902 = ip.21 - ip.22;
          il_offset = (int) D.23902;
          D.23894 = w->il_file_line_index;
          D.23895 = D.23894 + 1;
          w->il_file_line_index = D.23895;
          ip.20 = ip;
          dis = disasm_ins (method, ip.20, &ip);
          D.23893 = w->il_file;
          fprintf (D.23893, "%s\n", dis);
          monoeg_g_free (dis);
          D.23903 = (long unsigned int) il_offset;
          D.23904 = D.23903 * 4;
          D.23905 = il_to_line + D.23904;
          D.23894 = w->il_file_line_index;
          *D.23905 = D.23894;
        }
        <D.23531>:
        ip.19 = header->code;
        D.23896 = header->code_size;
        D.23906 = (sizetype) D.23896;
        D.23907 = ip.19 + D.23906;
        ip.20 = ip;
        if (D.23907 > ip.20) goto <D.23530>; else goto <D.23532>;
        <D.23532>:
        prev_line = 1;
        prev_native_offset = 0;
        i = 0;
        goto <D.23537>;
        <D.23536>:
        {
          struct MonoDebugLineNumberEntry * lne;
          int line;

          D.23815 = debug_info->line_numbers;
          D.23820 = (long unsigned int) i;
          D.23821 = D.23820 * 8;
          lne = D.23815 + D.23821;
          D.23908 = lne->il_offset;
          D.23896 = header->code_size;
          if (D.23908 >= D.23896) goto <D.23909>; else goto <D.23910>;
          <D.23909>:
          // predicted unlikely by continue predictor.
          goto <D.23535>;
          <D.23910>:
          D.23908 = lne->il_offset;
          D.23911 = (long unsigned int) D.23908;
          D.23912 = D.23911 * 4;
          D.23913 = il_to_line + D.23912;
          line = *D.23913;
          if (line == 0) goto <D.23914>; else goto <D.23915>;
          <D.23914>:
          // predicted unlikely by continue predictor.
          goto <D.23535>;
          <D.23915>:
          if (line != prev_line) goto <D.23916>; else goto <D.23917>;
          <D.23916>:
          D.23918 = line - prev_line;
          D.23919 = lne->native_offset;
          D.23920 = (int) D.23919;
          D.23921 = D.23920 - prev_native_offset;
          emit_advance_op (w, D.23918, D.23921);
          prev_line = line;
          D.23919 = lne->native_offset;
          prev_native_offset = (int) D.23919;
          <D.23917>:
        }
        <D.23535>:
        i = i + 1;
        <D.23537>:
        i.13 = (unsigned int) i;
        D.23812 = debug_info->num_line_numbers;
        if (i.13 < D.23812) goto <D.23536>; else goto <D.23538>;
        <D.23538>:
        emit_byte (w, 2);
        prev_native_offset.23 = (unsigned int) prev_native_offset;
        D.23923 = code_size - prev_native_offset.23;
        D.23924 = (long int) D.23923;
        emit_sleb128 (w, D.23924);
        emit_byte (w, 1);
        emit_byte (w, 0);
        emit_byte (w, 1);
        emit_byte (w, 1);
        D.23893 = w->il_file;
        fflush (D.23893);
        monoeg_g_free (il_to_line);
      }
    finally
      {
        ip = {CLOBBER};
      }
  }
  <D.23891>:
  <D.23889>:
  mono_metadata_free_mh (header);
}


compare_lne (struct MonoDebugLineNumberEntry * a, struct MonoDebugLineNumberEntry * b)
{
  unsigned int D.23926;
  unsigned int D.23927;
  gint D.23930;
  unsigned int D.23931;
  unsigned int D.23932;
  unsigned int D.23933;
  unsigned int D.23934;

  D.23926 = a->native_offset;
  D.23927 = b->native_offset;
  if (D.23926 == D.23927) goto <D.23928>; else goto <D.23929>;
  <D.23928>:
  D.23931 = a->il_offset;
  D.23932 = b->il_offset;
  D.23933 = D.23931 - D.23932;
  D.23930 = (gint) D.23933;
  return D.23930;
  <D.23929>:
  D.23926 = a->native_offset;
  D.23927 = b->native_offset;
  D.23934 = D.23926 - D.23927;
  D.23930 = (gint) D.23934;
  return D.23930;
}


memcpy (void * restrict __dest, const void * restrict __src, size_t __len)
{
  void * D.23936;
  long unsigned int D.23937;

  D.23937 = __builtin_object_size (__dest, 0);
  D.23936 = __builtin___memcpy_chk (__dest, __src, __len, D.23937);
  return D.23936;
}


il_offset_from_address (struct MonoMethod * method, struct MonoDebugMethodJitInfo * jit, guint32 native_offset)
{
  struct MonoDebugLineNumberEntry * D.23939;
  gint32 D.23942;
  unsigned int D.23943;
  unsigned int D.23944;
  long unsigned int D.23945;
  long unsigned int D.23946;
  struct MonoDebugLineNumberEntry * D.23947;
  unsigned int D.23948;
  unsigned int D.23951;
  int i;

  D.23939 = jit->line_numbers;
  if (D.23939 == 0B) goto <D.23940>; else goto <D.23941>;
  <D.23940>:
  D.23942 = -1;
  return D.23942;
  <D.23941>:
  D.23943 = jit->num_line_numbers;
  D.23944 = D.23943 + 4294967295;
  i = (int) D.23944;
  goto <D.23458>;
  <D.23457>:
  {
    struct MonoDebugLineNumberEntry lne;

    try
      {
        D.23939 = jit->line_numbers;
        D.23945 = (long unsigned int) i;
        D.23946 = D.23945 * 8;
        D.23947 = D.23939 + D.23946;
        lne = *D.23947;
        D.23948 = lne.native_offset;
        if (D.23948 <= native_offset) goto <D.23949>; else goto <D.23950>;
        <D.23949>:
        D.23951 = lne.il_offset;
        D.23942 = (gint32) D.23951;
        return D.23942;
        <D.23950>:
      }
    finally
      {
        lne = {CLOBBER};
      }
  }
  i = i + -1;
  <D.23458>:
  if (i >= 0) goto <D.23457>; else goto <D.23459>;
  <D.23459>:
  D.23942 = -1;
  return D.23942;
}


emit_pointer_unaligned (struct MonoDwarfWriter * w, const char * target)
{
  struct MonoImageWriter * D.23955;

  D.23955 = w->w;
  img_writer_emit_pointer_unaligned (D.23955, target);
}


get_line_number_file_name (struct MonoDwarfWriter * w, const char * name)
{
  struct GHashTable * D.23956;
  _Bool D.23957;
  long int D.23958;
  long int D.23959;
  void * D.23962;
  long int D.23963;
  _Bool D.23964;
  long int D.23965;
  long int D.23966;
  int D.23969;
  int index;

  D.23956 = w->file_to_index;
  D.23957 = D.23956 == 0B;
  D.23958 = (long int) D.23957;
  D.23959 = __builtin_expect (D.23958, 0);
  if (D.23959 != 0) goto <D.23960>; else goto <D.23961>;
  <D.23960>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dwarfwriter.c", 648, "w->file_to_index");
  <D.23961>:
  D.23956 = w->file_to_index;
  D.23962 = monoeg_g_hash_table_lookup (D.23956, name);
  D.23963 = (long int) D.23962;
  index = (int) D.23963;
  D.23964 = index <= 0;
  D.23965 = (long int) D.23964;
  D.23966 = __builtin_expect (D.23965, 0);
  if (D.23966 != 0) goto <D.23967>; else goto <D.23968>;
  <D.23967>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dwarfwriter.c", 650, "index > 0");
  <D.23968>:
  D.23969 = index + -1;
  return D.23969;
}


emit_line_number_file_name (struct MonoDwarfWriter * w, const char * name, gint64 last_mod_time, gint64 file_size)
{
  struct GHashTable * D.23971;
  struct GHashTable * D.23974;
  void * D.23975;
  long int D.23976;
  int D.23979;
  int D.23980;
  struct GHashTable * D.23983;
  struct GHashTable * D.23986;
  void * D.23987;
  long int D.23988;
  int D.23991;
  int D.23992;
  gchar * D.23993;
  long unsigned int D.23994;
  void * D.23995;
  unsigned int dir_index.24;
  int D.24003;
  int D.24004;
  gchar * D.24005;
  long unsigned int D.24006;
  void * D.24007;
  int index;
  int dir_index;
  char * basename;

  basename = 0B;
  D.23971 = w->file_to_index;
  if (D.23971 == 0B) goto <D.23972>; else goto <D.23973>;
  <D.23972>:
  D.23974 = monoeg_g_hash_table_new (monoeg_g_str_hash, monoeg_g_str_equal);
  w->file_to_index = D.23974;
  <D.23973>:
  D.23971 = w->file_to_index;
  D.23975 = monoeg_g_hash_table_lookup (D.23971, name);
  D.23976 = (long int) D.23975;
  index = (int) D.23976;
  if (index > 0) goto <D.23977>; else goto <D.23978>;
  <D.23977>:
  D.23979 = index;
  return D.23979;
  <D.23978>:
  D.23980 = monoeg_g_path_is_absolute (name);
  if (D.23980 != 0) goto <D.23981>; else goto <D.23982>;
  <D.23981>:
  {
    char * dir;

    dir = monoeg_g_path_get_dirname (name);
    D.23983 = w->dir_to_index;
    if (D.23983 == 0B) goto <D.23984>; else goto <D.23985>;
    <D.23984>:
    D.23986 = monoeg_g_hash_table_new (monoeg_g_str_hash, monoeg_g_str_equal);
    w->dir_to_index = D.23986;
    <D.23985>:
    D.23983 = w->dir_to_index;
    D.23987 = monoeg_g_hash_table_lookup (D.23983, dir);
    D.23988 = (long int) D.23987;
    dir_index = (int) D.23988;
    if (dir_index == 0) goto <D.23989>; else goto <D.23990>;
    <D.23989>:
    emit_section_change (w, ".debug_line", 2);
    emit_string (w, dir);
    D.23991 = w->line_number_dir_index;
    D.23992 = D.23991 + 1;
    w->line_number_dir_index = D.23992;
    dir_index = w->line_number_dir_index;
    D.23983 = w->dir_to_index;
    D.23993 = monoeg_strdup (dir);
    D.23994 = (long unsigned int) dir_index;
    D.23995 = (void *) D.23994;
    monoeg_g_hash_table_insert_replace (D.23983, D.23993, D.23995, 0);
    <D.23990>:
    monoeg_g_free (dir);
    basename = monoeg_g_path_get_basename (name);
  }
  goto <D.23996>;
  <D.23982>:
  dir_index = 0;
  <D.23996>:
  emit_section_change (w, ".debug_line", 3);
  if (basename != 0B) goto <D.23997>; else goto <D.23998>;
  <D.23997>:
  emit_string (w, basename);
  goto <D.23999>;
  <D.23998>:
  emit_string (w, name);
  <D.23999>:
  dir_index.24 = (unsigned int) dir_index;
  emit_uleb128 (w, dir_index.24);
  emit_byte (w, 0);
  emit_byte (w, 0);
  emit_section_change (w, ".debug_line", 4);
  if (basename != 0B) goto <D.24001>; else goto <D.24002>;
  <D.24001>:
  monoeg_g_free (basename);
  <D.24002>:
  D.24003 = w->line_number_file_index;
  D.24004 = D.24003 + 1;
  w->line_number_file_index = D.24004;
  index = w->line_number_file_index;
  D.23971 = w->file_to_index;
  D.24005 = monoeg_strdup (name);
  D.24006 = (long unsigned int) index;
  D.24007 = (void *) D.24006;
  monoeg_g_hash_table_insert_replace (D.23971, D.24005, D.24007, 0);
  D.23979 = index;
  return D.23979;
}


disasm_ins (struct MonoMethod * method, const guchar * ip, const guint8 * * endip)
{
  const guchar * ip.25;
  unsigned char D.24010;
  const guchar * D.24013;
  unsigned char D.24014;
  int D.24015;
  _Bool D.24016;
  long int D.24017;
  long int D.24018;
  long int ip.26;
  const unsigned char * D.24022;
  long int D.24023;
  long int D.24024;
  int D.24025;
  const char * D.24026;
  const guchar * ip.27;
  const char * D.24028;
  char * D.24030;
  char * dis;
  struct MonoDisHelper dh;
  struct MonoMethodHeader * header;

  try
    {
      header = mono_method_get_header (method);
      memset (&dh, 0, 48);
      dh.newline = "";
      dh.label_format = "IL_%04x: ";
      dh.label_target = "IL_%04x";
      dh.tokener = token_handler;
      ip.25 = ip;
      token_handler_ip = ip.25;
      ip.25 = ip;
      D.24010 = *ip.25;
      if (D.24010 == 240) goto <D.24011>; else goto <D.24012>;
      <D.24011>:
      {
        guint32 token;
        void * data;

        ip.25 = ip;
        D.24013 = ip.25 + 1;
        D.24014 = *D.24013;
        D.24015 = (int) D.24014;
        switch (D.24015) <default: <D.23449>, case 0: <D.23445>, case 11: <D.23448>>
        <D.23445>:
        {
          struct MonoJitICallInfo * info;

          ip.25 = ip;
          token = MEM[(const guint32 *)ip.25 + 2B];
          data = mono_method_get_wrapper_data (method, token);
          info = mono_find_jit_icall_by_addr (data);
          D.24016 = info == 0B;
          D.24017 = (long int) D.24016;
          D.24018 = __builtin_expect (D.24017, 0);
          if (D.24018 != 0) goto <D.24019>; else goto <D.24020>;
          <D.24019>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dwarfwriter.c", 1470, "info");
          <D.24020>:
          ip.25 = ip;
          ip.26 = (long int) ip.25;
          D.24022 = header->code;
          D.24023 = (long int) D.24022;
          D.24024 = ip.26 - D.24023;
          D.24025 = (int) D.24024;
          D.24026 = info->name;
          dis = monoeg_g_strdup_printf ("IL_%04x: mono_icall <%s>", D.24025, D.24026);
          ip.25 = ip;
          ip.27 = ip.25 + 6;
          ip = ip.27;
          goto <D.23447>;
        }
        <D.23448>:
        ip.25 = ip;
        token = MEM[(const guint32 *)ip.25 + 2B];
        data = mono_method_get_wrapper_data (method, token);
        ip.25 = ip;
        ip.26 = (long int) ip.25;
        D.24022 = header->code;
        D.24023 = (long int) D.24022;
        D.24024 = ip.26 - D.24023;
        D.24025 = (int) D.24024;
        D.24028 = MEM[(struct MonoClass *)data].name;
        dis = monoeg_g_strdup_printf ("IL_%04x: mono_classconst <%s>", D.24025, D.24028);
        ip.25 = ip;
        ip.27 = ip.25 + 6;
        ip = ip.27;
        goto <D.23447>;
        <D.23449>:
        ip.25 = ip;
        dis = mono_disasm_code_one (&dh, method, ip.25, &ip);
        <D.23447>:
      }
      goto <D.24029>;
      <D.24012>:
      ip.25 = ip;
      dis = mono_disasm_code_one (&dh, method, ip.25, &ip);
      <D.24029>:
      token_handler_ip = 0B;
      ip.25 = ip;
      *endip = ip.25;
      mono_metadata_free_mh (header);
      D.24030 = dis;
      return D.24030;
    }
  finally
    {
      dh = {CLOBBER};
    }
}


token_handler (struct MonoDisHelper * dh, struct MonoMethod * method, guint32 token)
{
  long unsigned int D.24033;
  long unsigned int D.24034;
  const guint8 * token_handler_ip.28;
  unsigned char D.24038;
  int D.24039;
  struct MonoClass * D.24043;
  struct MonoImage * D.24044;
  struct MonoClass * klass.29;
  struct MonoClass * klass.30;
  const char * D.24047;
  char * D.24057;
  char * res;
  char * desc;
  struct MonoMethod * cmethod;
  struct MonoClass * klass;
  struct MonoClassField * field;
  void * data;

  try
    {
      data = 0B;
      D.24033 = BIT_FIELD_REF <*method, 64, 256>;
      D.24034 = D.24033 & 124;
      if (D.24034 != 0) goto <D.24035>; else goto <D.24036>;
      <D.24035>:
      data = mono_method_get_wrapper_data (method, token);
      <D.24036>:
      token_handler_ip.28 = token_handler_ip;
      D.24038 = *token_handler_ip.28;
      D.24039 = (int) D.24038;
      switch (D.24039) <default: <D.23434>, case 40: <D.23427>, case 41: <D.23429>, case 111: <D.23428>, case 115: <D.23426>, case 116: <D.23423>, case 117: <D.23422>, case 123: <D.23430>, case 125: <D.23432>, case 126: <D.23431>, case 128: <D.23433>, case 143: <D.23424>>
      <D.23422>:
      <D.23423>:
      <D.23424>:
      D.24033 = BIT_FIELD_REF <*method, 64, 256>;
      D.24034 = D.24033 & 124;
      if (D.24034 != 0) goto <D.24040>; else goto <D.24041>;
      <D.24040>:
      klass = data;
      goto <D.24042>;
      <D.24041>:
      D.24043 = method->klass;
      D.24044 = D.24043->image;
      klass.29 = mono_class_get_full (D.24044, token, 0B);
      klass = klass.29;
      <D.24042>:
      klass.30 = klass;
      D.24047 = klass.30->name;
      res = monoeg_g_strdup_printf ("<%s>", D.24047);
      goto <D.23425>;
      <D.23426>:
      <D.23427>:
      <D.23428>:
      D.24033 = BIT_FIELD_REF <*method, 64, 256>;
      D.24034 = D.24033 & 124;
      if (D.24034 != 0) goto <D.24048>; else goto <D.24049>;
      <D.24048>:
      cmethod = data;
      goto <D.24050>;
      <D.24049>:
      D.24043 = method->klass;
      D.24044 = D.24043->image;
      cmethod = mono_get_method_full (D.24044, token, 0B, 0B);
      <D.24050>:
      desc = mono_method_full_name (cmethod, 1);
      res = monoeg_g_strdup_printf ("<%s>", desc);
      monoeg_g_free (desc);
      goto <D.23425>;
      <D.23429>:
      D.24033 = BIT_FIELD_REF <*method, 64, 256>;
      D.24034 = D.24033 & 124;
      if (D.24034 != 0) goto <D.24051>; else goto <D.24052>;
      <D.24051>:
      desc = mono_signature_get_desc (data, 0);
      res = monoeg_g_strdup_printf ("<%s>", desc);
      monoeg_g_free (desc);
      goto <D.24053>;
      <D.24052>:
      res = monoeg_g_strdup_printf ("<0x%08x>", token);
      <D.24053>:
      goto <D.23425>;
      <D.23430>:
      <D.23431>:
      <D.23432>:
      <D.23433>:
      D.24033 = BIT_FIELD_REF <*method, 64, 256>;
      D.24034 = D.24033 & 124;
      if (D.24034 != 0) goto <D.24054>; else goto <D.24055>;
      <D.24054>:
      field = data;
      goto <D.24056>;
      <D.24055>:
      D.24043 = method->klass;
      D.24044 = D.24043->image;
      field = mono_field_from_token (D.24044, token, &klass, 0B);
      <D.24056>:
      desc = mono_field_full_name (field);
      res = monoeg_g_strdup_printf ("<%s>", desc);
      monoeg_g_free (desc);
      goto <D.23425>;
      <D.23434>:
      res = monoeg_g_strdup_printf ("<0x%08x>", token);
      goto <D.23425>;
      <D.23425>:
      D.24057 = res;
      return D.24057;
    }
  finally
    {
      klass = {CLOBBER};
    }
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.24062;
  int D.24067;
  void * D.24069;
  long unsigned int D.24070;

  D.24062 = __builtin_constant_p (__len);
  if (D.24062 != 0) goto <D.24063>; else goto <D.24064>;
  <D.24063>:
  if (__len == 0) goto <D.24065>; else goto <D.24066>;
  <D.24065>:
  D.24067 = __builtin_constant_p (__ch);
  if (D.24067 == 0) goto <D.24060>; else goto <D.24068>;
  <D.24068>:
  if (__ch != 0) goto <D.24060>; else goto <D.24061>;
  <D.24060>:
  __warn_memset_zero_len ();
  D.24069 = __dest;
  return D.24069;
  <D.24061>:
  <D.24066>:
  <D.24064>:
  D.24070 = __builtin_object_size (__dest, 0);
  D.24069 = __builtin___memset_chk (__dest, __ch, __len, D.24070);
  return D.24069;
}


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

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


emit_advance_op (struct MonoDwarfWriter * w, int line_diff, int addr_diff)
{
  unsigned int line_diff.31;
  unsigned int D.24075;
  int max_special_addr_diff.32;
  int D.24083;
  int D.24086;
  int D.24087;
  int D.24088;
  int D.24089;
  unsigned char D.24094;
  long int D.24096;
  long int D.24097;
  gint64 opcode;

  opcode = 0;
  line_diff.31 = (unsigned int) line_diff;
  D.24075 = line_diff.31 + 5;
  if (D.24075 <= 13) goto <D.24076>; else goto <D.24077>;
  <D.24076>:
  max_special_addr_diff.32 = max_special_addr_diff;
  if (max_special_addr_diff.32 == 0) goto <D.24079>; else goto <D.24080>;
  <D.24079>:
  max_special_addr_diff = 17;
  <D.24080>:
  max_special_addr_diff.32 = max_special_addr_diff;
  if (addr_diff > max_special_addr_diff.32) goto <D.24081>; else goto <D.24082>;
  <D.24081>:
  max_special_addr_diff.32 = max_special_addr_diff;
  D.24083 = max_special_addr_diff.32 * 2;
  if (D.24083 > addr_diff) goto <D.24084>; else goto <D.24085>;
  <D.24084>:
  emit_byte (w, 8);
  max_special_addr_diff.32 = max_special_addr_diff;
  addr_diff = addr_diff - max_special_addr_diff.32;
  <D.24085>:
  <D.24082>:
  D.24086 = line_diff + 5;
  D.24087 = addr_diff * 14;
  D.24088 = D.24086 + D.24087;
  D.24089 = D.24088 + 13;
  opcode = (gint64) D.24089;
  if (opcode > 255) goto <D.24090>; else goto <D.24091>;
  <D.24090>:
  opcode = 0;
  <D.24091>:
  <D.24077>:
  if (opcode != 0) goto <D.24092>; else goto <D.24093>;
  <D.24092>:
  D.24094 = (unsigned char) opcode;
  emit_byte (w, D.24094);
  goto <D.24095>;
  <D.24093>:
  emit_byte (w, 3);
  D.24096 = (long int) line_diff;
  emit_sleb128 (w, D.24096);
  emit_byte (w, 2);
  D.24097 = (long int) addr_diff;
  emit_sleb128 (w, D.24097);
  emit_byte (w, 1);
  <D.24095>:
}


mono_dwarf_writer_emit_method (struct MonoDwarfWriter * w, struct MonoCompile * cfg, struct MonoMethod * method, char * start_symbol, char * end_symbol, guint8 * code, guint32 code_size, struct MonoInst * * args, struct MonoInst * * locals, struct GSList * unwind_info, struct MonoDebugMethodJitInfo * debug_info)
{
  long unsigned int D.24101;
  long unsigned int D.24102;
  struct MonoClass * D.24104;
  long unsigned int D.24105;
  long unsigned int D.24106;
  <unnamed-unsigned:1> D.24110;
  int D.24111;
  int D.24112;
  short unsigned int D.24113;
  int D.24114;
  int D.24115;
  struct MonoType * D.24116;
  short unsigned int D.24117;
  int D.24118;
  long unsigned int D.24119;
  long unsigned int D.24120;
  sizetype D.24124;
  void * D.24125;
  struct MonoInst * iftmp.33;
  long unsigned int D.24129;
  long unsigned int D.24130;
  struct MonoInst * * D.24131;
  int D.24139;
  int D.24141;
  long unsigned int D.24149;
  long unsigned int D.24150;
  char * * D.24151;
  guint32 iftmp.34;
  char D.24156;
  unsigned char D.24163;
  int D.24164;
  int D.24165;
  struct MonoClass * D.24166;
  struct MonoType * D.24167;
  guint8 * p.35;
  int code_size.36;
  sizetype D.24174;
  guint8 * D.24175;
  sizetype D.24176;
  guint8 * D.24177;
  long int p.37;
  long int buf.38;
  long int D.24180;
  unsigned int D.24181;
  unsigned char D.24183;
  int D.24184;
  struct MonoInst * * D.24185;
  int D.24190;
  guint32 iftmp.39;
  struct MonoDebugLocalVar * D.24199;
  long unsigned int D.24200;
  long unsigned int D.24201;
  struct MonoDebugLocalVar * D.24202;
  int D.24203;
  int D.24205;
  unsigned char D.24215;
  int D.24216;
  int D.24217;
  int D.24220;
  sizetype D.24223;
  guint8 * D.24224;
  sizetype D.24225;
  guint8 * D.24226;
  int D.24232;
  int D.24233;
  const mono_byte * D.24236;
  int D.24239;
  gchar * D.24242;
  gchar * D.24243;
  struct GSList * D.24244;
  struct GSList * D.24245;
  char * name;
  struct MonoMethodSignature * sig;
  struct MonoMethodHeader * header;
  char * * names;
  struct MonoDebugLocalsInfo * locals_info;
  int i;
  guint8 buf[128];
  guint8 * p;

  try
    {
      emit_section_change (w, ".debug_info", 0);
      sig = mono_method_signature (method);
      header = mono_method_get_header (method);
      i = 0;
      goto <D.23570>;
      <D.23569>:
      {
        struct MonoType * t;

        if (i == 0) goto <D.24100>; else goto <D.24098>;
        <D.24100>:
        D.24101 = BIT_FIELD_REF <*sig, 64, 64>;
        D.24102 = D.24101 & 18014398509481984;
        if (D.24102 != 0) goto <D.24103>; else goto <D.24098>;
        <D.24103>:
        D.24104 = method->klass;
        D.24105 = BIT_FIELD_REF <*D.24104, 64, 256>;
        D.24106 = D.24105 & 8;
        if (D.24106 != 0) goto <D.24107>; else goto <D.24108>;
        <D.24107>:
        D.24104 = method->klass;
        t = &D.24104->this_arg;
        goto <D.24109>;
        <D.24108>:
        D.24104 = method->klass;
        t = &D.24104->byval_arg;
        <D.24109>:
        goto <D.24099>;
        <D.24098>:
        D.24110 = sig->hasthis;
        D.24111 = (int) D.24110;
        D.24112 = i - D.24111;
        t = sig->params[D.24112];
        <D.24099>:
        emit_type (w, t);
      }
      i = i + 1;
      <D.23570>:
      D.24113 = sig->param_count;
      D.24114 = (int) D.24113;
      D.24110 = sig->hasthis;
      D.24111 = (int) D.24110;
      D.24115 = D.24114 + D.24111;
      if (D.24115 > i) goto <D.23569>; else goto <D.23571>;
      <D.23571>:
      i = 0;
      goto <D.23573>;
      <D.23572>:
      D.24116 = header->locals[i];
      emit_type (w, D.24116);
      i = i + 1;
      <D.23573>:
      D.24117 = header->num_locals;
      D.24118 = (int) D.24117;
      if (D.24118 > i) goto <D.23572>; else goto <D.23574>;
      <D.23574>:
      D.24113 = sig->param_count;
      D.24119 = (long unsigned int) D.24113;
      D.24120 = D.24119 * 8;
      names = monoeg_malloc0 (D.24120);
      mono_method_get_param_names (method, names);
      emit_uleb128 (w, 2);
      name = mono_method_full_name (method, 0);
      emit_string (w, name);
      emit_string (w, name);
      monoeg_g_free (name);
      if (start_symbol != 0B) goto <D.24121>; else goto <D.24122>;
      <D.24121>:
      emit_pointer_unaligned (w, start_symbol);
      emit_pointer_unaligned (w, end_symbol);
      goto <D.24123>;
      <D.24122>:
      emit_pointer_value (w, code);
      D.24124 = (sizetype) code_size;
      D.24125 = code + D.24124;
      emit_pointer_value (w, D.24125);
      <D.24123>:
      emit_byte (w, 2);
      emit_byte (w, 118);
      emit_byte (w, 16);
      i = 0;
      goto <D.23582>;
      <D.23581>:
      {
        struct MonoInst * arg;
        struct MonoType * t;
        const char * pname;
        char pname_buf[128];
        struct MonoMethodVar * vmv;
        gboolean need_loclist;

        try
          {
            if (args != 0B) goto <D.24127>; else goto <D.24128>;
            <D.24127>:
            D.24129 = (long unsigned int) i;
            D.24130 = D.24129 * 8;
            D.24131 = args + D.24130;
            iftmp.33 = *D.24131;
            goto <D.24132>;
            <D.24128>:
            iftmp.33 = 0B;
            <D.24132>:
            arg = iftmp.33;
            vmv = 0B;
            need_loclist = 0;
            vmv = find_vmv (cfg, arg);
            if (code != 0B) goto <D.24135>; else goto <D.24136>;
            <D.24135>:
            if (vmv != 0B) goto <D.24137>; else goto <D.24138>;
            <D.24137>:
            D.24139 = vmv->live_range_start;
            if (D.24139 != 0) goto <D.24133>; else goto <D.24140>;
            <D.24140>:
            D.24141 = vmv->live_range_end;
            if (D.24141 != 0) goto <D.24133>; else goto <D.24134>;
            <D.24133>:
            need_loclist = 1;
            <D.24134>:
            <D.24138>:
            <D.24136>:
            if (i == 0) goto <D.24144>; else goto <D.24142>;
            <D.24144>:
            D.24101 = BIT_FIELD_REF <*sig, 64, 64>;
            D.24102 = D.24101 & 18014398509481984;
            if (D.24102 != 0) goto <D.24145>; else goto <D.24142>;
            <D.24145>:
            D.24104 = method->klass;
            D.24105 = BIT_FIELD_REF <*D.24104, 64, 256>;
            D.24106 = D.24105 & 8;
            if (D.24106 != 0) goto <D.24146>; else goto <D.24147>;
            <D.24146>:
            D.24104 = method->klass;
            t = &D.24104->this_arg;
            goto <D.24148>;
            <D.24147>:
            D.24104 = method->klass;
            t = &D.24104->byval_arg;
            <D.24148>:
            pname = "this";
            goto <D.24143>;
            <D.24142>:
            D.24110 = sig->hasthis;
            D.24111 = (int) D.24110;
            D.24112 = i - D.24111;
            t = sig->params[D.24112];
            D.24110 = sig->hasthis;
            D.24111 = (int) D.24110;
            D.24112 = i - D.24111;
            D.24149 = (long unsigned int) D.24112;
            D.24150 = D.24149 * 8;
            D.24151 = names + D.24150;
            pname = *D.24151;
            <D.24143>:
            if (need_loclist != 0) goto <D.24153>; else goto <D.24154>;
            <D.24153>:
            iftmp.34 = 15;
            goto <D.24155>;
            <D.24154>:
            iftmp.34 = 3;
            <D.24155>:
            emit_uleb128 (w, iftmp.34);
            D.24156 = *pname;
            if (D.24156 == 0) goto <D.24157>; else goto <D.24158>;
            <D.24157>:
            D.24110 = sig->hasthis;
            D.24111 = (int) D.24110;
            D.24112 = i - D.24111;
            sprintf (&pname_buf, "param%d", D.24112);
            pname = &pname_buf;
            <D.24158>:
            emit_string (w, pname);
            if (arg == 0B) goto <D.24159>; else goto <D.24162>;
            <D.24162>:
            D.24163 = arg->flags;
            D.24164 = (int) D.24163;
            D.24165 = D.24164 & 2;
            if (D.24165 != 0) goto <D.24159>; else goto <D.24160>;
            <D.24159>:
            D.24166 = mono_defaults.int32_class;
            D.24167 = &D.24166->byval_arg;
            emit_var_type (w, D.24167);
            goto <D.24161>;
            <D.24160>:
            emit_var_type (w, t);
            <D.24161>:
            p = &buf;
            p.35 = p;
            encode_var_location (w, arg, p.35, &p);
            if (need_loclist != 0) goto <D.24169>; else goto <D.24170>;
            <D.24169>:
            vmv->live_range_start = 0;
            D.24141 = vmv->live_range_end;
            if (D.24141 == 0) goto <D.24171>; else goto <D.24172>;
            <D.24171>:
            code_size.36 = (int) code_size;
            vmv->live_range_end = code_size.36;
            <D.24172>:
            D.24139 = vmv->live_range_start;
            D.24174 = (sizetype) D.24139;
            D.24175 = code + D.24174;
            D.24141 = vmv->live_range_end;
            D.24176 = (sizetype) D.24141;
            D.24177 = code + D.24176;
            p.35 = p;
            p.37 = (long int) p.35;
            buf.38 = (long int) &buf;
            D.24180 = p.37 - buf.38;
            D.24181 = (unsigned int) D.24180;
            emit_loclist (w, arg, D.24175, D.24177, &buf, D.24181);
            goto <D.24182>;
            <D.24170>:
            p.35 = p;
            p.37 = (long int) p.35;
            buf.38 = (long int) &buf;
            D.24180 = p.37 - buf.38;
            D.24183 = (unsigned char) D.24180;
            emit_byte (w, D.24183);
            p.35 = p;
            p.37 = (long int) p.35;
            buf.38 = (long int) &buf;
            D.24180 = p.37 - buf.38;
            D.24184 = (int) D.24180;
            emit_bytes (w, &buf, D.24184);
            <D.24182>:
          }
        finally
          {
            pname_buf = {CLOBBER};
          }
      }
      i = i + 1;
      <D.23582>:
      D.24113 = sig->param_count;
      D.24114 = (int) D.24113;
      D.24110 = sig->hasthis;
      D.24111 = (int) D.24110;
      D.24115 = D.24114 + D.24111;
      if (D.24115 > i) goto <D.23581>; else goto <D.23583>;
      <D.23583>:
      monoeg_g_free (names);
      locals_info = mono_debug_lookup_locals (method);
      i = 0;
      goto <D.23594>;
      <D.23593>:
      {
        struct MonoInst * ins;
        char name_buf[128];
        int j;
        struct MonoMethodVar * vmv;
        gboolean need_loclist;
        char * lname;

        try
          {
            D.24129 = (long unsigned int) i;
            D.24130 = D.24129 * 8;
            D.24185 = locals + D.24130;
            ins = *D.24185;
            vmv = 0B;
            need_loclist = 0;
            vmv = find_vmv (cfg, ins);
            if (code != 0B) goto <D.24186>; else goto <D.24187>;
            <D.24186>:
            if (vmv != 0B) goto <D.24188>; else goto <D.24189>;
            <D.24188>:
            D.24190 = vmv->live_range_start;
            if (D.24190 != 0) goto <D.24191>; else goto <D.24192>;
            <D.24191>:
            need_loclist = 1;
            <D.24192>:
            <D.24189>:
            <D.24187>:
            if (need_loclist != 0) goto <D.24194>; else goto <D.24195>;
            <D.24194>:
            iftmp.39 = 12;
            goto <D.24196>;
            <D.24195>:
            iftmp.39 = 11;
            <D.24196>:
            emit_uleb128 (w, iftmp.39);
            lname = 0B;
            if (locals_info != 0B) goto <D.24197>; else goto <D.24198>;
            <D.24197>:
            j = 0;
            goto <D.23592>;
            <D.23591>:
            D.24199 = locals_info->locals;
            D.24200 = (long unsigned int) j;
            D.24201 = D.24200 * 24;
            D.24202 = D.24199 + D.24201;
            D.24203 = D.24202->index;
            if (D.24203 == i) goto <D.23590>; else goto <D.24204>;
            <D.24204>:
            j = j + 1;
            <D.23592>:
            D.24205 = locals_info->num_locals;
            if (D.24205 > j) goto <D.23591>; else goto <D.23590>;
            <D.23590>:
            D.24205 = locals_info->num_locals;
            if (D.24205 > j) goto <D.24206>; else goto <D.24207>;
            <D.24206>:
            D.24199 = locals_info->locals;
            D.24200 = (long unsigned int) j;
            D.24201 = D.24200 * 24;
            D.24202 = D.24199 + D.24201;
            lname = D.24202->name;
            <D.24207>:
            <D.24198>:
            if (lname != 0B) goto <D.24208>; else goto <D.24209>;
            <D.24208>:
            emit_string (w, lname);
            goto <D.24210>;
            <D.24209>:
            sprintf (&name_buf, "V_%d", i);
            emit_string (w, &name_buf);
            <D.24210>:
            if (ins == 0B) goto <D.24211>; else goto <D.24214>;
            <D.24214>:
            D.24215 = ins->flags;
            D.24216 = (int) D.24215;
            D.24217 = D.24216 & 2;
            if (D.24217 != 0) goto <D.24211>; else goto <D.24212>;
            <D.24211>:
            D.24166 = mono_defaults.int32_class;
            D.24167 = &D.24166->byval_arg;
            emit_var_type (w, D.24167);
            goto <D.24213>;
            <D.24212>:
            D.24116 = header->locals[i];
            emit_var_type (w, D.24116);
            <D.24213>:
            p = &buf;
            p.35 = p;
            encode_var_location (w, ins, p.35, &p);
            if (need_loclist != 0) goto <D.24218>; else goto <D.24219>;
            <D.24218>:
            D.24220 = vmv->live_range_end;
            if (D.24220 == 0) goto <D.24221>; else goto <D.24222>;
            <D.24221>:
            code_size.36 = (int) code_size;
            vmv->live_range_end = code_size.36;
            <D.24222>:
            D.24190 = vmv->live_range_start;
            D.24223 = (sizetype) D.24190;
            D.24224 = code + D.24223;
            D.24220 = vmv->live_range_end;
            D.24225 = (sizetype) D.24220;
            D.24226 = code + D.24225;
            p.35 = p;
            p.37 = (long int) p.35;
            buf.38 = (long int) &buf;
            D.24180 = p.37 - buf.38;
            D.24181 = (unsigned int) D.24180;
            emit_loclist (w, ins, D.24224, D.24226, &buf, D.24181);
            goto <D.24227>;
            <D.24219>:
            p.35 = p;
            p.37 = (long int) p.35;
            buf.38 = (long int) &buf;
            D.24180 = p.37 - buf.38;
            D.24183 = (unsigned char) D.24180;
            emit_byte (w, D.24183);
            p.35 = p;
            p.37 = (long int) p.35;
            buf.38 = (long int) &buf;
            D.24180 = p.37 - buf.38;
            D.24184 = (int) D.24180;
            emit_bytes (w, &buf, D.24184);
            <D.24227>:
          }
        finally
          {
            name_buf = {CLOBBER};
          }
      }
      i = i + 1;
      <D.23594>:
      D.24117 = header->num_locals;
      D.24118 = (int) D.24117;
      if (D.24118 > i) goto <D.23593>; else goto <D.23595>;
      <D.23595>:
      if (locals_info != 0B) goto <D.24228>; else goto <D.24229>;
      <D.24228>:
      mono_debug_symfile_free_locals (locals_info);
      <D.24229>:
      emit_uleb128 (w, 0);
      emit_line (w);
      emit_debug_info_end (w);
      if (unwind_info != 0B) goto <D.24230>; else goto <D.24231>;
      <D.24230>:
      D.24232 = w->fde_index;
      emit_fde (w, D.24232, start_symbol, end_symbol, code, code_size, unwind_info, 1);
      D.24232 = w->fde_index;
      D.24233 = D.24232 + 1;
      w->fde_index = D.24233;
      <D.24231>:
      if (debug_info != 0B) goto <D.24234>; else goto <D.24235>;
      <D.24234>:
      D.24236 = debug_info->code_start;
      if (D.24236 == code) goto <D.24237>; else goto <D.24238>;
      <D.24237>:
      D.24239 = w->collect_line_info;
      if (D.24239 != 0) goto <D.24240>; else goto <D.24241>;
      <D.24240>:
      {
        struct MethodLineNumberInfo * info;

        info = monoeg_malloc0 (40);
        info->method = method;
        D.24242 = monoeg_strdup (start_symbol);
        info->start_symbol = D.24242;
        D.24243 = monoeg_strdup (end_symbol);
        info->end_symbol = D.24243;
        info->code = code;
        info->code_size = code_size;
        D.24244 = w->line_info;
        D.24245 = monoeg_g_slist_prepend (D.24244, info);
        w->line_info = D.24245;
      }
      goto <D.24246>;
      <D.24241>:
      emit_line_number_info (w, method, start_symbol, end_symbol, code, code_size, debug_info);
      <D.24246>:
      <D.24238>:
      <D.24235>:
      emit_line (w);
      mono_metadata_free_mh (header);
    }
  finally
    {
      buf = {CLOBBER};
      p = {CLOBBER};
    }
}


emit_type (struct MonoDwarfWriter * w, struct MonoType * t)
{
  long unsigned int D.24247;
  long unsigned int D.24248;
  unsigned char D.24251;
  struct MonoClass * D.24257;
  int D.24258;
  int D.24259;
  unsigned int j.40;
  int D.24266;
  long unsigned int D.24270;
  long unsigned int D.24271;
  int D.24274;
  struct MonoClass * klass;
  int j;
  const char * tdie;

  klass = mono_class_from_mono_type (t);
  D.24247 = BIT_FIELD_REF <*t, 64, 64>;
  D.24248 = D.24247 & 1073741824;
  if (D.24248 != 0) goto <D.24249>; else goto <D.24250>;
  <D.24249>:
  D.24251 = t->type;
  if (D.24251 == 17) goto <D.24252>; else goto <D.24253>;
  <D.24252>:
  tdie = emit_class_dwarf_info (w, klass, 1);
  if (tdie != 0B) goto <D.24254>; else goto <D.24255>;
  <D.24254>:
  return;
  <D.24255>:
  goto <D.24256>;
  <D.24253>:
  emit_class_dwarf_info (w, klass, 0);
  <D.24256>:
  D.24257 = mono_defaults.int_class;
  t = &D.24257->byval_arg;
  <D.24250>:
  j = 0;
  goto <D.23382>;
  <D.23381>:
  D.24258 = basic_types[j].type;
  D.24251 = t->type;
  D.24259 = (int) D.24251;
  if (D.24258 == D.24259) goto <D.23380>; else goto <D.24260>;
  <D.24260>:
  j = j + 1;
  <D.23382>:
  j.40 = (unsigned int) j;
  if (j.40 <= 16) goto <D.23381>; else goto <D.23380>;
  <D.23380>:
  j.40 = (unsigned int) j;
  if (j.40 <= 16) goto <D.24262>; else goto <D.24263>;
  <D.24262>:
  if (j <= 63) goto <D.24264>; else goto <D.24265>;
  <D.24264>:
  D.24266 = base_types_emitted[j];
  if (D.24266 == 0) goto <D.24267>; else goto <D.24268>;
  <D.24267>:
  emit_class_dwarf_info (w, klass, 0);
  base_types_emitted[j] = 1;
  <D.24268>:
  <D.24265>:
  goto <D.24269>;
  <D.24263>:
  D.24251 = t->type;
  D.24259 = (int) D.24251;
  switch (D.24259) <default: <D.23389>, case 15: <D.23388>, case 17: <D.23386>, case 18: <D.23383>, case 20: <D.23385>, case 21: <D.23387>>
  <D.23383>:
  emit_class_dwarf_info (w, klass, 0);
  goto <D.23384>;
  <D.23385>:
  goto <D.23384>;
  <D.23386>:
  D.24270 = BIT_FIELD_REF <*klass, 64, 256>;
  D.24271 = D.24270 & 16;
  if (D.24271 != 0) goto <D.24272>; else goto <D.24273>;
  <D.24272>:
  emit_class_dwarf_info (w, klass, 0);
  <D.24273>:
  goto <D.23384>;
  <D.23387>:
  D.24274 = mono_type_is_struct (t);
  if (D.24274 == 0) goto <D.24275>; else goto <D.24276>;
  <D.24275>:
  emit_class_dwarf_info (w, klass, 0);
  <D.24276>:
  goto <D.23384>;
  <D.23388>:
  goto <D.23384>;
  <D.23389>:
  goto <D.23384>;
  <D.23384>:
  <D.24269>:
}


emit_class_dwarf_info (struct MonoDwarfWriter * w, struct MonoClass * klass, gboolean vtype)
{
  char * D.24284;
  unsigned char D.24288;
  long unsigned int D.24295;
  long unsigned int D.24296;
  unsigned char D.24300;
  const char * D.24304;
  const char * iftmp.41;
  const char * D.24309;
  char D.24310;
  int D.24313;
  int D.24314;
  struct GHashTable * D.24315;
  struct GHashTable * D.24316;
  struct MonoType * D.24319;
  struct MonoClass * D.24320;
  unsigned int size.42;
  int D.24322;
  struct MonoType * D.24323;
  unsigned char D.24324;
  int D.24325;
  unsigned int k.43;
  _Bool D.24328;
  long int D.24329;
  long int D.24330;
  const char * D.24333;
  int D.23319;
  int iftmp.44;
  int D.23315;
  const char[8] * D.24337;
  unsigned char D.24338;
  int D.24339;
  unsigned char D.24340;
  int D.24341;
  const unsigned char * D.24346;
  unsigned char D.24347;
  int D.24348;
  const unsigned char * D.24349;
  unsigned char D.24350;
  int D.24351;
  const unsigned char * D.24356;
  unsigned char D.24357;
  int D.24358;
  const unsigned char * D.24359;
  unsigned char D.24360;
  int D.24361;
  const unsigned char * D.24366;
  unsigned char D.24367;
  int D.24368;
  const unsigned char * D.24369;
  unsigned char D.24370;
  int D.24371;
  const char * D.24373;
  struct MonoType * D.24376;
  short unsigned int D.24377;
  int D.24378;
  int D.24379;
  int D.23329;
  int iftmp.45;
  int D.23328;
  const char[9] * D.24385;
  unsigned char D.24386;
  int D.24387;
  unsigned char D.24388;
  int D.24389;
  const unsigned char * D.24394;
  unsigned char D.24395;
  int D.24396;
  const unsigned char * D.24397;
  unsigned char D.24398;
  int D.24399;
  const unsigned char * D.24404;
  unsigned char D.24405;
  int D.24406;
  const unsigned char * D.24407;
  unsigned char D.24408;
  int D.24409;
  const unsigned char * D.24414;
  unsigned char D.24415;
  int D.24416;
  const unsigned char * D.24417;
  unsigned char D.24418;
  int D.24419;
  const char * D.24421;
  const char * D.24424;
  const char * p.46;
  const char * p.47;
  unsigned int D.24427;
  struct MonoType * D.24428;
  unsigned char D.24429;
  int D.24430;
  char D.24431;
  long int D.24432;
  short unsigned int D.24433;
  long int D.24434;
  unsigned int D.24435;
  long int D.24436;
  long unsigned int D.24437;
  long int D.24438;
  struct MonoClass * D.24440;
  int D.24444;
  int iftmp.48;
  struct MonoClassField * D.24452;
  guint32 iftmp.49;
  int D.24457;
  unsigned int D.24458;
  guint8 * p.50;
  guint8 * p.51;
  guint8 * p.52;
  long int p.53;
  long int buf.54;
  long int D.24466;
  unsigned char D.24467;
  int D.24468;
  const char * D.24473;
  guint8 * p.55;
  guint8 * p.56;
  long unsigned int D.24478;
  int D.24481;
  unsigned int D.24482;
  unsigned int D.24483;
  char * die;
  char * pointer_die;
  char * reference_die;
  char * full_name;
  char * p;
  void * iter;
  struct MonoClassField * field;
  const char * fdie;
  int k;
  gboolean emit_namespace;
  gboolean has_children;
  struct GHashTable * cache;

  try
    {
      emit_namespace = 0;
      if (vtype != 0) goto <D.24279>; else goto <D.24280>;
      <D.24279>:
      cache = w->class_to_vtype_die;
      goto <D.24281>;
      <D.24280>:
      cache = w->class_to_die;
      <D.24281>:
      die = monoeg_g_hash_table_lookup (cache, klass);
      if (die != 0B) goto <D.24282>; else goto <D.24283>;
      <D.24282>:
      D.24284 = die;
      return D.24284;
      <D.24283>:
      D.24288 = klass->byval_arg.type;
      if (D.24288 != 18) goto <D.24289>; else goto <D.24290>;
      <D.24289>:
      D.24288 = klass->byval_arg.type;
      if (D.24288 != 28) goto <D.24291>; else goto <D.24292>;
      <D.24291>:
      D.24288 = klass->byval_arg.type;
      if (D.24288 != 21) goto <D.24293>; else goto <D.24294>;
      <D.24293>:
      D.24295 = BIT_FIELD_REF <*klass, 64, 256>;
      D.24296 = D.24295 & 16;
      if (D.24296 == 0) goto <D.24297>; else goto <D.24298>;
      <D.24297>:
      D.24288 = klass->byval_arg.type;
      if (D.24288 != 17) goto <D.24287>; else goto <D.24299>;
      <D.24299>:
      if (vtype == 0) goto <D.24287>; else goto <D.24286>;
      <D.24287>:
      D.24288 = klass->byval_arg.type;
      D.24300 = D.24288 + 254;
      if (D.24300 > 11) goto <D.24285>; else goto <D.24301>;
      <D.24301>:
      if (vtype != 0) goto <D.24285>; else goto <D.24286>;
      <D.24285>:
      D.24284 = 0B;
      return D.24284;
      <D.24286>:
      <D.24298>:
      <D.24294>:
      <D.24292>:
      <D.24290>:
      if (emit_namespace != 0) goto <D.24302>; else goto <D.24303>;
      <D.24302>:
      emit_uleb128 (w, 10);
      D.24304 = klass->name_space;
      emit_string (w, D.24304);
      <D.24303>:
      D.24304 = klass->name_space;
      D.24304 = klass->name_space;
      if (D.24304 != 0B) goto <D.24306>; else goto <D.24307>;
      <D.24306>:
      iftmp.41 = ".";
      goto <D.24308>;
      <D.24307>:
      iftmp.41 = "";
      <D.24308>:
      D.24309 = klass->name;
      full_name = monoeg_g_strdup_printf ("%s%s%s", D.24304, iftmp.41, D.24309);
      p = full_name;
      goto <D.23302>;
      <D.23301>:
      D.24310 = *p;
      if (D.24310 == 46) goto <D.24311>; else goto <D.24312>;
      <D.24311>:
      *p = 95;
      <D.24312>:
      p = p + 1;
      <D.23302>:
      D.24310 = *p;
      if (D.24310 != 0) goto <D.23301>; else goto <D.23303>;
      <D.23303>:
      D.24313 = w->tdie_index;
      die = monoeg_g_strdup_printf (".LTDIE_%d", D.24313);
      D.24313 = w->tdie_index;
      pointer_die = monoeg_g_strdup_printf (".LTDIE_%d_POINTER", D.24313);
      D.24313 = w->tdie_index;
      reference_die = monoeg_g_strdup_printf (".LTDIE_%d_REFERENCE", D.24313);
      D.24313 = w->tdie_index;
      D.24314 = D.24313 + 1;
      w->tdie_index = D.24314;
      D.24315 = w->class_to_pointer_die;
      monoeg_g_hash_table_insert_replace (D.24315, klass, pointer_die, 0);
      D.24316 = w->class_to_reference_die;
      monoeg_g_hash_table_insert_replace (D.24316, klass, reference_die, 0);
      monoeg_g_hash_table_insert_replace (cache, klass, die, 0);
      D.24295 = BIT_FIELD_REF <*klass, 64, 256>;
      D.24296 = D.24295 & 16;
      if (D.24296 != 0) goto <D.24317>; else goto <D.24318>;
      <D.24317>:
      {
        int size;

        D.24319 = mono_class_enum_basetype (klass);
        D.24320 = mono_class_from_mono_type (D.24319);
        size = mono_class_value_size (D.24320, 0B);
        emit_label (w, die);
        emit_uleb128 (w, 8);
        emit_string (w, full_name);
        size.42 = (unsigned int) size;
        emit_uleb128 (w, size.42);
        k = 0;
        goto <D.23307>;
        <D.23306>:
        D.24322 = basic_types[k].type;
        D.24323 = mono_class_enum_basetype (klass);
        D.24324 = D.24323->type;
        D.24325 = (int) D.24324;
        if (D.24322 == D.24325) goto <D.23305>; else goto <D.24326>;
        <D.24326>:
        k = k + 1;
        <D.23307>:
        k.43 = (unsigned int) k;
        if (k.43 <= 16) goto <D.23306>; else goto <D.23305>;
        <D.23305>:
        k.43 = (unsigned int) k;
        D.24328 = k.43 > 16;
        D.24329 = (long int) D.24328;
        D.24330 = __builtin_expect (D.24329, 0);
        if (D.24330 != 0) goto <D.24331>; else goto <D.24332>;
        <D.24331>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dwarfwriter.c", 1055, "k < G_N_ELEMENTS (basic_types)");
        <D.24332>:
        D.24333 = basic_types[k].die_name;
        emit_symbol_diff (w, D.24333, ".Ldebug_info_start", 0);
        iter = 0B;
        goto <D.23320>;
        <D.23344>:
        {
          const char * p;
          int len;
          MonoTypeEnum def_type;

          try
            {
              {
                size_t __s1_len;
                size_t __s2_len;

                __s1_len = 7;
                if (__s1_len <= 3) goto <D.24335>; else goto <D.24336>;
                <D.24335>:
                {
                  const unsigned char * __s2;
                  int __result;

                  __s2 = mono_field_get_name (field);
                  D.24337 = "value__";
                  D.24338 = MEM[(const unsigned char *)D.24337];
                  D.24339 = (int) D.24338;
                  D.24340 = *__s2;
                  D.24341 = (int) D.24340;
                  __result = D.24339 - D.24341;
                  {
                    if (__s1_len != 0) goto <D.24342>; else goto <D.24343>;
                    <D.24342>:
                    if (__result == 0) goto <D.24344>; else goto <D.24345>;
                    <D.24344>:
                    D.24346 = &MEM[(void *)"value__" + 1B];
                    D.24347 = *D.24346;
                    D.24348 = (int) D.24347;
                    D.24349 = __s2 + 1;
                    D.24350 = *D.24349;
                    D.24351 = (int) D.24350;
                    __result = D.24348 - D.24351;
                    if (__s1_len > 1) goto <D.24352>; else goto <D.24353>;
                    <D.24352>:
                    if (__result == 0) goto <D.24354>; else goto <D.24355>;
                    <D.24354>:
                    D.24356 = &MEM[(void *)"value__" + 2B];
                    D.24357 = *D.24356;
                    D.24358 = (int) D.24357;
                    D.24359 = __s2 + 2;
                    D.24360 = *D.24359;
                    D.24361 = (int) D.24360;
                    __result = D.24358 - D.24361;
                    if (__s1_len > 2) goto <D.24362>; else goto <D.24363>;
                    <D.24362>:
                    if (__result == 0) goto <D.24364>; else goto <D.24365>;
                    <D.24364>:
                    D.24366 = &MEM[(void *)"value__" + 3B];
                    D.24367 = *D.24366;
                    D.24368 = (int) D.24367;
                    D.24369 = __s2 + 3;
                    D.24370 = *D.24369;
                    D.24371 = (int) D.24370;
                    __result = D.24368 - D.24371;
                    <D.24365>:
                    <D.24363>:
                    <D.24355>:
                    <D.24353>:
                    <D.24345>:
                    <D.24343>:
                  }
                  D.23315 = __result;
                }
                iftmp.44 = D.23315;
                goto <D.24372>;
                <D.24336>:
                D.24373 = mono_field_get_name (field);
                iftmp.44 = __builtin_strcmp ("value__", D.24373);
                <D.24372>:
                D.23319 = iftmp.44;
              }
              if (D.23319 == 0) goto <D.24374>; else goto <D.24375>;
              <D.24374>:
              // predicted unlikely by continue predictor.
              goto <D.23320>;
              <D.24375>:
              D.24376 = field->type;
              D.24377 = D.24376->attrs;
              D.24378 = (int) D.24377;
              D.24379 = D.24378 & 1536;
              if (D.24379 != 0) goto <D.24380>; else goto <D.24381>;
              <D.24380>:
              {
                size_t __s1_len;
                size_t __s2_len;

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

                  __s2 = mono_field_get_name (field);
                  D.24385 = "_Deleted";
                  D.24386 = MEM[(const unsigned char *)D.24385];
                  D.24387 = (int) D.24386;
                  D.24388 = *__s2;
                  D.24389 = (int) D.24388;
                  __result = D.24387 - D.24389;
                  {
                    if (__s2_len != 0) goto <D.24390>; else goto <D.24391>;
                    <D.24390>:
                    if (__result == 0) goto <D.24392>; else goto <D.24393>;
                    <D.24392>:
                    D.24394 = &MEM[(void *)"_Deleted" + 1B];
                    D.24395 = *D.24394;
                    D.24396 = (int) D.24395;
                    D.24397 = __s2 + 1;
                    D.24398 = *D.24397;
                    D.24399 = (int) D.24398;
                    __result = D.24396 - D.24399;
                    if (__s2_len > 1) goto <D.24400>; else goto <D.24401>;
                    <D.24400>:
                    if (__result == 0) goto <D.24402>; else goto <D.24403>;
                    <D.24402>:
                    D.24404 = &MEM[(void *)"_Deleted" + 2B];
                    D.24405 = *D.24404;
                    D.24406 = (int) D.24405;
                    D.24407 = __s2 + 2;
                    D.24408 = *D.24407;
                    D.24409 = (int) D.24408;
                    __result = D.24406 - D.24409;
                    if (__s2_len > 2) goto <D.24410>; else goto <D.24411>;
                    <D.24410>:
                    if (__result == 0) goto <D.24412>; else goto <D.24413>;
                    <D.24412>:
                    D.24414 = &MEM[(void *)"_Deleted" + 3B];
                    D.24415 = *D.24414;
                    D.24416 = (int) D.24415;
                    D.24417 = __s2 + 3;
                    D.24418 = *D.24417;
                    D.24419 = (int) D.24418;
                    __result = D.24416 - D.24419;
                    <D.24413>:
                    <D.24411>:
                    <D.24403>:
                    <D.24401>:
                    <D.24393>:
                    <D.24391>:
                  }
                  D.23328 = __result;
                }
                iftmp.45 = -D.23328;
                goto <D.24420>;
                <D.24384>:
                D.24421 = mono_field_get_name (field);
                iftmp.45 = __builtin_strcmp (D.24421, "_Deleted");
                <D.24420>:
                D.23329 = iftmp.45;
              }
              if (D.23329 == 0) goto <D.24422>; else goto <D.24423>;
              <D.24422>:
              // predicted unlikely by continue predictor.
              goto <D.23320>;
              <D.24423>:
              <D.24381>:
              emit_uleb128 (w, 9);
              D.24424 = mono_field_get_name (field);
              emit_string (w, D.24424);
              p.46 = mono_class_get_field_default_value (field, &def_type);
              p = p.46;
              p.47 = p;
              D.24427 = mono_metadata_decode_blob_size (p.47, &p);
              len = (int) D.24427;
              D.24428 = mono_class_enum_basetype (klass);
              D.24429 = D.24428->type;
              D.24430 = (int) D.24429;
              switch (D.24430) <default: <D.23343>, case 2: <D.23332>, case 3: <D.23336>, case 4: <D.23331>, case 5: <D.23330>, case 6: <D.23335>, case 7: <D.23334>, case 8: <D.23338>, case 9: <D.23337>, case 10: <D.23340>, case 11: <D.23339>, case 24: <D.23341>, case 25: <D.23342>>
              <D.23330>:
              <D.23331>:
              <D.23332>:
              p.47 = p;
              D.24431 = *p.47;
              D.24432 = (long int) D.24431;
              emit_sleb128 (w, D.24432);
              goto <D.23333>;
              <D.23334>:
              <D.23335>:
              <D.23336>:
              p.47 = p;
              D.24433 = MEM[(const guint16 *)p.47];
              D.24434 = (long int) D.24433;
              emit_sleb128 (w, D.24434);
              goto <D.23333>;
              <D.23337>:
              <D.23338>:
              p.47 = p;
              D.24435 = MEM[(const guint32 *)p.47];
              D.24436 = (long int) D.24435;
              emit_sleb128 (w, D.24436);
              goto <D.23333>;
              <D.23339>:
              <D.23340>:
              p.47 = p;
              D.24437 = MEM[(const guint64 *)p.47];
              D.24438 = (long int) D.24437;
              emit_sleb128 (w, D.24438);
              goto <D.23333>;
              <D.23341>:
              <D.23342>:
              p.47 = p;
              D.24437 = MEM[(const guint64 *)p.47];
              D.24438 = (long int) D.24437;
              emit_sleb128 (w, D.24438);
              goto <D.23333>;
              <D.23343>:
              monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "dwarfwriter.c", 1103);
              <D.23333>:
            }
          finally
            {
              p = {CLOBBER};
              def_type = {CLOBBER};
            }
        }
        <D.23320>:
        field = mono_class_get_fields (klass, &iter);
        if (field != 0B) goto <D.23344>; else goto <D.23345>;
        <D.23345>:
        has_children = 1;
      }
      goto <D.24439>;
      <D.24318>:
      {
        guint8 buf[128];
        guint8 * p;
        char * parent_die;

        try
          {
            D.24440 = klass->parent;
            if (D.24440 != 0B) goto <D.24441>; else goto <D.24442>;
            <D.24441>:
            D.24440 = klass->parent;
            parent_die = emit_class_dwarf_info (w, D.24440, 0);
            goto <D.24443>;
            <D.24442>:
            parent_die = 0B;
            <D.24443>:
            iter = 0B;
            goto <D.23349>;
            <D.23350>:
            D.24376 = field->type;
            D.24377 = D.24376->attrs;
            D.24378 = (int) D.24377;
            D.24444 = D.24378 & 16;
            if (D.24444 != 0) goto <D.24445>; else goto <D.24446>;
            <D.24445>:
            // predicted unlikely by continue predictor.
            goto <D.23349>;
            <D.24446>:
            D.24376 = field->type;
            emit_type (w, D.24376);
            <D.23349>:
            field = mono_class_get_fields (klass, &iter);
            if (field != 0B) goto <D.23350>; else goto <D.23351>;
            <D.23351>:
            iter = 0B;
            if (parent_die != 0B) goto <D.24448>; else goto <D.24451>;
            <D.24451>:
            D.24452 = mono_class_get_fields (klass, &iter);
            if (D.24452 != 0B) goto <D.24448>; else goto <D.24449>;
            <D.24448>:
            iftmp.48 = 1;
            goto <D.24450>;
            <D.24449>:
            iftmp.48 = 0;
            <D.24450>:
            has_children = iftmp.48;
            emit_label (w, die);
            if (has_children != 0) goto <D.24454>; else goto <D.24455>;
            <D.24454>:
            iftmp.49 = 5;
            goto <D.24456>;
            <D.24455>:
            iftmp.49 = 17;
            <D.24456>:
            emit_uleb128 (w, iftmp.49);
            emit_string (w, full_name);
            D.24457 = klass->instance_size;
            D.24458 = (unsigned int) D.24457;
            emit_uleb128 (w, D.24458);
            if (parent_die != 0B) goto <D.24459>; else goto <D.24460>;
            <D.24459>:
            emit_uleb128 (w, 16);
            emit_symbol_diff (w, parent_die, ".Ldebug_info_start", 0);
            p = &buf;
            p.50 = p;
            p.51 = p.50;
            p.52 = p.51 + 1;
            p = p.52;
            *p.51 = 35;
            p.50 = p;
            encode_uleb128 (0, p.50, &p);
            p.50 = p;
            p.53 = (long int) p.50;
            buf.54 = (long int) &buf;
            D.24466 = p.53 - buf.54;
            D.24467 = (unsigned char) D.24466;
            emit_byte (w, D.24467);
            p.50 = p;
            p.53 = (long int) p.50;
            buf.54 = (long int) &buf;
            D.24466 = p.53 - buf.54;
            D.24468 = (int) D.24466;
            emit_bytes (w, &buf, D.24468);
            <D.24460>:
            iter = 0B;
            goto <D.23352>;
            <D.23353>:
            D.24376 = field->type;
            D.24377 = D.24376->attrs;
            D.24378 = (int) D.24377;
            D.24444 = D.24378 & 16;
            if (D.24444 != 0) goto <D.24469>; else goto <D.24470>;
            <D.24469>:
            // predicted unlikely by continue predictor.
            goto <D.23352>;
            <D.24470>:
            D.24376 = field->type;
            fdie = get_type_die (w, D.24376);
            if (fdie != 0B) goto <D.24471>; else goto <D.24472>;
            <D.24471>:
            emit_uleb128 (w, 6);
            D.24473 = field->name;
            emit_string (w, D.24473);
            emit_symbol_diff (w, fdie, ".Ldebug_info_start", 0);
            p = &buf;
            p.50 = p;
            p.55 = p.50;
            p.56 = p.55 + 1;
            p = p.56;
            *p.55 = 35;
            D.24295 = BIT_FIELD_REF <*klass, 64, 256>;
            D.24478 = D.24295 & 8;
            if (D.24478 != 0) goto <D.24479>; else goto <D.24476>;
            <D.24479>:
            if (vtype != 0) goto <D.24480>; else goto <D.24476>;
            <D.24480>:
            D.24481 = field->offset;
            D.24482 = (unsigned int) D.24481;
            D.24483 = D.24482 + 4294967280;
            p.50 = p;
            encode_uleb128 (D.24483, p.50, &p);
            goto <D.24477>;
            <D.24476>:
            D.24481 = field->offset;
            D.24482 = (unsigned int) D.24481;
            p.50 = p;
            encode_uleb128 (D.24482, p.50, &p);
            <D.24477>:
            p.50 = p;
            p.53 = (long int) p.50;
            buf.54 = (long int) &buf;
            D.24466 = p.53 - buf.54;
            D.24467 = (unsigned char) D.24466;
            emit_byte (w, D.24467);
            p.50 = p;
            p.53 = (long int) p.50;
            buf.54 = (long int) &buf;
            D.24466 = p.53 - buf.54;
            D.24468 = (int) D.24466;
            emit_bytes (w, &buf, D.24468);
            <D.24472>:
            <D.23352>:
            field = mono_class_get_fields (klass, &iter);
            if (field != 0B) goto <D.23353>; else goto <D.23354>;
            <D.23354>:
          }
        finally
          {
            buf = {CLOBBER};
            p = {CLOBBER};
          }
      }
      <D.24439>:
      if (has_children != 0) goto <D.24484>; else goto <D.24485>;
      <D.24484>:
      emit_uleb128 (w, 0);
      <D.24485>:
      emit_uleb128 (w, 7);
      emit_string (w, full_name);
      emit_symbol_diff (w, die, ".Ldebug_info_start", 0);
      emit_label (w, pointer_die);
      emit_uleb128 (w, 13);
      emit_symbol_diff (w, die, ".Ldebug_info_start", 0);
      emit_label (w, reference_die);
      emit_uleb128 (w, 14);
      emit_symbol_diff (w, die, ".Ldebug_info_start", 0);
      monoeg_g_free (full_name);
      if (emit_namespace != 0) goto <D.24486>; else goto <D.24487>;
      <D.24486>:
      emit_uleb128 (w, 0);
      <D.24487>:
      D.24284 = die;
      return D.24284;
    }
  finally
    {
      iter = {CLOBBER};
    }
}


get_type_die (struct MonoDwarfWriter * w, struct MonoType * t)
{
  long unsigned int D.24492;
  long unsigned int D.24493;
  unsigned char D.24496;
  struct GHashTable * D.24499;
  struct MonoClass * D.24501;
  int D.24502;
  int D.24503;
  unsigned int j.57;
  struct GHashTable * D.24509;
  long unsigned int D.24510;
  long unsigned int D.24511;
  int D.24515;
  _Bool D.24519;
  long int D.24520;
  long int D.24521;
  const char * D.24524;
  struct MonoClass * klass;
  int j;
  const char * tdie;

  klass = mono_class_from_mono_type (t);
  D.24492 = BIT_FIELD_REF <*t, 64, 64>;
  D.24493 = D.24492 & 1073741824;
  if (D.24493 != 0) goto <D.24494>; else goto <D.24495>;
  <D.24494>:
  D.24496 = t->type;
  if (D.24496 == 17) goto <D.24497>; else goto <D.24498>;
  <D.24497>:
  D.24499 = w->class_to_pointer_die;
  tdie = monoeg_g_hash_table_lookup (D.24499, klass);
  goto <D.24500>;
  <D.24498>:
  tdie = get_class_die (w, klass, 0);
  <D.24500>:
  D.24501 = mono_defaults.int_class;
  t = &D.24501->byval_arg;
  <D.24495>:
  j = 0;
  goto <D.23365>;
  <D.23364>:
  D.24502 = basic_types[j].type;
  D.24496 = t->type;
  D.24503 = (int) D.24496;
  if (D.24502 == D.24503) goto <D.23363>; else goto <D.24504>;
  <D.24504>:
  j = j + 1;
  <D.23365>:
  j.57 = (unsigned int) j;
  if (j.57 <= 16) goto <D.23364>; else goto <D.23363>;
  <D.23363>:
  j.57 = (unsigned int) j;
  if (j.57 <= 16) goto <D.24506>; else goto <D.24507>;
  <D.24506>:
  tdie = basic_types[j].die_name;
  goto <D.24508>;
  <D.24507>:
  D.24496 = t->type;
  D.24503 = (int) D.24496;
  switch (D.24503) <default: <D.23372>, case 15: <D.23371>, case 17: <D.23369>, case 18: <D.23366>, case 20: <D.23368>, case 21: <D.23370>>
  <D.23366>:
  D.24509 = w->class_to_reference_die;
  tdie = monoeg_g_hash_table_lookup (D.24509, klass);
  goto <D.23367>;
  <D.23368>:
  tdie = ".LDIE_OBJECT";
  goto <D.23367>;
  <D.23369>:
  D.24510 = BIT_FIELD_REF <*klass, 64, 256>;
  D.24511 = D.24510 & 16;
  if (D.24511 != 0) goto <D.24512>; else goto <D.24513>;
  <D.24512>:
  tdie = get_class_die (w, klass, 0);
  goto <D.24514>;
  <D.24513>:
  tdie = ".LDIE_I4";
  <D.24514>:
  goto <D.23367>;
  <D.23370>:
  D.24515 = mono_type_is_struct (t);
  if (D.24515 == 0) goto <D.24516>; else goto <D.24517>;
  <D.24516>:
  D.24509 = w->class_to_reference_die;
  tdie = monoeg_g_hash_table_lookup (D.24509, klass);
  goto <D.24518>;
  <D.24517>:
  tdie = ".LDIE_I4";
  <D.24518>:
  goto <D.23367>;
  <D.23371>:
  tdie = ".LDIE_I";
  goto <D.23367>;
  <D.23372>:
  tdie = ".LDIE_I4";
  goto <D.23367>;
  <D.23367>:
  <D.24508>:
  D.24519 = tdie == 0B;
  D.24520 = (long int) D.24519;
  D.24521 = __builtin_expect (D.24520, 0);
  if (D.24521 != 0) goto <D.24522>; else goto <D.24523>;
  <D.24522>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dwarfwriter.c", 1259, "tdie");
  <D.24523>:
  D.24524 = tdie;
  return D.24524;
}


get_class_die (struct MonoDwarfWriter * w, struct MonoClass * klass, gboolean vtype)
{
  const char * D.24529;
  struct GHashTable * cache;

  if (vtype != 0) goto <D.24526>; else goto <D.24527>;
  <D.24526>:
  cache = w->class_to_vtype_die;
  goto <D.24528>;
  <D.24527>:
  cache = w->class_to_die;
  <D.24528>:
  D.24529 = monoeg_g_hash_table_lookup (cache, klass);
  return D.24529;
}


encode_uleb128 (guint32 value, guint8 * buf, guint8 * * endbuf)
{
  unsigned char D.24531;
  guint8 * p.58;
  guint8 * p;

  p = buf;
  <D.23098>:
  {
    guint8 b;

    D.24531 = (unsigned char) value;
    b = D.24531 & 127;
    value = value >> 7;
    if (value != 0) goto <D.24532>; else goto <D.24533>;
    <D.24532>:
    b = b | 128;
    <D.24533>:
    p.58 = p;
    p = p.58 + 1;
    *p.58 = b;
  }
  if (value != 0) goto <D.23098>; else goto <D.23099>;
  <D.23099>:
  *endbuf = p;
}


find_vmv (struct MonoCompile * cfg, struct MonoInst * ins)
{
  struct MonoInst * * D.24535;
  long unsigned int D.24538;
  long unsigned int D.24539;
  struct MonoInst * * D.24540;
  struct MonoInst * D.24541;
  unsigned int j.59;
  unsigned int D.24544;
  struct MonoMethodVar * D.24547;
  struct MonoMethodVar * D.24548;
  long unsigned int D.24549;
  int j;

  D.24535 = cfg->varinfo;
  if (D.24535 != 0B) goto <D.24536>; else goto <D.24537>;
  <D.24536>:
  j = 0;
  goto <D.23546>;
  <D.23545>:
  D.24535 = cfg->varinfo;
  D.24538 = (long unsigned int) j;
  D.24539 = D.24538 * 8;
  D.24540 = D.24535 + D.24539;
  D.24541 = *D.24540;
  if (D.24541 == ins) goto <D.23544>; else goto <D.24542>;
  <D.24542>:
  j = j + 1;
  <D.23546>:
  j.59 = (unsigned int) j;
  D.24544 = cfg->num_varinfo;
  if (j.59 < D.24544) goto <D.23545>; else goto <D.23544>;
  <D.23544>:
  j.59 = (unsigned int) j;
  D.24544 = cfg->num_varinfo;
  if (j.59 < D.24544) goto <D.24545>; else goto <D.24546>;
  <D.24545>:
  D.24548 = cfg->vars;
  D.24538 = (long unsigned int) j;
  D.24549 = D.24538 * 80;
  D.24547 = D.24548 + D.24549;
  return D.24547;
  <D.24546>:
  <D.24537>:
  D.24547 = 0B;
  return D.24547;
}


sprintf (char * restrict __s, const char * restrict __fmt)
{
  int D.24551;
  long unsigned int D.24552;

  D.24552 = __builtin_object_size (__s, 1);
  D.24551 = __builtin___sprintf_chk (__s, 1, D.24552, __fmt, __builtin_va_arg_pack ());
  return D.24551;
}


emit_var_type (struct MonoDwarfWriter * w, struct MonoType * t)
{
  const char * tdie;

  tdie = get_type_die (w, t);
  emit_symbol_diff (w, tdie, ".Ldebug_info_start", 0);
}


encode_var_location (struct MonoDwarfWriter * w, struct MonoInst * ins, guint8 * p, guint8 * * endp)
{
  unsigned char D.24556;
  int D.24557;
  int D.24558;
  short unsigned int D.24562;
  guint8 * p.60;
  int D.24566;
  int D.24567;
  unsigned char D.24568;
  unsigned char D.24569;
  guint8 * p.61;
  guint8 * p.62;
  guint8 * p.63;
  int D.24576;
  int D.24577;
  unsigned char D.24578;
  unsigned char D.24579;
  long int D.24580;
  int D.24581;
  guint8 * p.64;
  guint8 * p.65;

  if (ins == 0B) goto <D.24554>; else goto <D.24555>;
  <D.24555>:
  D.24556 = ins->flags;
  D.24557 = (int) D.24556;
  D.24558 = D.24557 & 2;
  if (D.24558 != 0) goto <D.24559>; else goto <D.24560>;
  <D.24559>:
  goto <D.24561>;
  <D.24560>:
  D.24562 = ins->opcode;
  if (D.24562 == 366) goto <D.24563>; else goto <D.24564>;
  <D.24563>:
  p.60 = p;
  D.24566 = ins->dreg;
  D.24567 = mono_hw_reg_to_dwarf_reg (D.24566);
  D.24568 = (unsigned char) D.24567;
  D.24569 = D.24568 + 80;
  *p.60 = D.24569;
  p.60 = p;
  p.61 = p.60 + 1;
  p = p.61;
  goto <D.24571>;
  <D.24564>:
  D.24562 = ins->opcode;
  if (D.24562 == 367) goto <D.24572>; else goto <D.24573>;
  <D.24572>:
  p.60 = p;
  p.62 = p.60;
  p.63 = p.62 + 1;
  p = p.63;
  D.24576 = ins->sreg1;
  D.24577 = mono_hw_reg_to_dwarf_reg (D.24576);
  D.24578 = (unsigned char) D.24577;
  D.24579 = D.24578 + 112;
  *p.62 = D.24579;
  D.24580 = ins->data.op[0].const_val;
  D.24581 = (int) D.24580;
  p.60 = p;
  encode_sleb128 (D.24581, p.60, &p);
  goto <D.24582>;
  <D.24573>:
  p.60 = p;
  p.64 = p.60;
  p.65 = p.64 + 1;
  p = p.65;
  *p.64 = 80;
  <D.24582>:
  <D.24571>:
  <D.24561>:
  <D.24554>:
  p.60 = p;
  *endp = p.60;
}


encode_sleb128 (gint32 value, guint8 * buf, guint8 * * endbuf)
{
  _Bool D.24585;
  unsigned char D.24586;
  unsigned int D.24589;
  int D.24590;
  int D.24591;
  int D.24592;
  int D.24598;
  int D.24599;
  guint8 * p.66;
  gboolean more;
  gboolean negative;
  guint32 size;
  guint8 byte;
  guint8 * p;

  more = 1;
  D.24585 = value < 0;
  negative = (gboolean) D.24585;
  size = 32;
  p = buf;
  goto <D.23111>;
  <D.23110>:
  D.24586 = (unsigned char) value;
  byte = D.24586 & 127;
  value = value >> 7;
  if (negative != 0) goto <D.24587>; else goto <D.24588>;
  <D.24587>:
  D.24589 = size + 4294967289;
  D.24590 = (int) D.24589;
  D.24591 = 1 << D.24590;
  D.24592 = -D.24591;
  value = D.24592 | value;
  <D.24588>:
  if (value == 0) goto <D.24597>; else goto <D.24593>;
  <D.24597>:
  D.24598 = (int) byte;
  D.24599 = D.24598 & 64;
  if (D.24599 == 0) goto <D.24594>; else goto <D.24593>;
  <D.24593>:
  if (value == -1) goto <D.24600>; else goto <D.24595>;
  <D.24600>:
  D.24598 = (int) byte;
  D.24599 = D.24598 & 64;
  if (D.24599 != 0) goto <D.24594>; else goto <D.24595>;
  <D.24594>:
  more = 0;
  goto <D.24596>;
  <D.24595>:
  byte = byte | 128;
  <D.24596>:
  p.66 = p;
  p = p.66 + 1;
  *p.66 = byte;
  <D.23111>:
  if (more != 0) goto <D.23110>; else goto <D.23112>;
  <D.23112>:
  *endbuf = p;
}


emit_loclist (struct MonoDwarfWriter * w, struct MonoInst * ins, guint8 * loclist_begin_addr, guint8 * loclist_end_addr, guint8 * expr, guint32 expr_len)
{
  int D.24602;
  int D.24603;
  int D.24604;
  unsigned char D.24605;
  unsigned int D.24606;
  unsigned char D.24607;
  int expr_len.67;
  char label[128];

  try
    {
      emit_push_section (w, ".debug_loc", 0);
      D.24602 = w->loclist_index;
      D.24603 = D.24602;
      D.24604 = D.24603 + 1;
      w->loclist_index = D.24604;
      sprintf (&label, ".Lloclist_%d", D.24603);
      emit_label (w, &label);
      emit_pointer_value (w, loclist_begin_addr);
      emit_pointer_value (w, loclist_end_addr);
      D.24605 = (unsigned char) expr_len;
      emit_byte (w, D.24605);
      D.24606 = expr_len / 256;
      D.24607 = (unsigned char) D.24606;
      emit_byte (w, D.24607);
      expr_len.67 = (int) expr_len;
      emit_bytes (w, expr, expr_len.67);
      emit_pointer_value (w, 0B);
      emit_pointer_value (w, 0B);
      emit_pop_section (w);
      emit_symbol_diff (w, &label, ".Ldebug_loc_start", 0);
    }
  finally
    {
      label = {CLOBBER};
    }
}


emit_push_section (struct MonoDwarfWriter * w, const char * section_name, int subsection)
{
  struct MonoImageWriter * D.24609;

  D.24609 = w->w;
  img_writer_emit_push_section (D.24609, section_name, subsection);
}


emit_pop_section (struct MonoDwarfWriter * w)
{
  struct MonoImageWriter * D.24610;

  D.24610 = w->w;
  img_writer_emit_pop_section (D.24610);
}


emit_fde (struct MonoDwarfWriter * w, int fde_index, char * start_symbol, char * end_symbol, guint8 * code, guint32 code_size, struct GSList * unwind_ops, gboolean use_cie)
{
  _Bool D.24616;
  long int D.24617;
  long int D.24618;
  int code_size.68;
  struct GSList * D.24623;
  unsigned int i.69;
  unsigned int D.24629;
  unsigned int uw_info_len.70;
  int uw_info_len.71;
  char symbol1[128];
  char symbol2[128];
  struct GSList * l;
  guint8 * uw_info;
  guint32 uw_info_len;

  try
    {
      emit_section_change (w, ".debug_frame", 0);
      sprintf (&symbol1, ".Lfde%d_start", fde_index);
      sprintf (&symbol2, ".Lfde%d_end", fde_index);
      emit_symbol_diff (w, &symbol2, &symbol1, 0);
      emit_label (w, &symbol1);
      emit_int32 (w, 0);
      if (start_symbol != 0B) goto <D.24611>; else goto <D.24612>;
      <D.24611>:
      emit_pointer (w, start_symbol);
      if (end_symbol != 0B) goto <D.24613>; else goto <D.24614>;
      <D.24613>:
      emit_symbol_diff (w, end_symbol, start_symbol, 0);
      goto <D.24615>;
      <D.24614>:
      D.24616 = code_size == 0;
      D.24617 = (long int) D.24616;
      D.24618 = __builtin_expect (D.24617, 0);
      if (D.24618 != 0) goto <D.24619>; else goto <D.24620>;
      <D.24619>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "dwarfwriter.c", 395, "code_size");
      <D.24620>:
      code_size.68 = (int) code_size;
      emit_int32 (w, code_size.68);
      <D.24615>:
      goto <D.24622>;
      <D.24612>:
      emit_pointer_value (w, code);
      code_size.68 = (int) code_size;
      emit_int32 (w, code_size.68);
      <D.24622>:
      emit_int32 (w, 0);
      l = unwind_ops;
      D.24623 = w->cie_program;
      if (D.24623 != 0B) goto <D.24624>; else goto <D.24625>;
      <D.24624>:
      {
        int i;

        i = 0;
        goto <D.23152>;
        <D.23151>:
        if (l != 0B) goto <D.24626>; else goto <D.24627>;
        <D.24626>:
        l = l->next;
        <D.24627>:
        i = i + 1;
        <D.23152>:
        i.69 = (unsigned int) i;
        D.24623 = w->cie_program;
        D.24629 = monoeg_g_slist_length (D.24623);
        if (i.69 < D.24629) goto <D.23151>; else goto <D.23153>;
        <D.23153>:
      }
      <D.24625>:
      uw_info = mono_unwind_ops_encode (l, &uw_info_len);
      uw_info_len.70 = uw_info_len;
      uw_info_len.71 = (int) uw_info_len.70;
      emit_bytes (w, uw_info, uw_info_len.71);
      monoeg_g_free (uw_info);
      emit_alignment (w, 8);
      emit_label (w, &symbol2);
    }
  finally
    {
      symbol1 = {CLOBBER};
      symbol2 = {CLOBBER};
      uw_info_len = {CLOBBER};
    }
}


emit_pointer (struct MonoDwarfWriter * w, const char * target)
{
  struct MonoImageWriter * D.24632;

  D.24632 = w->w;
  img_writer_emit_pointer (D.24632, target);
}


emit_line (struct MonoDwarfWriter * w)
{
  struct MonoImageWriter * D.24633;

  D.24633 = w->w;
  img_writer_emit_line (D.24633);
}


mono_dwarf_writer_emit_trampoline (struct MonoDwarfWriter * w, const char * tramp_name, char * start_symbol, char * end_symbol, guint8 * code, guint32 code_size, struct GSList * unwind_info)
{
  sizetype D.24634;
  void * D.24635;
  int D.24636;
  int D.24637;

  emit_section_change (w, ".debug_info", 0);
  emit_uleb128 (w, 18);
  emit_string (w, tramp_name);
  emit_pointer_value (w, code);
  D.24634 = (sizetype) code_size;
  D.24635 = code + D.24634;
  emit_pointer_value (w, D.24635);
  emit_uleb128 (w, 0);
  emit_debug_info_end (w);
  D.24636 = w->fde_index;
  emit_fde (w, D.24636, start_symbol, end_symbol, code, code_size, unwind_info, 0);
  D.24636 = w->fde_index;
  D.24637 = D.24636 + 1;
  w->fde_index = D.24637;
}


