File fix-var-tracking.diff of Package gcc33

Subject: [development-gcc] Fix bug in var-tracking WRT location list for
    DW_AT_frame_base

Hello,

I'd like this patch
(http://gcc.gnu.org/ml/gcc-patches/2004-06/msg01730.html)
to be added to SLES9 compiler.

Bootstrapped/regtested mainline ia64 and x86-64, bootstrapping hammer branch
 in progress.

Josef

2004-06-22  Josef Zlomek  <zlomekj@suse.cz>

        * var-tracking.c: Fix some comments.
        (frame_stack_adjust): New.
        (vt_stack_adjustments): Init stack_adjust of entry block to
        minus stack adjustment of function prologue.
        (vt_add_function_parameters): Do not adjust locations of
        function arguments.
        (vt_initialize): Compute the stack adjustment of function
        prologue and offset the initial "location" of frame_base_decl
        from the stack pointer after prologue.

Index: gcc/var-tracking.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/var-tracking.c,v
retrieving revision 1.1.6.23
diff -c -p -r1.1.6.23 var-tracking.c
*** gcc/var-tracking.c	28 Apr 2004 06:00:46 -0000	1.1.6.23
--- gcc/var-tracking.c	22 Jun 2004 08:00:36 -0000
*************** static bool emit_notes;
*** 265,270 ****
--- 265,273 ----
  /* Fake variable for stack pointer.  */
  GTY(()) tree frame_base_decl;
  
+ /* Stack adjust caused by function prologue.  */
+ HOST_WIDE_INT frame_stack_adjust;
+ 
  /* Local function prototypes.  */
  static void stack_adjust_offset_pre_post	PARAMS ((rtx, HOST_WIDE_INT *,
  							 HOST_WIDE_INT *));
*************** bb_stack_adjust_offset (bb)
*** 494,500 ****
    VTI (bb)->out.stack_adjust = offset;
  }
  
! /* Compute stack adjustment caused by function prolog.  */
  
  static HOST_WIDE_INT
  prologue_stack_adjust ()
--- 497,503 ----
    VTI (bb)->out.stack_adjust = offset;
  }
  
! /* Compute stack adjustment caused by function prologue.  */
  
  static HOST_WIDE_INT
  prologue_stack_adjust ()
*************** vt_stack_adjustments ()
*** 538,544 ****
  
    /* Initialize entry block.  */
    VTI (ENTRY_BLOCK_PTR)->visited = true;
!   VTI (ENTRY_BLOCK_PTR)->out.stack_adjust = 0;
  
    /* Allocate stack for back-tracking up CFG.  */
    stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge));
--- 541,547 ----
  
    /* Initialize entry block.  */
    VTI (ENTRY_BLOCK_PTR)->visited = true;
!   VTI (ENTRY_BLOCK_PTR)->out.stack_adjust = frame_stack_adjust;
  
    /* Allocate stack for back-tracking up CFG.  */
    stack = xmalloc ((n_basic_blocks + 1) * sizeof (edge));
*************** variable_was_changed (var, htab)
*** 1985,1993 ****
  }
  
  /* Set the location of frame_base_decl to LOC in dataflow set SET.  This
!    function expects that
!    frame_base_decl has already one location for offset 0 in the variable table.
!  */
  
  static void
  set_frame_base_location (set, loc)
--- 1988,1995 ----
  }
  
  /* Set the location of frame_base_decl to LOC in dataflow set SET.  This
!    function expects that frame_base_decl has already one location for offset 0
!    in the variable table.  */
  
  static void
  set_frame_base_location (set, loc)
*************** static void
*** 2580,2590 ****
  vt_add_function_parameters ()
  {
    tree parm;
-   HOST_WIDE_INT stack_adjust = 0;
    
-   if (!frame_pointer_needed)
-     stack_adjust = prologue_stack_adjust ();
- 
    for (parm = DECL_ARGUMENTS (current_function_decl);
         parm; parm = TREE_CHAIN (parm))
      {
--- 2582,2588 ----
*************** vt_add_function_parameters ()
*** 2619,2626 ****
  #endif
  
        incoming = eliminate_regs (incoming, 0, NULL_RTX);
-       if (!frame_pointer_needed && GET_CODE (incoming) == MEM)
- 	incoming = adjust_stack_reference (incoming, -stack_adjust);
        out = &VTI (ENTRY_BLOCK_PTR)->out;
  
        if (GET_CODE (incoming) == REG)
--- 2617,2622 ----
*************** vt_initialize ()
*** 2786,2791 ****
--- 2782,2789 ----
      {
        rtx base;
  
+       frame_stack_adjust = -prologue_stack_adjust ();
+ 
        /* Create fake variable for tracking stack pointer changes.  */
        frame_base_decl = make_node (VAR_DECL);
        DECL_NAME (frame_base_decl) = get_identifier ("___frame_base_decl");
*************** vt_initialize ()
*** 2793,2799 ****
        DECL_ARTIFICIAL (frame_base_decl) = 1;
  
        /* Set its initial "location".  */
!       base = gen_rtx_MEM (Pmode, stack_pointer_rtx);
        set_variable_part (&VTI (ENTRY_BLOCK_PTR)->out, base, frame_base_decl, 0);
      }
    else
--- 2791,2799 ----
        DECL_ARTIFICIAL (frame_base_decl) = 1;
  
        /* Set its initial "location".  */
!       base = gen_rtx_MEM (Pmode,
! 			  gen_rtx_PLUS (Pmode, stack_pointer_rtx,
! 					GEN_INT (frame_stack_adjust)));
        set_variable_part (&VTI (ENTRY_BLOCK_PTR)->out, base, frame_base_decl, 0);
      }
    else
openSUSE Build Service is sponsored by