Could a gatekeeper please review the attached patch? Most changes are
in the cg. The proposed log message is:
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.
Thanks,
-David Coakley / AMD Open Source Compiler Engineering
Index: osprey/be/be/driver.cxx
===================================================================
--- osprey/be/be/driver.cxx (revision 3583)
+++ osprey/be/be/driver.cxx (working copy)
@@ -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
Index: osprey/be/cg/cgdwarf.cxx
===================================================================
--- osprey/be/cg/cgdwarf.cxx (revision 3583)
+++ osprey/be/cg/cgdwarf.cxx (working copy)
@@ -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);
Index: osprey/be/cg/x8664/cgdwarf_targ.cxx
===================================================================
--- osprey/be/cg/x8664/cgdwarf_targ.cxx (revision 3583)
+++ osprey/be/cg/x8664/cgdwarf_targ.cxx (working copy)
@@ -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);
+
}
}
Index: osprey/be/cg/gra_mon/gra_spill.cxx
===================================================================
--- osprey/be/cg/gra_mon/gra_spill.cxx (revision 3583)
+++ osprey/be/cg/gra_mon/gra_spill.cxx (working copy)
@@ -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;
Index: osprey/be/cg/cg.cxx
===================================================================
--- osprey/be/cg/cg.cxx (revision 3583)
+++ osprey/be/cg/cg.cxx (working copy)
@@ -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.
------------------------------------------------------------------------------
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