2009-07-16 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / unwind.c
index 975738ab9256c350486020e6fb39ba816978c13e..47294a0deeac3c4ae47cd004479cbf043b0e28f0 100644 (file)
@@ -38,7 +38,7 @@ static int unwind_info_size;
 #define unwind_lock() EnterCriticalSection (&unwind_mutex)
 #define unwind_unlock() LeaveCriticalSection (&unwind_mutex)
 
-#ifdef __x86_64__
+#ifdef TARGET_AMD64
 static int map_hw_reg_to_dwarf_reg [] = { 0, 2, 1, 3, 7, 6, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
 #define NUM_REGS AMD64_NREG
 #define DWARF_DATA_ALIGN (-8)
@@ -318,7 +318,7 @@ print_dwarf_state (int cfa_reg, int cfa_offset, int ip, int nregs, Loc *location
  */
 void
 mono_unwind_frame (guint8 *unwind_info, guint32 unwind_info_len, 
-                                  guint8 *start_ip, guint8 *end_ip, guint8 *ip, gssize *regs, 
+                                  guint8 *start_ip, guint8 *end_ip, guint8 *ip, mgreg_t *regs, 
                                   int nregs, guint8 **out_cfa) 
 {
        Loc locations [NUM_REGS];
@@ -608,7 +608,7 @@ decode_cie_op (guint8 *p, guint8 **endp)
  *   Return the unwind opcodes encoded in a DWARF FDE entry.
  */
 guint8*
-mono_unwind_get_ops_from_fde (guint8 *fde, guint32 *out_len)
+mono_unwind_get_ops_from_fde (guint8 *fde, guint32 *out_len, guint32 *code_len)
 {
        guint8 *p, *cie, *code, *fde_cfi, *cie_cfi;
        gint32 fde_len, cie_offset, pc_begin, pc_range, aug_len, fde_data_len;
@@ -641,6 +641,9 @@ mono_unwind_get_ops_from_fde (guint8 *fde, guint32 *out_len)
        fde_cfi = p;
        fde_data_len = fde + 4 + fde_len - p;
 
+       if (code_len)
+               *code_len = pc_range;
+
        /* Decode CIE */
        p = cie;
        cie_len = *(guint32*)p;