Author: dcoakley Date: 2011-05-06 17:50:59 -0400 (Fri, 06 May 2011) New Revision: 3589
Modified: trunk/osprey/be/be/driver.cxx trunk/osprey/be/cg/cg.cxx trunk/osprey/be/cg/cgdwarf.cxx trunk/osprey/be/cg/gra_mon/gra_spill.cxx trunk/osprey/be/cg/x8664/cgdwarf_targ.cxx Log: Implement a frame-pointer optimization for the x86 target. When there is no dynamic allocation of stack in the PU, it is not necessary to use register %rbp as the frame pointer. In this case the .eh_frame section needs to describe the location of the registers needed to support unwinding for exception handling. Approved by: Jian-Xin Lai Modified: trunk/osprey/be/be/driver.cxx =================================================================== --- trunk/osprey/be/be/driver.cxx 2011-05-06 18:19:55 UTC (rev 3588) +++ trunk/osprey/be/be/driver.cxx 2011-05-06 21:50:59 UTC (rev 3589) @@ -1967,7 +1967,7 @@ Pu_Table [ST_pu (St_Table [PU_Info_proc_sym (current_pu)])]; // C++ PU having exception regions, or with -g - if ((PU_cxx_lang (func) && PU_has_region (func)) || Debug_Level > 0 + if (Debug_Level > 0 #ifdef KEY || PU_has_goto_outer_block(func) #endif Modified: trunk/osprey/be/cg/cg.cxx =================================================================== --- trunk/osprey/be/cg/cg.cxx 2011-05-06 18:19:55 UTC (rev 3588) +++ trunk/osprey/be/cg/cg.cxx 2011-05-06 21:50:59 UTC (rev 3589) @@ -753,7 +753,8 @@ // Cannot enable emit_unwind_info if Force_Frame_Pointer is not set // Need this flag set for C++ exceptions and for -g if (!CG_emit_unwind_info_Set) - CG_emit_unwind_info = Force_Frame_Pointer; + CG_emit_unwind_info = (Force_Frame_Pointer + || (PU_cxx_lang (Get_Current_PU()) && PU_has_region (Get_Current_PU()))); // Don't eliminate prologue OPs in main because they guide cgemit.cxx on // where to insert OPs to set up the control registers. Bug 8141. Modified: trunk/osprey/be/cg/cgdwarf.cxx =================================================================== --- trunk/osprey/be/cg/cgdwarf.cxx 2011-05-06 18:19:55 UTC (rev 3588) +++ trunk/osprey/be/cg/cgdwarf.cxx 2011-05-06 21:50:59 UTC (rev 3589) @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009 Advanced Micro Devices, Inc. All Rights Reserved. + * Copyright (C) 2009-2010 Advanced Micro Devices, Inc. All Rights Reserved. */ /* @@ -2438,15 +2438,25 @@ end_offset, low_pc, high_pc); #else - Dwarf_Unsigned pushbp_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, - eh_pushbp_label[0], - scn_index); - Dwarf_Unsigned movespbp_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, - eh_movespbp_label[0], - scn_index); - Dwarf_Unsigned adjustsp_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, - eh_adjustsp_label[0], - scn_index); + Dwarf_Unsigned pushbp_entry; + Dwarf_Unsigned movespbp_entry; + if (Current_PU_Stack_Model != SMODEL_SMALL) + { + pushbp_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, + eh_pushbp_label[0], + scn_index); + movespbp_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, + eh_movespbp_label[0], + scn_index); + } + Dwarf_Unsigned adjustsp_entry; + if (eh_adjustsp_label[0] != 0) + adjustsp_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, + eh_adjustsp_label[0], + scn_index); + else + adjustsp_entry = begin_entry; + Dwarf_Unsigned callee_saved_reg; INT num_callee_saved_regs; if (num_callee_saved_regs = Cgdwarf_Num_Callee_Saved_Regs()) @@ -2508,12 +2518,15 @@ end_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, last_bb_labels[pu_entry], scn_index); - pushbp_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, + if (Current_PU_Stack_Model != SMODEL_SMALL) + { + pushbp_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, eh_pushbp_label[pu_entry], scn_index); - movespbp_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, + movespbp_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, eh_movespbp_label[pu_entry], scn_index); + } adjustsp_entry = Cg_Dwarf_Symtab_Entry(CGD_LABIDX, eh_adjustsp_label[pu_entry], scn_index); Modified: trunk/osprey/be/cg/gra_mon/gra_spill.cxx =================================================================== --- trunk/osprey/be/cg/gra_mon/gra_spill.cxx 2011-05-06 18:19:55 UTC (rev 3588) +++ trunk/osprey/be/cg/gra_mon/gra_spill.cxx 2011-05-06 21:50:59 UTC (rev 3589) @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008-2009 Advanced Micro Devices, Inc. All Rights Reserved. + * Copyright (C) 2008-2010 Advanced Micro Devices, Inc. All Rights Reserved. */ /* @@ -1314,6 +1314,7 @@ #ifdef TARG_X8664 TN* orig_tn = lrange->Original_TN(); if (CG_push_pop_int_saved_regs && ! Gen_Frame_Pointer && + ! (PU_cxx_lang (Get_Current_PU()) && PU_has_region (Get_Current_PU())) && ! TN_is_float(orig_tn) && TN_is_save_reg(orig_tn)) { // put saved location info in Saved_Callee_Saved_Regs for dwarf generation SAVE_REG_LOC sr; Modified: trunk/osprey/be/cg/x8664/cgdwarf_targ.cxx =================================================================== --- trunk/osprey/be/cg/x8664/cgdwarf_targ.cxx 2011-05-06 18:19:55 UTC (rev 3588) +++ trunk/osprey/be/cg/x8664/cgdwarf_targ.cxx 2011-05-06 21:50:59 UTC (rev 3589) @@ -1,4 +1,8 @@ /* + * Copyright (C) 2010-2011 Advanced Micro Devices, Inc. All Rights Reserved. + */ + +/* * Copyright (C) 2007. PathScale, LLC. All Rights Reserved. */ /* @@ -100,37 +104,68 @@ INT low_pc, INT high_pc) { + BOOL stack_used = FALSE; Dwarf_Error dw_error; Dwarf_P_Fde fde; if ( ! CG_emit_unwind_info) return NULL; + { + OP *op; + for (op = BB_first_op(firstbb); op != NULL; op = OP_next(op)) + { + if (OP_result(op, 0) == SP_TN || + OP_code(op) == TOP_pushq || OP_code(op) == TOP_pushl) + { + stack_used = TRUE; + break; + } + } + } + fde = dwarf_new_fde (dw_dbg, &dw_error); - // Generate FDE instructions - dwarf_add_fde_inst (fde, DW_CFA_advance_loc4, + if (Current_PU_Stack_Model != SMODEL_SMALL) + { + // Generate FDE instructions + dwarf_add_fde_inst (fde, DW_CFA_advance_loc4, begin_label, movespbp_label, &dw_error); - dwarf_add_fde_inst (fde, DW_CFA_def_cfa_offset, + dwarf_add_fde_inst (fde, DW_CFA_def_cfa_offset, Is_Target_64bit() ? 0x10 : 0x8, 0x0, &dw_error); - dwarf_add_fde_inst (fde, DW_CFA_offset, Is_Target_64bit() ? 0x6 : 0x5, + dwarf_add_fde_inst (fde, DW_CFA_offset, Is_Target_64bit() ? 0x6 : 0x5, 0x2, &dw_error); - dwarf_add_fde_inst (fde, DW_CFA_advance_loc4, + dwarf_add_fde_inst (fde, DW_CFA_advance_loc4, movespbp_label, adjustsp_label, &dw_error); - dwarf_add_fde_inst (fde, DW_CFA_def_cfa_register, + dwarf_add_fde_inst (fde, DW_CFA_def_cfa_register, Is_Target_64bit() ? 0x6 : 0x5, 0x0, &dw_error); - if (Cgdwarf_Num_Callee_Saved_Regs()) { + } else { + dwarf_add_fde_inst (fde, DW_CFA_advance_loc4, + begin_label, adjustsp_label, &dw_error); + if (stack_used && Frame_Len != 0) + dwarf_add_fde_inst (fde, DW_CFA_def_cfa_offset, + Frame_Len + (Push_Pop_Int_Saved_Regs() + 1)*(Is_Target_64bit()?8:4), + 0x0, &dw_error); + else + dwarf_add_fde_inst (fde, DW_CFA_def_cfa_offset, + Is_Target_64bit()?8:4, + 0x0, &dw_error); + } + if (stack_used && Cgdwarf_Num_Callee_Saved_Regs() != 0) { INT num = Cgdwarf_Num_Callee_Saved_Regs(); dwarf_add_fde_inst (fde, DW_CFA_advance_loc4, adjustsp_label, - callee_saved_reg, &dw_error); + callee_saved_reg, &dw_error); for (INT i = num - 1; i >= 0; i --) { TN* tn = Cgdwarf_Nth_Callee_Saved_Reg(i); ST* sym = Cgdwarf_Nth_Callee_Saved_Reg_Location(i); INT n = Is_Target_64bit() ? 16 : 8; // data alignment factor INT d_align = Is_Target_64bit() ? 8 : 4; + INT64 d_frame_len; mUINT8 reg_id = REGISTER_machine_id (TN_register_class(tn), TN_register(tn)); + + d_frame_len = Frame_Len/d_align + (Push_Pop_Int_Saved_Regs() + 1); // If we need the DWARF register id's for all registers, we need a // general register mapping from REGISTER_machine_id to DWARF register // id. But the following suffices for this case, @@ -144,11 +179,22 @@ reg_id = 6; else if (reg_id == 4) // %edi reg_id = 7; + else if (reg_id == 2) // %ebp + reg_id = 5; + } else { + if (reg_id == 2) //%rbp + reg_id = 6; } if (reg_id == 1) reg_id = 3; // %rbx - dwarf_add_fde_inst (fde, DW_CFA_offset, reg_id, - ((ST_base(sym) == FP_Sym ? -1 : 1)*ST_ofst(sym)+n)/d_align, + if (Current_PU_Stack_Model != SMODEL_SMALL) + dwarf_add_fde_inst (fde, DW_CFA_offset, reg_id, + (((ST_base(sym) == FP_Sym) ? -1 : 1)*ST_ofst(sym)+n)/d_align, &dw_error); + else + dwarf_add_fde_inst (fde, DW_CFA_offset, reg_id, + d_frame_len - (ST_ofst(sym))/d_align, + &dw_error); + } } ------------------------------------------------------------------------------ WhatsUp Gold - Download Free Network Management Software The most intuitive, comprehensive, and cost-effective network management toolset available today. Delivers lowest initial acquisition cost and overall TCO of any competing solution. http://p.sf.net/sfu/whatsupgold-sd _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel