mono_hw_reg_to_dwarf_reg (int reg)
{
  int D.22193;

  if (0 != 0) goto <D.22191>; else goto <D.22192>;
  <D.22191>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "unwind.c", 126);
  D.22193 = -1;
  return D.22193;
  <D.22192>:
  D.22193 = map_hw_reg_to_dwarf_reg[reg];
  return D.22193;
}


mono_dwarf_reg_to_hw_reg (int reg)
{
  int dwarf_reg_to_hw_reg_inited.0;
  int D.22198;

  dwarf_reg_to_hw_reg_inited.0 = dwarf_reg_to_hw_reg_inited;
  if (dwarf_reg_to_hw_reg_inited.0 == 0) goto <D.22196>; else goto <D.22197>;
  <D.22196>:
  init_reg_map ();
  <D.22197>:
  D.22198 = map_dwarf_reg_to_hw_reg[reg];
  return D.22198;
}


init_reg_map ()
{
  int D.22202;
  unsigned int i.1;
  int i;

  if (0 != 0) goto <D.22200>; else goto <D.22201>;
  <D.22200>:
  monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 138, "NUM_REGS > 0");
  <D.22201>:
  i = 0;
  goto <D.21865>;
  <D.21864>:
  D.22202 = mono_hw_reg_to_dwarf_reg (i);
  map_dwarf_reg_to_hw_reg[D.22202] = i;
  i = i + 1;
  <D.21865>:
  i.1 = (unsigned int) i;
  if (i.1 <= 8) goto <D.21864>; else goto <D.21866>;
  <D.21866>:
  mono_memory_barrier ();
  dwarf_reg_to_hw_reg_inited = 1;
}


mono_memory_barrier ()
{
  __sync_synchronize ();
}


mono_print_unwind_info (guint8 * unwind_info, int unwind_info_len)
{
  guint8 * p.2;
  unsigned char D.22205;
  int D.22206;
  int D.22207;
  guint8 * p.3;
  unsigned int D.22209;
  unsigned int D.22210;
  int D.22211;
  int D.22214;
  int D.22216;
  const char * D.22217;
  unsigned int D.22218;
  unsigned int D.22219;
  int D.22220;
  const char * D.22221;
  unsigned int D.22222;
  unsigned int D.22223;
  int D.22224;
  const char * D.22225;
  unsigned int D.22226;
  int D.22227;
  int D.22228;
  const char * D.22229;
  unsigned int D.22230;
  unsigned int pos.4;
  unsigned int D.22232;
  guint8 * p.5;
  sizetype unwind_info_len.6;
  guint8 * D.22235;
  guint8 * p;
  int pos;
  int reg;
  int offset;
  int cfa_reg;
  int cfa_offset;

  try
    {
      p = unwind_info;
      pos = 0;
      goto <D.21937>;
      <D.21936>:
      {
        int op;

        p.2 = p;
        D.22205 = *p.2;
        D.22206 = (int) D.22205;
        op = D.22206 & 192;
        switch (op) <default: <D.21935>, case 0: <D.21926>, case 64: <D.21923>, case 128: <D.21925>>
        <D.21923>:
        p.2 = p;
        D.22205 = *p.2;
        D.22206 = (int) D.22205;
        D.22207 = D.22206 & 63;
        pos = D.22207 + pos;
        p.2 = p;
        p.3 = p.2 + 1;
        p = p.3;
        goto <D.21924>;
        <D.21925>:
        p.2 = p;
        D.22205 = *p.2;
        D.22206 = (int) D.22205;
        reg = D.22206 & 63;
        p.2 = p;
        p.3 = p.2 + 1;
        p = p.3;
        p.2 = p;
        D.22209 = decode_uleb128 (p.2, &p);
        D.22210 = D.22209 * 4294967292;
        offset = (int) D.22210;
        D.22211 = mono_hw_reg_to_dwarf_reg (8);
        if (D.22211 == reg) goto <D.22212>; else goto <D.22213>;
        <D.22212>:
        D.22214 = -offset;
        printf ("CFA: [%x] offset: %s at cfa-0x%x\n", pos, "pc", D.22214);
        goto <D.22215>;
        <D.22213>:
        D.22214 = -offset;
        D.22216 = mono_dwarf_reg_to_hw_reg (reg);
        D.22217 = mono_arch_regname (D.22216);
        printf ("CFA: [%x] offset: %s at cfa-0x%x\n", pos, D.22217, D.22214);
        <D.22215>:
        goto <D.21924>;
        <D.21926>:
        {
          int ext_op;

          p.2 = p;
          D.22205 = *p.2;
          ext_op = (int) D.22205;
          p.2 = p;
          p.3 = p.2 + 1;
          p = p.3;
          switch (ext_op) <default: <D.21934>, case 4: <D.21933>, case 12: <D.21928>, case 13: <D.21931>, case 14: <D.21930>, case 17: <D.21932>>
          <D.21928>:
          p.2 = p;
          D.22218 = decode_uleb128 (p.2, &p);
          cfa_reg = (int) D.22218;
          p.2 = p;
          D.22219 = decode_uleb128 (p.2, &p);
          cfa_offset = (int) D.22219;
          D.22220 = mono_dwarf_reg_to_hw_reg (cfa_reg);
          D.22221 = mono_arch_regname (D.22220);
          printf ("CFA: [%x] def_cfa: %s+0x%x\n", pos, D.22221, cfa_offset);
          goto <D.21929>;
          <D.21930>:
          p.2 = p;
          D.22222 = decode_uleb128 (p.2, &p);
          cfa_offset = (int) D.22222;
          printf ("CFA: [%x] def_cfa_offset: 0x%x\n", pos, cfa_offset);
          goto <D.21929>;
          <D.21931>:
          p.2 = p;
          D.22223 = decode_uleb128 (p.2, &p);
          cfa_reg = (int) D.22223;
          D.22224 = mono_dwarf_reg_to_hw_reg (cfa_reg);
          D.22225 = mono_arch_regname (D.22224);
          printf ("CFA: [%x] def_cfa_reg: %s\n", pos, D.22225);
          goto <D.21929>;
          <D.21932>:
          p.2 = p;
          D.22226 = decode_uleb128 (p.2, &p);
          reg = (int) D.22226;
          p.2 = p;
          D.22227 = decode_sleb128 (p.2, &p);
          offset = D.22227 * -4;
          D.22214 = -offset;
          D.22228 = mono_dwarf_reg_to_hw_reg (reg);
          D.22229 = mono_arch_regname (D.22228);
          printf ("CFA: [%x] offset_extended_sf: %s at cfa-0x%x\n", pos, D.22229, D.22214);
          goto <D.21929>;
          <D.21933>:
          p.2 = p;
          D.22230 = MEM[(const guint32 *)p.2];
          pos.4 = (unsigned int) pos;
          D.22232 = D.22230 + pos.4;
          pos = (int) D.22232;
          p.2 = p;
          p.5 = p.2 + 4;
          p = p.5;
          goto <D.21929>;
          <D.21934>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "unwind.c", 306);
          <D.21929>:
          goto <D.21924>;
        }
        <D.21935>:
        monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "unwind.c", 311);
        <D.21924>:
      }
      <D.21937>:
      unwind_info_len.6 = (sizetype) unwind_info_len;
      D.22235 = unwind_info + unwind_info_len.6;
      p.2 = p;
      if (D.22235 > p.2) goto <D.21936>; else goto <D.21938>;
      <D.21938>:
    }
  finally
    {
      p = {CLOBBER};
    }
}


decode_uleb128 (guint8 * buf, guint8 * * endbuf)
{
  int D.22236;
  int D.22237;
  int D.22238;
  unsigned int D.22239;
  signed char b.7;
  guint32 D.22242;
  guint8 * p;
  guint32 res;
  int shift;

  p = buf;
  res = 0;
  shift = 0;
  <D.21901>:
  {
    guint8 b;

    b = *p;
    p = p + 1;
    D.22236 = (int) b;
    D.22237 = D.22236 & 127;
    D.22238 = D.22237 << shift;
    D.22239 = (unsigned int) D.22238;
    res = D.22239 | res;
    b.7 = (signed char) b;
    if (b.7 >= 0) goto <D.21900>; else goto <D.22241>;
    <D.22241>:
    shift = shift + 7;
  }
  goto <D.21901>;
  <D.21900>:
  *endbuf = p;
  D.22242 = res;
  return D.22242;
}


decode_sleb128 (guint8 * buf, guint8 * * endbuf)
{
  int D.22244;
  int D.22245;
  int D.22246;
  signed char b.8;
  int D.22252;
  int D.22255;
  int D.22256;
  gint32 D.22257;
  guint8 * p;
  gint32 res;
  int shift;

  p = buf;
  res = 0;
  shift = 0;
  <D.21911>:
  {
    guint8 b;

    b = *p;
    p = p + 1;
    D.22244 = (int) b;
    D.22245 = D.22244 & 127;
    D.22246 = D.22245 << shift;
    res = D.22246 | res;
    shift = shift + 7;
    b.8 = (signed char) b;
    if (b.8 >= 0) goto <D.22248>; else goto <D.22249>;
    <D.22248>:
    if (shift <= 31) goto <D.22250>; else goto <D.22251>;
    <D.22250>:
    D.22244 = (int) b;
    D.22252 = D.22244 & 64;
    if (D.22252 != 0) goto <D.22253>; else goto <D.22254>;
    <D.22253>:
    D.22255 = 1 << shift;
    D.22256 = -D.22255;
    res = D.22256 | res;
    <D.22254>:
    <D.22251>:
    goto <D.21910>;
    <D.22249>:
  }
  goto <D.21911>;
  <D.21910>:
  *endbuf = p;
  D.22257 = res;
  return D.22257;
}


printf (const char * restrict __fmt)
{
  int D.22259;

  D.22259 = __printf_chk (1, __fmt, __builtin_va_arg_pack ());
  return D.22259;
}


mono_unwind_ops_encode (struct GSList * unwind_ops, guint32 * out_len)
{
  short unsigned int D.22261;
  int D.22262;
  unsigned int D.22263;
  unsigned int loc.9;
  unsigned int D.22265;
  guint8 * p.10;
  guint8 * p.11;
  guint8 * p.12;
  unsigned char D.22271;
  unsigned char D.22272;
  unsigned char D.22273;
  unsigned char D.22274;
  guint8 * p.13;
  guint8 * p.14;
  unsigned char D.22278;
  int D.22279;
  guint8 * p.15;
  guint8 * p.16;
  unsigned int reg.17;
  int D.22283;
  unsigned int D.22284;
  guint8 * p.18;
  guint8 * p.19;
  guint8 * p.20;
  guint8 * p.21;
  guint8 * p.22;
  guint8 * p.23;
  int D.22293;
  guint8 * p.24;
  guint8 * p.25;
  signed char D.22297;
  signed char D.22298;
  unsigned char D.22299;
  unsigned int D.22300;
  int p.26;
  int buf.27;
  int D.22303;
  _Bool D.22304;
  long int D.22305;
  long int D.22306;
  unsigned int D.22309;
  unsigned int D.22310;
  unsigned int D.22311;
  guint8 * D.22312;
  struct GSList * l;
  struct MonoUnwindOp * op;
  int loc;
  guint8 * buf;
  guint8 * p;
  guint8 * res;

  try
    {
      buf = monoeg_malloc0 (4096);
      p = buf;
      loc = 0;
      l = unwind_ops;
      goto <D.21960>;
      <D.21959>:
      {
        int reg;

        op = l->data;
        D.22261 = op->reg;
        D.22262 = (int) D.22261;
        reg = mono_hw_reg_to_dwarf_reg (D.22262);
        goto <D.21951>;
        <D.21950>:
        D.22263 = op->when;
        loc.9 = (unsigned int) loc;
        D.22265 = D.22263 - loc.9;
        if (D.22265 <= 31) goto <D.22266>; else goto <D.22267>;
        <D.22266>:
        p.10 = p;
        p.11 = p.10;
        p.12 = p.11 + 1;
        p = p.12;
        D.22263 = op->when;
        D.22271 = (unsigned char) D.22263;
        D.22272 = (unsigned char) loc;
        D.22273 = D.22271 - D.22272;
        D.22274 = D.22273 | 64;
        *p.11 = D.22274;
        D.22263 = op->when;
        loc = (int) D.22263;
        goto <D.22275>;
        <D.22267>:
        p.10 = p;
        p.13 = p.10;
        p.14 = p.13 + 1;
        p = p.14;
        *p.13 = 94;
        loc = loc + 30;
        <D.22275>:
        <D.21951>:
        D.22263 = op->when;
        loc.9 = (unsigned int) loc;
        if (D.22263 > loc.9) goto <D.21950>; else goto <D.21952>;
        <D.21952>:
        D.22278 = op->op;
        D.22279 = (int) D.22278;
        switch (D.22279) <default: <D.21958>, case 12: <D.21953>, case 13: <D.21956>, case 14: <D.21955>, case 128: <D.21957>>
        <D.21953>:
        p.10 = p;
        p.15 = p.10;
        p.16 = p.15 + 1;
        p = p.16;
        D.22278 = op->op;
        *p.15 = D.22278;
        p.10 = p;
        reg.17 = (unsigned int) reg;
        encode_uleb128 (reg.17, p.10, &p);
        p.10 = p;
        D.22283 = op->val;
        D.22284 = (unsigned int) D.22283;
        encode_uleb128 (D.22284, p.10, &p);
        goto <D.21954>;
        <D.21955>:
        p.10 = p;
        p.18 = p.10;
        p.19 = p.18 + 1;
        p = p.19;
        D.22278 = op->op;
        *p.18 = D.22278;
        p.10 = p;
        D.22283 = op->val;
        D.22284 = (unsigned int) D.22283;
        encode_uleb128 (D.22284, p.10, &p);
        goto <D.21954>;
        <D.21956>:
        p.10 = p;
        p.20 = p.10;
        p.21 = p.20 + 1;
        p = p.21;
        D.22278 = op->op;
        *p.20 = D.22278;
        p.10 = p;
        reg.17 = (unsigned int) reg;
        encode_uleb128 (reg.17, p.10, &p);
        goto <D.21954>;
        <D.21957>:
        if (reg > 63) goto <D.22289>; else goto <D.22290>;
        <D.22289>:
        p.10 = p;
        p.22 = p.10;
        p.23 = p.22 + 1;
        p = p.23;
        *p.22 = 17;
        p.10 = p;
        reg.17 = (unsigned int) reg;
        encode_uleb128 (reg.17, p.10, &p);
        p.10 = p;
        D.22283 = op->val;
        D.22293 = D.22283 / -4;
        encode_sleb128 (D.22293, p.10, &p);
        goto <D.22294>;
        <D.22290>:
        p.10 = p;
        p.24 = p.10;
        p.25 = p.24 + 1;
        p = p.25;
        D.22297 = (signed char) reg;
        D.22298 = D.22297 | -128;
        D.22299 = (unsigned char) D.22298;
        *p.24 = D.22299;
        p.10 = p;
        D.22283 = op->val;
        D.22293 = D.22283 / -4;
        D.22300 = (unsigned int) D.22293;
        encode_uleb128 (D.22300, p.10, &p);
        <D.22294>:
        goto <D.21954>;
        <D.21958>:
        monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "unwind.c", 378);
        <D.21954>:
      }
      l = l->next;
      <D.21960>:
      if (l != 0B) goto <D.21959>; else goto <D.21961>;
      <D.21961>:
      p.10 = p;
      p.26 = (int) p.10;
      buf.27 = (int) buf;
      D.22303 = p.26 - buf.27;
      D.22304 = D.22303 > 4095;
      D.22305 = (long int) D.22304;
      D.22306 = __builtin_expect (D.22305, 0);
      if (D.22306 != 0) goto <D.22307>; else goto <D.22308>;
      <D.22307>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 383, "p - buf < 4096");
      <D.22308>:
      p.10 = p;
      p.26 = (int) p.10;
      buf.27 = (int) buf;
      D.22303 = p.26 - buf.27;
      D.22309 = (unsigned int) D.22303;
      *out_len = D.22309;
      p.10 = p;
      p.26 = (int) p.10;
      buf.27 = (int) buf;
      D.22303 = p.26 - buf.27;
      D.22310 = (unsigned int) D.22303;
      res = monoeg_malloc (D.22310);
      p.10 = p;
      p.26 = (int) p.10;
      buf.27 = (int) buf;
      D.22303 = p.26 - buf.27;
      D.22311 = (unsigned int) D.22303;
      memcpy (res, buf, D.22311);
      monoeg_g_free (buf);
      D.22312 = res;
      return D.22312;
    }
  finally
    {
      p = {CLOBBER};
    }
}


encode_sleb128 (gint32 value, guint8 * buf, guint8 * * endbuf)
{
  _Bool D.22315;
  unsigned char D.22316;
  unsigned int D.22319;
  int D.22320;
  int D.22321;
  int D.22322;
  int D.22328;
  int D.22329;
  guint8 * p.28;
  gboolean more;
  gboolean negative;
  guint32 size;
  guint8 byte;
  guint8 * p;

  more = 1;
  D.22315 = value < 0;
  negative = (gboolean) D.22315;
  size = 32;
  p = buf;
  goto <D.21890>;
  <D.21889>:
  D.22316 = (unsigned char) value;
  byte = D.22316 & 127;
  value = value >> 7;
  if (negative != 0) goto <D.22317>; else goto <D.22318>;
  <D.22317>:
  D.22319 = size + 4294967289;
  D.22320 = (int) D.22319;
  D.22321 = 1 << D.22320;
  D.22322 = -D.22321;
  value = D.22322 | value;
  <D.22318>:
  if (value == 0) goto <D.22327>; else goto <D.22323>;
  <D.22327>:
  D.22328 = (int) byte;
  D.22329 = D.22328 & 64;
  if (D.22329 == 0) goto <D.22324>; else goto <D.22323>;
  <D.22323>:
  if (value == -1) goto <D.22330>; else goto <D.22325>;
  <D.22330>:
  D.22328 = (int) byte;
  D.22329 = D.22328 & 64;
  if (D.22329 != 0) goto <D.22324>; else goto <D.22325>;
  <D.22324>:
  more = 0;
  goto <D.22326>;
  <D.22325>:
  byte = byte | 128;
  <D.22326>:
  p.28 = p;
  p = p.28 + 1;
  *p.28 = byte;
  <D.21890>:
  if (more != 0) goto <D.21889>; else goto <D.21891>;
  <D.21891>:
  *endbuf = p;
}


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

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

    D.22332 = (unsigned char) value;
    b = D.22332 & 127;
    value = value >> 7;
    if (value != 0) goto <D.22333>; else goto <D.22334>;
    <D.22333>:
    b = b | 128;
    <D.22334>:
    p.29 = p;
    p = p.29 + 1;
    *p.29 = b;
  }
  if (value != 0) goto <D.21877>; else goto <D.21878>;
  <D.21878>:
  *endbuf = p;
}


memcpy (void * restrict __dest, const void * restrict __src, size_t __len)
{
  void * D.22336;
  unsigned int D.22337;

  D.22337 = __builtin_object_size (__dest, 0);
  D.22336 = __builtin___memcpy_chk (__dest, __src, __len, D.22337);
  return D.22336;
}


mono_unwind_frame (guint8 * unwind_info, guint32 unwind_info_len, guint8 * start_ip, guint8 * end_ip, guint8 * ip, mgreg_t * regs, int nregs, mgreg_t * * save_locations, int save_locations_len, guint8 * * out_cfa)
{
  guint8 * p.30;
  unsigned char D.22340;
  int D.22341;
  int D.22342;
  guint8 * p.31;
  unsigned int D.22344;
  unsigned int D.22345;
  int D.22346;
  unsigned int D.22347;
  unsigned int D.22348;
  unsigned int D.22349;
  unsigned int D.22350;
  unsigned int D.22351;
  _Bool D.22352;
  long int D.22353;
  long int D.22354;
  int D.22357;
  unsigned int D.22358;
  unsigned int D.22359;
  unsigned int D.22362;
  unsigned int pos.32;
  unsigned int D.22364;
  guint8 * p.33;
  int ip.34;
  int start_ip.35;
  int D.22368;
  guint8 * D.22370;
  unsigned int save_locations_len.36;
  unsigned int D.22374;
  int D.22375;
  unsigned int D.22376;
  unsigned int D.22377;
  mgreg_t * D.22378;
  int D.22379;
  sizetype D.22380;
  sizetype cfa_offset.37;
  sizetype D.22382;
  unsigned char D.22383;
  <unnamed type> D.22386;
  _Bool D.22389;
  long int D.22390;
  long int D.22391;
  unsigned int hreg.38;
  unsigned int D.22395;
  mgreg_t * D.22396;
  int D.22397;
  sizetype D.22398;
  mgreg_t * D.22399;
  int D.22400;
  _Bool D.22401;
  _Bool D.22402;
  _Bool D.22403;
  mgreg_t * * D.22406;
  struct Loc locations[9];
  guint8 reg_saved[9];
  int i;
  int pos;
  int reg;
  int cfa_reg;
  int cfa_offset;
  int offset;
  guint8 * p;
  guint8 * cfa_val;

  try
    {
      memset (&reg_saved, 0, 9);
      p = unwind_info;
      pos = 0;
      cfa_reg = -1;
      cfa_offset = -1;
      goto <D.22012>;
      <D.22011>:
      {
        int op;

        p.30 = p;
        D.22340 = *p.30;
        D.22341 = (int) D.22340;
        op = D.22341 & 192;
        switch (op) <default: <D.22010>, case 0: <D.22000>, case 64: <D.21997>, case 128: <D.21999>>
        <D.21997>:
        p.30 = p;
        D.22340 = *p.30;
        D.22341 = (int) D.22340;
        D.22342 = D.22341 & 63;
        pos = D.22342 + pos;
        p.30 = p;
        p.31 = p.30 + 1;
        p = p.31;
        goto <D.21998>;
        <D.21999>:
        p.30 = p;
        D.22340 = *p.30;
        D.22341 = (int) D.22340;
        reg = D.22341 & 63;
        p.30 = p;
        p.31 = p.30 + 1;
        p = p.31;
        reg_saved[reg] = 1;
        locations[reg].loc_type = 1;
        p.30 = p;
        D.22344 = decode_uleb128 (p.30, &p);
        D.22345 = D.22344 * 4294967292;
        D.22346 = (int) D.22345;
        locations[reg].offset = D.22346;
        goto <D.21998>;
        <D.22000>:
        {
          int ext_op;

          p.30 = p;
          D.22340 = *p.30;
          ext_op = (int) D.22340;
          p.30 = p;
          p.31 = p.30 + 1;
          p = p.31;
          switch (ext_op) <default: <D.22009>, case 4: <D.22008>, case 5: <D.22007>, case 12: <D.22002>, case 13: <D.22005>, case 14: <D.22004>, case 17: <D.22006>>
          <D.22002>:
          p.30 = p;
          D.22347 = decode_uleb128 (p.30, &p);
          cfa_reg = (int) D.22347;
          p.30 = p;
          D.22348 = decode_uleb128 (p.30, &p);
          cfa_offset = (int) D.22348;
          goto <D.22003>;
          <D.22004>:
          p.30 = p;
          D.22349 = decode_uleb128 (p.30, &p);
          cfa_offset = (int) D.22349;
          goto <D.22003>;
          <D.22005>:
          p.30 = p;
          D.22350 = decode_uleb128 (p.30, &p);
          cfa_reg = (int) D.22350;
          goto <D.22003>;
          <D.22006>:
          p.30 = p;
          D.22351 = decode_uleb128 (p.30, &p);
          reg = (int) D.22351;
          p.30 = p;
          offset = decode_sleb128 (p.30, &p);
          D.22352 = reg > 8;
          D.22353 = (long int) D.22352;
          D.22354 = __builtin_expect (D.22353, 0);
          if (D.22354 != 0) goto <D.22355>; else goto <D.22356>;
          <D.22355>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 470, "reg < NUM_REGS");
          <D.22356>:
          reg_saved[reg] = 1;
          locations[reg].loc_type = 1;
          D.22357 = offset * -4;
          locations[reg].offset = D.22357;
          goto <D.22003>;
          <D.22007>:
          p.30 = p;
          D.22358 = decode_uleb128 (p.30, &p);
          reg = (int) D.22358;
          p.30 = p;
          D.22359 = decode_uleb128 (p.30, &p);
          offset = (int) D.22359;
          D.22352 = reg > 8;
          D.22353 = (long int) D.22352;
          D.22354 = __builtin_expect (D.22353, 0);
          if (D.22354 != 0) goto <D.22360>; else goto <D.22361>;
          <D.22360>:
          monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 478, "reg < NUM_REGS");
          <D.22361>:
          reg_saved[reg] = 1;
          locations[reg].loc_type = 1;
          D.22357 = offset * -4;
          locations[reg].offset = D.22357;
          goto <D.22003>;
          <D.22008>:
          p.30 = p;
          D.22362 = MEM[(const guint32 *)p.30];
          pos.32 = (unsigned int) pos;
          D.22364 = D.22362 + pos.32;
          pos = (int) D.22364;
          p.30 = p;
          p.33 = p.30 + 4;
          p = p.33;
          goto <D.22003>;
          <D.22009>:
          monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "unwind.c", 488);
          <D.22003>:
          goto <D.21998>;
        }
        <D.22010>:
        monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "unwind.c", 493);
        <D.21998>:
      }
      <D.22012>:
      ip.34 = (int) ip;
      start_ip.35 = (int) start_ip;
      D.22368 = ip.34 - start_ip.35;
      if (D.22368 >= pos) goto <D.22369>; else goto <D.22013>;
      <D.22369>:
      D.22370 = unwind_info + unwind_info_len;
      p.30 = p;
      if (D.22370 > p.30) goto <D.22011>; else goto <D.22013>;
      <D.22013>:
      if (save_locations != 0B) goto <D.22371>; else goto <D.22372>;
      <D.22371>:
      save_locations_len.36 = (unsigned int) save_locations_len;
      D.22374 = save_locations_len.36 * 4;
      memset (save_locations, 0, D.22374);
      <D.22372>:
      D.22375 = mono_dwarf_reg_to_hw_reg (cfa_reg);
      D.22376 = (unsigned int) D.22375;
      D.22377 = D.22376 * 4;
      D.22378 = regs + D.22377;
      D.22379 = *D.22378;
      D.22380 = (sizetype) D.22379;
      cfa_offset.37 = (sizetype) cfa_offset;
      D.22382 = D.22380 + cfa_offset.37;
      cfa_val = (guint8 *) D.22382;
      i = 0;
      goto <D.22016>;
      <D.22015>:
      D.22383 = reg_saved[i];
      if (D.22383 != 0) goto <D.22384>; else goto <D.22385>;
      <D.22384>:
      D.22386 = locations[i].loc_type;
      if (D.22386 == 1) goto <D.22387>; else goto <D.22388>;
      <D.22387>:
      {
        int hreg;

        hreg = mono_dwarf_reg_to_hw_reg (i);
        D.22389 = hreg >= nregs;
        D.22390 = (long int) D.22389;
        D.22391 = __builtin_expect (D.22390, 0);
        if (D.22391 != 0) goto <D.22392>; else goto <D.22393>;
        <D.22392>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 504, "hreg < nregs");
        <D.22393>:
        hreg.38 = (unsigned int) hreg;
        D.22395 = hreg.38 * 4;
        D.22396 = regs + D.22395;
        D.22397 = locations[i].offset;
        D.22398 = (sizetype) D.22397;
        D.22399 = cfa_val + D.22398;
        D.22400 = *D.22399;
        *D.22396 = D.22400;
        D.22401 = save_locations != 0B;
        D.22402 = hreg < save_locations_len;
        D.22403 = D.22401 & D.22402;
        if (D.22403 != 0) goto <D.22404>; else goto <D.22405>;
        <D.22404>:
        hreg.38 = (unsigned int) hreg;
        D.22395 = hreg.38 * 4;
        D.22406 = save_locations + D.22395;
        D.22397 = locations[i].offset;
        D.22398 = (sizetype) D.22397;
        D.22399 = cfa_val + D.22398;
        *D.22406 = D.22399;
        <D.22405>:
      }
      <D.22388>:
      <D.22385>:
      i = i + 1;
      <D.22016>:
      if (i <= 8) goto <D.22015>; else goto <D.22017>;
      <D.22017>:
      *out_cfa = cfa_val;
    }
  finally
    {
      locations = {CLOBBER};
      reg_saved = {CLOBBER};
      p = {CLOBBER};
    }
}


memset (void * __dest, int __ch, size_t __len)
{
  int D.22409;
  int D.22414;
  void * D.22416;
  unsigned int D.22417;

  D.22409 = __builtin_constant_p (__len);
  if (D.22409 != 0) goto <D.22410>; else goto <D.22411>;
  <D.22410>:
  if (__len == 0) goto <D.22412>; else goto <D.22413>;
  <D.22412>:
  D.22414 = __builtin_constant_p (__ch);
  if (D.22414 == 0) goto <D.22407>; else goto <D.22415>;
  <D.22415>:
  if (__ch != 0) goto <D.22407>; else goto <D.22408>;
  <D.22407>:
  __warn_memset_zero_len ();
  D.22416 = __dest;
  return D.22416;
  <D.22408>:
  <D.22413>:
  <D.22411>:
  D.22417 = __builtin_object_size (__dest, 0);
  D.22416 = __builtin___memset_chk (__dest, __ch, __len, D.22417);
  return D.22416;
}


mono_unwind_init ()
{
  InitializeCriticalSection (&unwind_mutex);
  mono_counters_register ("Unwind info size", 256, &unwind_info_size);
}


mono_unwind_cleanup ()
{
  struct MonoUnwindInfo * * cached_info.39;
  unsigned int i.40;
  unsigned int D.22423;
  struct MonoUnwindInfo * * D.22424;
  int cached_info_next.41;
  int i;

  DeleteCriticalSection (&unwind_mutex);
  cached_info.39 = cached_info;
  if (cached_info.39 == 0B) goto <D.22420>; else goto <D.22421>;
  <D.22420>:
  return;
  <D.22421>:
  i = 0;
  goto <D.22027>;
  <D.22026>:
  {
    struct MonoUnwindInfo * cached;

    cached_info.39 = cached_info;
    i.40 = (unsigned int) i;
    D.22423 = i.40 * 4;
    D.22424 = cached_info.39 + D.22423;
    cached = *D.22424;
    monoeg_g_free (cached);
  }
  i = i + 1;
  <D.22027>:
  cached_info_next.41 = cached_info_next;
  if (i < cached_info_next.41) goto <D.22026>; else goto <D.22028>;
  <D.22028>:
  cached_info.39 = cached_info;
  monoeg_g_free (cached_info.39);
}


mono_cache_unwind_info (guint8 * unwind_info, guint32 unwind_info_len)
{
  _Bool D.22429;
  long int D.22430;
  long int D.22431;
  struct MonoUnwindInfo * * cached_info.42;
  int cached_info_size.43;
  unsigned int cached_info_size.44;
  unsigned int D.22439;
  void * cached_info.45;
  unsigned int i.46;
  unsigned int D.22442;
  struct MonoUnwindInfo * * D.22443;
  unsigned int D.22444;
  guint8[0:] * D.22447;
  int D.22448;
  _Bool D.22453;
  long int D.22454;
  long int D.22455;
  guint32 D.22458;
  int cached_info_next.47;
  unsigned int D.22460;
  guint8[0:] * D.22461;
  unsigned int D.22464;
  struct GSList * cached_info_list.48;
  struct GSList * cached_info_list.49;
  int cached_info_size.50;
  int cached_info_next.51;
  int cached_info_next.52;
  unsigned int cached_info_next.53;
  unsigned int D.22471;
  struct MonoUnwindInfo * * D.22472;
  int unwind_info_size.54;
  unsigned int unwind_info_size.55;
  unsigned int D.22475;
  unsigned int D.22476;
  int unwind_info_size.56;
  _Bool D.22480;
  long int D.22481;
  long int D.22482;
  int i;
  struct MonoUnwindInfo * info;

  {
    int ret;

    ret = pthread_mutex_lock (&unwind_mutex.mutex);
    if (ret != 0) goto <D.22427>; else goto <D.22428>;
    <D.22427>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_lock result %d", ret);
    <D.22428>:
    D.22429 = ret != 0;
    D.22430 = (long int) D.22429;
    D.22431 = __builtin_expect (D.22430, 0);
    if (D.22431 != 0) goto <D.22432>; else goto <D.22433>;
    <D.22432>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 557, "ret == 0");
    <D.22433>:
  }
  cached_info.42 = cached_info;
  if (cached_info.42 == 0B) goto <D.22435>; else goto <D.22436>;
  <D.22435>:
  cached_info_size = 16;
  cached_info_size.43 = cached_info_size;
  cached_info_size.44 = (unsigned int) cached_info_size.43;
  D.22439 = cached_info_size.44 * 4;
  cached_info.45 = monoeg_malloc0 (D.22439);
  cached_info = cached_info.45;
  <D.22436>:
  i = 0;
  goto <D.22039>;
  <D.22038>:
  {
    struct MonoUnwindInfo * cached;

    cached_info.42 = cached_info;
    i.46 = (unsigned int) i;
    D.22442 = i.46 * 4;
    D.22443 = cached_info.42 + D.22442;
    cached = *D.22443;
    D.22444 = cached->len;
    if (D.22444 == unwind_info_len) goto <D.22445>; else goto <D.22446>;
    <D.22445>:
    D.22447 = &cached->info;
    D.22448 = memcmp (D.22447, unwind_info, unwind_info_len);
    if (D.22448 == 0) goto <D.22449>; else goto <D.22450>;
    <D.22449>:
    {
      int ret;

      ret = pthread_mutex_unlock (&unwind_mutex.mutex);
      if (ret != 0) goto <D.22451>; else goto <D.22452>;
      <D.22451>:
      monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
      <D.22452>:
      D.22453 = ret != 0;
      D.22454 = (long int) D.22453;
      D.22455 = __builtin_expect (D.22454, 0);
      if (D.22455 != 0) goto <D.22456>; else goto <D.22457>;
      <D.22456>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 568, "ret == 0");
      <D.22457>:
    }
    D.22458 = (guint32) i;
    return D.22458;
    <D.22450>:
    <D.22446>:
  }
  i = i + 1;
  <D.22039>:
  cached_info_next.47 = cached_info_next;
  if (i < cached_info_next.47) goto <D.22038>; else goto <D.22040>;
  <D.22040>:
  D.22460 = unwind_info_len + 4;
  info = monoeg_malloc (D.22460);
  info->len = unwind_info_len;
  D.22461 = &info->info;
  memcpy (D.22461, unwind_info, unwind_info_len);
  i = cached_info_next;
  cached_info_next.47 = cached_info_next;
  cached_info_size.43 = cached_info_size;
  if (cached_info_next.47 >= cached_info_size.43) goto <D.22462>; else goto <D.22463>;
  <D.22462>:
  {
    struct MonoUnwindInfo * * old_table;
    struct MonoUnwindInfo * * new_table;

    old_table = cached_info;
    cached_info_size.43 = cached_info_size;
    cached_info_size.44 = (unsigned int) cached_info_size.43;
    D.22464 = cached_info_size.44 * 8;
    new_table = monoeg_malloc0 (D.22464);
    cached_info_size.43 = cached_info_size;
    cached_info_size.44 = (unsigned int) cached_info_size.43;
    D.22439 = cached_info_size.44 * 4;
    cached_info.42 = cached_info;
    memcpy (new_table, cached_info.42, D.22439);
    mono_memory_barrier ();
    cached_info = new_table;
    cached_info.42 = cached_info;
    cached_info_list.48 = cached_info_list;
    cached_info_list.49 = monoeg_g_slist_prepend (cached_info_list.48, cached_info.42);
    cached_info_list = cached_info_list.49;
    cached_info_size.43 = cached_info_size;
    cached_info_size.50 = cached_info_size.43 * 2;
    cached_info_size = cached_info_size.50;
  }
  <D.22463>:
  cached_info.42 = cached_info;
  cached_info_next.47 = cached_info_next;
  cached_info_next.51 = cached_info_next.47;
  cached_info_next.52 = cached_info_next.51 + 1;
  cached_info_next = cached_info_next.52;
  cached_info_next.53 = (unsigned int) cached_info_next.51;
  D.22471 = cached_info_next.53 * 4;
  D.22472 = cached_info.42 + D.22471;
  *D.22472 = info;
  unwind_info_size.54 = unwind_info_size;
  unwind_info_size.55 = (unsigned int) unwind_info_size.54;
  D.22475 = unwind_info_len + unwind_info_size.55;
  D.22476 = D.22475 + 4;
  unwind_info_size.56 = (int) D.22476;
  unwind_info_size = unwind_info_size.56;
  {
    int ret;

    ret = pthread_mutex_unlock (&unwind_mutex.mutex);
    if (ret != 0) goto <D.22478>; else goto <D.22479>;
    <D.22478>:
    monoeg_g_log (0B, 16, "Bad call to mono_mutex_unlock result %d", ret);
    <D.22479>:
    D.22480 = ret != 0;
    D.22481 = (long int) D.22480;
    D.22482 = __builtin_expect (D.22481, 0);
    if (D.22482 != 0) goto <D.22483>; else goto <D.22484>;
    <D.22483>:
    monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 605, "ret == 0");
    <D.22484>:
  }
  D.22458 = (guint32) i;
  return D.22458;
}


mono_get_cached_unwind_info (guint32 index, guint32 * unwind_info_len)
{
  unsigned int D.22486;
  struct MonoUnwindInfo * * D.22487;
  unsigned int D.22488;
  guint8 * D.22489;
  struct MonoUnwindInfo * * table;
  struct MonoUnwindInfo * info;
  guint8 * data;

  table = cached_info;
  D.22486 = index * 4;
  D.22487 = table + D.22486;
  info = *D.22487;
  D.22488 = info->len;
  *unwind_info_len = D.22488;
  data = &info->info;
  D.22489 = data;
  return D.22489;
}


mono_unwind_get_dwarf_data_align ()
{
  int D.22491;

  D.22491 = -4;
  return D.22491;
}


mono_unwind_get_dwarf_pc_reg ()
{
  int D.22493;

  D.22493 = mono_hw_reg_to_dwarf_reg (8);
  return D.22493;
}


mono_unwind_decode_fde (guint8 * fde, guint32 * out_len, guint32 * code_len, struct MonoJitExceptionInfo * * ex_info, guint32 * ex_info_len, void * * * type_info, int * this_reg, int * this_offset)
{
  guint8 * p.57;
  unsigned int D.22496;
  unsigned int fde_len.58;
  unsigned int D.22498;
  _Bool D.22499;
  long int D.22500;
  long int D.22501;
  guint8 * p.59;
  sizetype cie_offset.60;
  sizetype D.22506;
  _Bool D.22507;
  long int D.22508;
  long int D.22509;
  unsigned char D.22512;
  _Bool D.22513;
  long int D.22514;
  long int D.22515;
  guint8 * p.61;
  unsigned int D.22519;
  sizetype D.22520;
  guint8 * p.62;
  unsigned int D.22522;
  unsigned int D.22523;
  char * D.22524;
  unsigned int D.22527;
  sizetype i.63;
  char * D.22529;
  char D.22530;
  int D.22531;
  unsigned char D.22532;
  _Bool D.22533;
  long int D.22534;
  long int D.22535;
  _Bool D.22538;
  long int D.22539;
  long int D.22540;
  sizetype cie_aug_len.64;
  guint8 * p.65;
  sizetype pc_begin.66;
  unsigned int D.22548;
  sizetype aug_len.67;
  guint8 * p.68;
  sizetype fde_len.69;
  sizetype D.22553;
  guint8 * D.22554;
  int D.22555;
  int p.70;
  unsigned int pc_range.71;
  unsigned int D.22566;
  long long int D.22570;
  sizetype lsda_offset.72;
  _Bool D.22575;
  long int D.22576;
  long int D.22577;
  _Bool D.22580;
  long int D.22581;
  long int D.22582;
  int D.22585;
  _Bool D.22586;
  long int D.22587;
  long int D.22588;
  sizetype cie_len.73;
  sizetype D.22592;
  guint8 * D.22593;
  int D.22594;
  int cie_cfi.74;
  int D.22596;
  int fde_cfi.75;
  int D.22598;
  unsigned int buf_len.76;
  int D.22601;
  unsigned int D.22602;
  guint8 * D.22603;
  int D.22605;
  unsigned int D.22606;
  _Bool D.22607;
  long int D.22608;
  long int D.22609;
  unsigned int i.77;
  guint8 * D.22613;
  unsigned int i.78;
  guint8 * p;
  guint8 * cie;
  guint8 * fde_current;
  guint8 * fde_aug;
  guint8 * code;
  guint8 * fde_cfi;
  guint8 * cie_cfi;
  gint32 fde_len;
  gint32 cie_offset;
  gint32 pc_begin;
  gint32 pc_range;
  gint32 aug_len;
  gint32 fde_data_len;
  gint32 cie_len;
  gint32 cie_id;
  gint32 cie_version;
  gint32 code_align;
  gint32 data_align;
  gint32 return_reg;
  gint32 i;
  gint32 cie_aug_len;
  gint32 buf_len;
  char * cie_aug_str;
  guint8 * buf;
  gboolean has_fde_augmentation;

  try
    {
      fde_aug = 0B;
      has_fde_augmentation = 0;
      *type_info = 0B;
      *this_reg = -1;
      *this_offset = -1;
      p = fde;
      p.57 = p;
      D.22496 = MEM[(guint32 *)p.57];
      fde_len = (gint32) D.22496;
      fde_len.58 = (unsigned int) fde_len;
      D.22498 = fde_len.58 + 1;
      D.22499 = D.22498 <= 1;
      D.22500 = (long int) D.22499;
      D.22501 = __builtin_expect (D.22500, 0);
      if (D.22501 != 0) goto <D.22502>; else goto <D.22503>;
      <D.22502>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 833, "fde_len != 0xffffffff && fde_len != 0");
      <D.22503>:
      p.57 = p;
      p.59 = p.57 + 4;
      p = p.59;
      p.57 = p;
      D.22496 = MEM[(guint32 *)p.57];
      cie_offset = (gint32) D.22496;
      p.57 = p;
      cie_offset.60 = (sizetype) cie_offset;
      D.22506 = -cie_offset.60;
      cie = p.57 + D.22506;
      p.57 = p;
      p.59 = p.57 + 4;
      p = p.59;
      fde_current = p;
      p = cie;
      p.57 = p;
      D.22496 = MEM[(guint32 *)p.57];
      cie_len = (gint32) D.22496;
      p.57 = p;
      p.59 = p.57 + 4;
      p = p.59;
      p.57 = p;
      D.22496 = MEM[(guint32 *)p.57];
      cie_id = (gint32) D.22496;
      D.22507 = cie_id != 0;
      D.22508 = (long int) D.22507;
      D.22509 = __builtin_expect (D.22508, 0);
      if (D.22509 != 0) goto <D.22510>; else goto <D.22511>;
      <D.22510>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 845, "cie_id == 0");
      <D.22511>:
      p.57 = p;
      p.59 = p.57 + 4;
      p = p.59;
      p.57 = p;
      D.22512 = *p.57;
      cie_version = (gint32) D.22512;
      D.22513 = cie_version != 1;
      D.22514 = (long int) D.22513;
      D.22515 = __builtin_expect (D.22514, 0);
      if (D.22515 != 0) goto <D.22516>; else goto <D.22517>;
      <D.22516>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 848, "cie_version == 1");
      <D.22517>:
      p.57 = p;
      p.61 = p.57 + 1;
      p = p.61;
      cie_aug_str = p;
      p.57 = p;
      D.22519 = strlen (cie_aug_str);
      D.22520 = D.22519 + 1;
      p.62 = p.57 + D.22520;
      p = p.62;
      p.57 = p;
      D.22522 = decode_uleb128 (p.57, &p);
      code_align = (gint32) D.22522;
      p.57 = p;
      data_align = decode_sleb128 (p.57, &p);
      p.57 = p;
      D.22523 = decode_uleb128 (p.57, &p);
      return_reg = (gint32) D.22523;
      D.22524 = __builtin_strchr (cie_aug_str, 122);
      if (D.22524 != 0B) goto <D.22525>; else goto <D.22526>;
      <D.22525>:
      {
        guint8 * cie_aug;
        guint32 p_encoding;

        p.57 = p;
        D.22527 = decode_uleb128 (p.57, &p);
        cie_aug_len = (gint32) D.22527;
        has_fde_augmentation = 1;
        cie_aug = p;
        i = 0;
        goto <D.22154>;
        <D.22153>:
        i.63 = (sizetype) i;
        D.22529 = cie_aug_str + i.63;
        D.22530 = *D.22529;
        D.22531 = (int) D.22530;
        switch (D.22531) <default: <D.22152>, case 76: <D.22150>, case 80: <D.22149>, case 82: <D.22151>, case 122: <D.22147>>
        <D.22147>:
        goto <D.22148>;
        <D.22149>:
        p.57 = p;
        D.22512 = *p.57;
        p_encoding = (guint32) D.22512;
        p.57 = p;
        p.61 = p.57 + 1;
        p = p.61;
        p.57 = p;
        read_encoded_val (p_encoding, p.57, &p);
        goto <D.22148>;
        <D.22150>:
        p.57 = p;
        D.22512 = *p.57;
        D.22532 = D.22512 + 229;
        D.22533 = D.22532 > 1;
        D.22534 = (long int) D.22533;
        D.22535 = __builtin_expect (D.22534, 0);
        if (D.22535 != 0) goto <D.22536>; else goto <D.22537>;
        <D.22536>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 874, "(*p == (DW_EH_PE_sdata4|DW_EH_PE_pcrel)) || (*p == (DW_EH_PE_sdata8|DW_EH_PE_pcrel))");
        <D.22537>:
        p.57 = p;
        p.61 = p.57 + 1;
        p = p.61;
        goto <D.22148>;
        <D.22151>:
        p.57 = p;
        D.22512 = *p.57;
        D.22538 = D.22512 != 27;
        D.22539 = (long int) D.22538;
        D.22540 = __builtin_expect (D.22539, 0);
        if (D.22540 != 0) goto <D.22541>; else goto <D.22542>;
        <D.22541>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 878, "*p == (DW_EH_PE_sdata4|DW_EH_PE_pcrel)");
        <D.22542>:
        p.57 = p;
        p.61 = p.57 + 1;
        p = p.61;
        goto <D.22148>;
        <D.22152>:
        monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "unwind.c", 882);
        <D.22148>:
        i = i + 1;
        <D.22154>:
        i.63 = (sizetype) i;
        D.22529 = cie_aug_str + i.63;
        D.22530 = *D.22529;
        if (D.22530 != 0) goto <D.22153>; else goto <D.22155>;
        <D.22155>:
        p = cie_aug;
        p.57 = p;
        cie_aug_len.64 = (sizetype) cie_aug_len;
        p.65 = p.57 + cie_aug_len.64;
        p = p.65;
      }
      <D.22526>:
      cie_cfi = p;
      p = fde_current;
      p.57 = p;
      pc_begin = MEM[(gint32 *)p.57];
      p.57 = p;
      pc_begin.66 = (sizetype) pc_begin;
      code = p.57 + pc_begin.66;
      p.57 = p;
      p.59 = p.57 + 4;
      p = p.59;
      p.57 = p;
      D.22496 = MEM[(guint32 *)p.57];
      pc_range = (gint32) D.22496;
      p.57 = p;
      p.59 = p.57 + 4;
      p = p.59;
      if (has_fde_augmentation != 0) goto <D.22546>; else goto <D.22547>;
      <D.22546>:
      p.57 = p;
      D.22548 = decode_uleb128 (p.57, &p);
      aug_len = (gint32) D.22548;
      fde_aug = p;
      p.57 = p;
      aug_len.67 = (sizetype) aug_len;
      p.68 = p.57 + aug_len.67;
      p = p.68;
      goto <D.22551>;
      <D.22547>:
      aug_len = 0;
      <D.22551>:
      fde_cfi = p;
      fde_len.69 = (sizetype) fde_len;
      D.22553 = fde_len.69 + 4;
      D.22554 = fde + D.22553;
      D.22555 = (int) D.22554;
      p.57 = p;
      p.70 = (int) p.57;
      fde_data_len = D.22555 - p.70;
      if (code_len != 0B) goto <D.22557>; else goto <D.22558>;
      <D.22557>:
      pc_range.71 = (unsigned int) pc_range;
      *code_len = pc_range.71;
      <D.22558>:
      if (ex_info != 0B) goto <D.22560>; else goto <D.22561>;
      <D.22560>:
      *ex_info = 0B;
      *ex_info_len = 0;
      <D.22561>:
      if (aug_len != 0) goto <D.22562>; else goto <D.22563>;
      <D.22562>:
      {
        gint32 lsda_offset;
        guint8 * lsda;

        if (aug_len == 4) goto <D.22564>; else goto <D.22565>;
        <D.22564>:
        D.22566 = MEM[(const guint32 *)fde_aug];
        lsda_offset = (gint32) D.22566;
        goto <D.22567>;
        <D.22565>:
        if (aug_len == 8) goto <D.22568>; else goto <D.22569>;
        <D.22568>:
        D.22570 = MEM[(gint64 *)fde_aug];
        lsda_offset = (gint32) D.22570;
        goto <D.22571>;
        <D.22569>:
        monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "unwind.c", 929);
        <D.22571>:
        <D.22567>:
        if (lsda_offset != 0) goto <D.22572>; else goto <D.22573>;
        <D.22572>:
        lsda_offset.72 = (sizetype) lsda_offset;
        lsda = fde_aug + lsda_offset.72;
        decode_lsda (lsda, code, ex_info, ex_info_len, type_info, this_reg, this_offset);
        <D.22573>:
      }
      <D.22563>:
      D.22575 = code_align != 1;
      D.22576 = (long int) D.22575;
      D.22577 = __builtin_expect (D.22576, 0);
      if (D.22577 != 0) goto <D.22578>; else goto <D.22579>;
      <D.22578>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 938, "code_align == 1");
      <D.22579>:
      D.22580 = data_align != -4;
      D.22581 = (long int) D.22580;
      D.22582 = __builtin_expect (D.22581, 0);
      if (D.22582 != 0) goto <D.22583>; else goto <D.22584>;
      <D.22583>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 939, "data_align == DWARF_DATA_ALIGN");
      <D.22584>:
      D.22585 = mono_hw_reg_to_dwarf_reg (8);
      D.22586 = D.22585 != return_reg;
      D.22587 = (long int) D.22586;
      D.22588 = __builtin_expect (D.22587, 0);
      if (D.22588 != 0) goto <D.22589>; else goto <D.22590>;
      <D.22589>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 940, "return_reg == DWARF_PC_REG");
      <D.22590>:
      cie_len.73 = (sizetype) cie_len;
      D.22592 = cie_len.73 + 4;
      D.22593 = cie + D.22592;
      D.22594 = (int) D.22593;
      cie_cfi.74 = (int) cie_cfi;
      D.22596 = D.22594 - cie_cfi.74;
      fde_len.69 = (sizetype) fde_len;
      D.22553 = fde_len.69 + 4;
      D.22554 = fde + D.22553;
      D.22555 = (int) D.22554;
      fde_cfi.75 = (int) fde_cfi;
      D.22598 = D.22555 - fde_cfi.75;
      buf_len = D.22596 + D.22598;
      buf_len.76 = (unsigned int) buf_len;
      buf = monoeg_malloc0 (buf_len.76);
      i = 0;
      p = cie_cfi;
      goto <D.22160>;
      <D.22159>:
      p.57 = p;
      D.22512 = *p.57;
      if (D.22512 == 0) goto <D.22158>; else goto <D.22600>;
      <D.22600>:
      p.57 = p;
      decode_cie_op (p.57, &p);
      <D.22160>:
      cie_len.73 = (sizetype) cie_len;
      D.22592 = cie_len.73 + 4;
      D.22593 = cie + D.22592;
      p.57 = p;
      if (D.22593 > p.57) goto <D.22159>; else goto <D.22158>;
      <D.22158>:
      p.57 = p;
      p.70 = (int) p.57;
      cie_cfi.74 = (int) cie_cfi;
      D.22601 = p.70 - cie_cfi.74;
      D.22602 = (unsigned int) D.22601;
      i.63 = (sizetype) i;
      D.22603 = buf + i.63;
      memcpy (D.22603, cie_cfi, D.22602);
      p.57 = p;
      p.70 = (int) p.57;
      cie_cfi.74 = (int) cie_cfi;
      D.22601 = p.70 - cie_cfi.74;
      i = D.22601 + i;
      p = fde_cfi;
      goto <D.22163>;
      <D.22162>:
      p.57 = p;
      D.22512 = *p.57;
      if (D.22512 == 0) goto <D.22161>; else goto <D.22604>;
      <D.22604>:
      p.57 = p;
      decode_cie_op (p.57, &p);
      <D.22163>:
      fde_len.69 = (sizetype) fde_len;
      D.22553 = fde_len.69 + 4;
      D.22554 = fde + D.22553;
      p.57 = p;
      if (D.22554 > p.57) goto <D.22162>; else goto <D.22161>;
      <D.22161>:
      p.57 = p;
      p.70 = (int) p.57;
      fde_cfi.75 = (int) fde_cfi;
      D.22605 = p.70 - fde_cfi.75;
      D.22606 = (unsigned int) D.22605;
      i.63 = (sizetype) i;
      D.22603 = buf + i.63;
      memcpy (D.22603, fde_cfi, D.22606);
      p.57 = p;
      p.70 = (int) p.57;
      fde_cfi.75 = (int) fde_cfi;
      D.22605 = p.70 - fde_cfi.75;
      i = D.22605 + i;
      D.22607 = i > buf_len;
      D.22608 = (long int) D.22607;
      D.22609 = __builtin_expect (D.22608, 0);
      if (D.22609 != 0) goto <D.22610>; else goto <D.22611>;
      <D.22610>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 965, "i <= buf_len");
      <D.22611>:
      i.77 = (unsigned int) i;
      *out_len = i.77;
      i.78 = (unsigned int) i;
      D.22613 = monoeg_realloc (buf, i.78);
      return D.22613;
    }
  finally
    {
      p = {CLOBBER};
    }
}


read_encoded_val (guint32 encoding, guint8 * p, guint8 * * endp)
{
  unsigned int D.22618;
  int D.22619;
  gint64 D.22620;
  gint64 res;

  D.22618 = encoding & 15;
  switch (D.22618) <default: <D.22084>, case 11: <D.22083>, case 12: <D.22081>>
  <D.22081>:
  res = MEM[(gint64 *)p];
  p = p + 8;
  goto <D.22082>;
  <D.22083>:
  D.22619 = MEM[(gint32 *)p];
  res = (gint64) D.22619;
  p = p + 4;
  goto <D.22082>;
  <D.22084>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "unwind.c", 717);
  <D.22082>:
  *endp = p;
  D.22620 = res;
  return D.22620;
}


decode_lsda (guint8 * lsda, guint8 * code, struct MonoJitExceptionInfo * * ex_info, guint32 * ex_info_len, void * * * type_info, int * this_reg, int * this_offset)
{
  guint8 * p.79;
  _Bool D.22623;
  long int D.22624;
  long int D.22625;
  _Bool D.22628;
  long int D.22629;
  long int D.22630;
  unsigned char D.22633;
  guint8 * p.80;
  _Bool D.22637;
  long int D.22638;
  long int D.22639;
  unsigned int D.22642;
  int D.22643;
  _Bool D.22645;
  long int D.22646;
  long int D.22647;
  unsigned int D.22650;
  unsigned int p.81;
  unsigned int D.22652;
  unsigned int D.22653;
  guint8 * p.82;
  unsigned int ncall_sites.83;
  unsigned int D.22658;
  void * D.22659;
  unsigned int ncall_sites.84;
  unsigned int D.22663;
  void * D.22664;
  unsigned int D.22665;
  guint8 * p.85;
  _Bool D.22667;
  long int D.22668;
  long int D.22669;
  unsigned int tinfo.86;
  unsigned int D.22673;
  _Bool D.22674;
  long int D.22675;
  long int D.22676;
  void * * D.22681;
  unsigned int i.87;
  unsigned int D.22685;
  void * * D.22686;
  struct MonoJitExceptionInfo * D.22687;
  unsigned int D.22688;
  struct MonoJitExceptionInfo * D.22689;
  sizetype block_start_offset.88;
  void * D.22691;
  sizetype block_size.89;
  sizetype D.22693;
  guint8 * D.22694;
  sizetype landing_pad.90;
  void * D.22696;
  guint8 * p;
  int i;
  int ncall_sites;
  int this_encoding;
  guint32 mono_magic;
  guint32 version;

  try
    {
      p = lsda;
      p.79 = p;
      mono_magic = decode_uleb128 (p.79, &p);
      D.22623 = mono_magic != 1297084239;
      D.22624 = (long int) D.22623;
      D.22625 = __builtin_expect (D.22624, 0);
      if (D.22625 != 0) goto <D.22626>; else goto <D.22627>;
      <D.22626>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 740, "mono_magic == 0x4d4fef4f");
      <D.22627>:
      p.79 = p;
      version = decode_uleb128 (p.79, &p);
      D.22628 = version != 1;
      D.22629 = (long int) D.22628;
      D.22630 = __builtin_expect (D.22629, 0);
      if (D.22630 != 0) goto <D.22631>; else goto <D.22632>;
      <D.22631>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 742, "version == 1");
      <D.22632>:
      p.79 = p;
      D.22633 = *p.79;
      this_encoding = (int) D.22633;
      p.79 = p;
      p.80 = p.79 + 1;
      p = p.80;
      if (this_encoding == 3) goto <D.22635>; else goto <D.22636>;
      <D.22635>:
      {
        gint32 op;
        gint32 reg;
        gint32 offset;

        p.79 = p;
        D.22633 = *p.79;
        op = (gint32) D.22633;
        D.22637 = op != 146;
        D.22638 = (long int) D.22637;
        D.22639 = __builtin_expect (D.22638, 0);
        if (D.22639 != 0) goto <D.22640>; else goto <D.22641>;
        <D.22640>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 750, "op == DW_OP_bregx");
        <D.22641>:
        p.79 = p;
        p.80 = p.79 + 1;
        p = p.80;
        p.79 = p;
        D.22642 = decode_uleb128 (p.79, &p);
        reg = (gint32) D.22642;
        p.79 = p;
        offset = decode_sleb128 (p.79, &p);
        D.22643 = mono_dwarf_reg_to_hw_reg (reg);
        *this_reg = D.22643;
        *this_offset = offset;
      }
      goto <D.22644>;
      <D.22636>:
      D.22645 = this_encoding != 255;
      D.22646 = (long int) D.22645;
      D.22647 = __builtin_expect (D.22646, 0);
      if (D.22647 != 0) goto <D.22648>; else goto <D.22649>;
      <D.22648>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 758, "this_encoding == DW_EH_PE_omit");
      <D.22649>:
      *this_reg = -1;
      *this_offset = -1;
      <D.22644>:
      p.79 = p;
      D.22650 = decode_uleb128 (p.79, &p);
      ncall_sites = (int) D.22650;
      p.79 = p;
      p.81 = (unsigned int) p.79;
      D.22652 = p.81 + 3;
      D.22653 = D.22652 & 4294967292;
      p.82 = (guint8 *) D.22653;
      p = p.82;
      if (ex_info != 0B) goto <D.22655>; else goto <D.22656>;
      <D.22655>:
      ncall_sites.83 = (unsigned int) ncall_sites;
      D.22658 = ncall_sites.83 * 24;
      D.22659 = monoeg_malloc0 (D.22658);
      *ex_info = D.22659;
      ncall_sites.84 = (unsigned int) ncall_sites;
      *ex_info_len = ncall_sites.84;
      <D.22656>:
      if (type_info != 0B) goto <D.22661>; else goto <D.22662>;
      <D.22661>:
      ncall_sites.83 = (unsigned int) ncall_sites;
      D.22663 = ncall_sites.83 * 4;
      D.22664 = monoeg_malloc0 (D.22663);
      *type_info = D.22664;
      <D.22662>:
      i = 0;
      goto <D.22108>;
      <D.22107>:
      {
        int block_start_offset;
        int block_size;
        int landing_pad;
        guint8 * tinfo;

        p.79 = p;
        D.22665 = MEM[(const guint32 *)p.79];
        block_start_offset = (int) D.22665;
        p.79 = p;
        p.85 = p.79 + 4;
        p = p.85;
        p.79 = p;
        D.22665 = MEM[(const guint32 *)p.79];
        block_size = (int) D.22665;
        p.79 = p;
        p.85 = p.79 + 4;
        p = p.85;
        p.79 = p;
        D.22665 = MEM[(const guint32 *)p.79];
        landing_pad = (int) D.22665;
        p.79 = p;
        p.85 = p.79 + 4;
        p = p.85;
        tinfo = p;
        p.79 = p;
        p.85 = p.79 + 4;
        p = p.85;
        D.22667 = landing_pad == 0;
        D.22668 = (long int) D.22667;
        D.22669 = __builtin_expect (D.22668, 0);
        if (D.22669 != 0) goto <D.22670>; else goto <D.22671>;
        <D.22670>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 786, "landing_pad");
        <D.22671>:
        tinfo.86 = (unsigned int) tinfo;
        D.22673 = tinfo.86 & 3;
        D.22674 = D.22673 != 0;
        D.22675 = (long int) D.22674;
        D.22676 = __builtin_expect (D.22675, 0);
        if (D.22676 != 0) goto <D.22677>; else goto <D.22678>;
        <D.22677>:
        monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 787, "((size_t)tinfo % 4) == 0");
        <D.22678>:
        if (ex_info != 0B) goto <D.22679>; else goto <D.22680>;
        <D.22679>:
        D.22681 = *type_info;
        if (D.22681 != 0B) goto <D.22682>; else goto <D.22683>;
        <D.22682>:
        D.22681 = *type_info;
        i.87 = (unsigned int) i;
        D.22685 = i.87 * 4;
        D.22686 = D.22681 + D.22685;
        *D.22686 = tinfo;
        <D.22683>:
        D.22687 = *ex_info;
        i.87 = (unsigned int) i;
        D.22688 = i.87 * 24;
        D.22689 = D.22687 + D.22688;
        block_start_offset.88 = (sizetype) block_start_offset;
        D.22691 = code + block_start_offset.88;
        D.22689->try_start = D.22691;
        D.22687 = *ex_info;
        i.87 = (unsigned int) i;
        D.22688 = i.87 * 24;
        D.22689 = D.22687 + D.22688;
        block_start_offset.88 = (sizetype) block_start_offset;
        block_size.89 = (sizetype) block_size;
        D.22693 = block_start_offset.88 + block_size.89;
        D.22694 = code + D.22693;
        D.22689->try_end = D.22694;
        D.22687 = *ex_info;
        i.87 = (unsigned int) i;
        D.22688 = i.87 * 24;
        D.22689 = D.22687 + D.22688;
        landing_pad.90 = (sizetype) landing_pad;
        D.22696 = code + landing_pad.90;
        D.22689->handler_start = D.22696;
        <D.22680>:
      }
      i = i + 1;
      <D.22108>:
      if (i < ncall_sites) goto <D.22107>; else goto <D.22109>;
      <D.22109>:
    }
  finally
    {
      p = {CLOBBER};
    }
}


decode_cie_op (guint8 * p, guint8 * * endp)
{
  guint8 * p.91;
  unsigned char D.22698;
  int D.22699;
  guint8 * p.92;
  guint8 * p.93;
  int op;

  p.91 = p;
  D.22698 = *p.91;
  D.22699 = (int) D.22698;
  op = D.22699 & 192;
  switch (op) <default: <D.22074>, case 0: <D.22065>, case 64: <D.22062>, case 128: <D.22064>>
  <D.22062>:
  p.91 = p;
  p.92 = p.91 + 1;
  p = p.92;
  goto <D.22063>;
  <D.22064>:
  p.91 = p;
  p.92 = p.91 + 1;
  p = p.92;
  p.91 = p;
  decode_uleb128 (p.91, &p);
  goto <D.22063>;
  <D.22065>:
  {
    int ext_op;

    p.91 = p;
    D.22698 = *p.91;
    ext_op = (int) D.22698;
    p.91 = p;
    p.92 = p.91 + 1;
    p = p.92;
    switch (ext_op) <default: <D.22073>, case 4: <D.22071>, case 12: <D.22067>, case 13: <D.22070>, case 14: <D.22069>, case 17: <D.22072>>
    <D.22067>:
    p.91 = p;
    decode_uleb128 (p.91, &p);
    p.91 = p;
    decode_uleb128 (p.91, &p);
    goto <D.22068>;
    <D.22069>:
    p.91 = p;
    decode_uleb128 (p.91, &p);
    goto <D.22068>;
    <D.22070>:
    p.91 = p;
    decode_uleb128 (p.91, &p);
    goto <D.22068>;
    <D.22071>:
    p.91 = p;
    p.93 = p.91 + 4;
    p = p.93;
    goto <D.22068>;
    <D.22072>:
    p.91 = p;
    decode_uleb128 (p.91, &p);
    p.91 = p;
    decode_uleb128 (p.91, &p);
    goto <D.22068>;
    <D.22073>:
    monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "unwind.c", 691);
    <D.22068>:
    goto <D.22063>;
  }
  <D.22074>:
  monoeg_assertion_message ("* Assertion: should not be reached at %s:%d\n", "unwind.c", 696);
  <D.22063>:
  p.91 = p;
  *endp = p.91;
}


mono_unwind_decode_llvm_mono_fde (guint8 * fde, int fde_len, guint8 * cie, guint8 * code, struct MonoLLVMFDEInfo * res)
{
  guint8 * p.94;
  unsigned char D.22703;
  guint8 * p.95;
  unsigned int D.22707;
  guint8 * p.96;
  sizetype aug_len.97;
  guint8 * p.98;
  int * D.22714;
  int * D.22715;
  void * * * D.22716;
  guint32 * D.22717;
  struct MonoJitExceptionInfo * * D.22718;
  unsigned int D.22719;
  unsigned int D.22720;
  unsigned int pers_encoding.99;
  _Bool D.22724;
  long int D.22725;
  long int D.22726;
  _Bool D.22729;
  long int D.22730;
  long int D.22731;
  int D.22734;
  _Bool D.22735;
  long int D.22736;
  long int D.22737;
  int p.100;
  int cie_cfi.101;
  sizetype fde_len.102;
  guint8 * D.22744;
  int D.22745;
  int fde_cfi.103;
  int D.22747;
  unsigned int D.22748;
  unsigned int cie_cfi_len.104;
  unsigned int fde_cfi_len.105;
  sizetype cie_cfi_len.106;
  guint8 * D.22752;
  unsigned int D.22753;
  guint8 * p;
  guint8 * fde_aug;
  guint8 * cie_cfi;
  guint8 * fde_cfi;
  guint8 * buf;
  int has_aug;
  int aug_len;
  int cie_cfi_len;
  int fde_cfi_len;
  gint32 code_align;
  gint32 data_align;
  gint32 return_reg;
  gint32 pers_encoding;

  try
    {
      memset (res, 0, 28);
      res->this_reg = -1;
      res->this_offset = -1;
      p = fde;
      p.94 = p;
      D.22703 = *p.94;
      has_aug = (int) D.22703;
      p.94 = p;
      p.95 = p.94 + 1;
      p = p.95;
      if (has_aug != 0) goto <D.22705>; else goto <D.22706>;
      <D.22705>:
      p.94 = p;
      D.22707 = MEM[(const guint32 *)p.94];
      aug_len = (int) D.22707;
      p.94 = p;
      p.96 = p.94 + 4;
      p = p.96;
      goto <D.22709>;
      <D.22706>:
      aug_len = 0;
      <D.22709>:
      fde_aug = p;
      p.94 = p;
      aug_len.97 = (sizetype) aug_len;
      p.98 = p.94 + aug_len.97;
      p = p.98;
      fde_cfi = p;
      if (has_aug != 0) goto <D.22712>; else goto <D.22713>;
      <D.22712>:
      {
        guint8 * lsda;

        lsda = fde_aug;
        D.22714 = &res->this_offset;
        D.22715 = &res->this_reg;
        D.22716 = &res->type_info;
        D.22717 = &res->ex_info_len;
        D.22718 = &res->ex_info;
        decode_lsda (lsda, code, D.22718, D.22717, D.22716, D.22715, D.22714);
      }
      <D.22713>:
      p = cie;
      p.94 = p;
      D.22719 = decode_uleb128 (p.94, &p);
      code_align = (gint32) D.22719;
      p.94 = p;
      data_align = decode_sleb128 (p.94, &p);
      p.94 = p;
      D.22720 = decode_uleb128 (p.94, &p);
      return_reg = (gint32) D.22720;
      p.94 = p;
      D.22703 = *p.94;
      pers_encoding = (gint32) D.22703;
      p.94 = p;
      p.95 = p.94 + 1;
      p = p.95;
      if (pers_encoding != 255) goto <D.22721>; else goto <D.22722>;
      <D.22721>:
      p.94 = p;
      pers_encoding.99 = (unsigned int) pers_encoding;
      read_encoded_val (pers_encoding.99, p.94, &p);
      <D.22722>:
      cie_cfi = p;
      D.22724 = code_align != 1;
      D.22725 = (long int) D.22724;
      D.22726 = __builtin_expect (D.22725, 0);
      if (D.22726 != 0) goto <D.22727>; else goto <D.22728>;
      <D.22727>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 1028, "code_align == 1");
      <D.22728>:
      D.22729 = data_align != -4;
      D.22730 = (long int) D.22729;
      D.22731 = __builtin_expect (D.22730, 0);
      if (D.22731 != 0) goto <D.22732>; else goto <D.22733>;
      <D.22732>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 1029, "data_align == DWARF_DATA_ALIGN");
      <D.22733>:
      D.22734 = mono_hw_reg_to_dwarf_reg (8);
      D.22735 = D.22734 != return_reg;
      D.22736 = (long int) D.22735;
      D.22737 = __builtin_expect (D.22736, 0);
      if (D.22737 != 0) goto <D.22738>; else goto <D.22739>;
      <D.22738>:
      monoeg_assertion_message ("* Assertion at %s:%d, condition `%s\' not met\n", "unwind.c", 1030, "return_reg == DWARF_PC_REG");
      <D.22739>:
      p = cie_cfi;
      <D.22186>:
      p.94 = p;
      D.22703 = *p.94;
      if (D.22703 == 0) goto <D.22185>; else goto <D.22740>;
      <D.22740>:
      p.94 = p;
      decode_cie_op (p.94, &p);
      goto <D.22186>;
      <D.22185>:
      p.94 = p;
      p.100 = (int) p.94;
      cie_cfi.101 = (int) cie_cfi;
      cie_cfi_len = p.100 - cie_cfi.101;
      fde_len.102 = (sizetype) fde_len;
      D.22744 = fde + fde_len.102;
      D.22745 = (int) D.22744;
      fde_cfi.103 = (int) fde_cfi;
      fde_cfi_len = D.22745 - fde_cfi.103;
      D.22747 = cie_cfi_len + fde_cfi_len;
      D.22748 = (unsigned int) D.22747;
      buf = monoeg_malloc0 (D.22748);
      cie_cfi_len.104 = (unsigned int) cie_cfi_len;
      memcpy (buf, cie_cfi, cie_cfi_len.104);
      fde_cfi_len.105 = (unsigned int) fde_cfi_len;
      cie_cfi_len.106 = (sizetype) cie_cfi_len;
      D.22752 = buf + cie_cfi_len.106;
      memcpy (D.22752, fde_cfi, fde_cfi_len.105);
      D.22747 = cie_cfi_len + fde_cfi_len;
      D.22753 = (unsigned int) D.22747;
      res->unw_info_len = D.22753;
      res->unw_info = buf;
    }
  finally
    {
      p = {CLOBBER};
    }
}


mono_unwind_get_cie_program ()
{
  struct GSList * D.22754;

  D.22754 = mono_arch_get_cie_program ();
  return D.22754;
}


