[Ups-cvs] ups/ups ao_dwfutil.c,1.12,1.13
Brought to you by:
ianedwards
From: Tom H. <th...@us...> - 2005-02-25 10:12:55
|
Update of /cvsroot/ups/ups/ups In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22395 Modified Files: ao_dwfutil.c Log Message: Make DWARF unwind processing work when a 32 bit executable is being debugged on a 64 bit machine. Index: ao_dwfutil.c =================================================================== RCS file: /cvsroot/ups/ups/ups/ao_dwfutil.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** ao_dwfutil.c 18 Feb 2005 12:14:11 -0000 1.12 --- ao_dwfutil.c 25 Feb 2005 10:12:42 -0000 1.13 *************** *** 35,38 **** --- 35,39 ---- #include "ups.h" #include "symtab.h" + #include "target.h" #include "ci.h" #include "st.h" *************** *** 547,562 **** } - #if defined(ARCH_386_64) - #define CFA_COL DW_FRAME_CFA_COL - #define FP_COL 6 - #define SP_COL 7 - #define RA_COL 16 - #elif defined(ARCH_386) - #define CFA_COL DW_FRAME_CFA_COL - #define FP_COL 5 - #define SP_COL 4 - #define RA_COL 8 - #endif - #if defined(ARCH_386) --- 548,551 ---- *************** *** 573,589 **** Dwarf_Signed register_num; Dwarf_Signed offset; if ((rv = dwarf_get_fde_info_for_reg(fde, regnum, pc, &offset_relevant, ®ister_num, &offset, NULL, &err)) == DW_DLV_OK) { ! if (register_num == CFA_COL) *regval = cfa; ! else if (register_num == FP_COL) *regval = fp; ! else if (register_num == SP_COL) *regval = sp; ! else if (register_num == DW_FRAME_SAME_VAL && regnum == FP_COL) *regval = fp; ! else if (register_num == DW_FRAME_SAME_VAL && regnum == SP_COL) *regval = cfa; else --- 562,594 ---- Dwarf_Signed register_num; Dwarf_Signed offset; + int fp_col; + int sp_col; + + switch (xp_get_addrsize(xp)) + { + case 32: + fp_col = 5; + sp_col = 4; + break; + case 64: + fp_col = 6; + sp_col = 7; + break; + default: + panic("Unsupported address size"); + } if ((rv = dwarf_get_fde_info_for_reg(fde, regnum, pc, &offset_relevant, ®ister_num, &offset, NULL, &err)) == DW_DLV_OK) { ! if (register_num == DW_FRAME_CFA_COL) *regval = cfa; ! else if (register_num == fp_col) *regval = fp; ! else if (register_num == sp_col) *regval = sp; ! else if (register_num == DW_FRAME_SAME_VAL && regnum == fp_col) *regval = fp; ! else if (register_num == DW_FRAME_SAME_VAL && regnum == sp_col) *regval = cfa; else *************** *** 593,597 **** *regval += offset; ! if (rv == DW_DLV_OK && register_num == CFA_COL) dread_addrval(xp, *regval, regval); } --- 598,602 ---- *regval += offset; ! if (rv == DW_DLV_OK && register_num == DW_FRAME_CFA_COL) dread_addrval(xp, *regval, regval); } *************** *** 612,615 **** --- 617,639 ---- Dwarf_Fde *fde_data; Dwarf_Signed fde_count; + int fp_col; + int sp_col; + int ra_col; + + switch (xp_get_addrsize(xp)) + { + case 32: + fp_col = 5; + sp_col = 4; + ra_col = 8; + break; + case 64: + fp_col = 6; + sp_col = 7; + ra_col = 16; + break; + default: + panic("Unsupported address size"); + } if ((rv = dwarf_get_fde_list(dbg, &cie_data, &cie_count, &fde_data, &fde_count, &err)) == DW_DLV_OK) { *************** *** 624,633 **** taddr_t new_pc; ! if (dwf_unwind_reg(fde, xp, cfa, *fp, *sp, *pc, CFA_COL, &cfa) && ! dwf_unwind_reg(fde, xp, cfa, *fp, *sp, *pc, RA_COL, &new_pc)) { ! if (!dwf_unwind_reg(fde, xp, cfa, *fp, *sp, *pc, FP_COL, &new_fp)) new_fp = 0; ! if (!dwf_unwind_reg(fde, xp, cfa, *fp, *sp, *pc, SP_COL, &new_sp)) new_sp = cfa; --- 648,657 ---- taddr_t new_pc; ! if (dwf_unwind_reg(fde, xp, cfa, *fp, *sp, *pc, DW_FRAME_CFA_COL, &cfa) && ! dwf_unwind_reg(fde, xp, cfa, *fp, *sp, *pc, ra_col, &new_pc)) { ! if (!dwf_unwind_reg(fde, xp, cfa, *fp, *sp, *pc, fp_col, &new_fp)) new_fp = 0; ! if (!dwf_unwind_reg(fde, xp, cfa, *fp, *sp, *pc, sp_col, &new_sp)) new_sp = cfa; |