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

Reply via email to