This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] eh_frame handling


Michal Ludvig wrote:
> Hi all,
> these changes will allow backtrace even through objects without 
> debug_frame section. Note that gcc must produce all information 
> necessary in eh_frame (perhaps -fasynchronous-unwind-tables flag?).
> 
> 2002-05-14  Michal Ludvig  <mludvig@suse.cz>
>         * dwarf2cfi.c (frame_state_for): Added safety check for a valid
>         fde->cie_ptr.
>         (dwarf2_build_frame_info): Added handling for eh_frame.

I have slightly rewritten finding the appropriate CIE for a given FDE so 
that it counts with multiple objfiles now.

Any comments? Can I commit?

Michal Ludvig
-- 
* SuSE CR, s.r.o     * mludvig@suse.cz
* +420 2 9654 5373   * http://www.suse.cz
Index: dwarf2cfi.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2cfi.c,v
retrieving revision 1.5
diff -c -3 -p -r1.5 dwarf2cfi.c
*** dwarf2cfi.c	14 May 2002 08:24:26 -0000	1.5
--- dwarf2cfi.c	15 May 2002 13:59:06 -0000
*************** frame_state_for (struct context *context
*** 802,812 ****
    context->args_size = 0;
    context->lsda = 0;
  
!   if ((fde = get_fde_for_addr (context->ra - 1)) != NULL)
!     {
!       fs->pc = fde->initial_location;
  
        cie = fde->cie_ptr;
        fs->code_align = cie->code_align;
        fs->data_align = cie->data_align;
        fs->retaddr_column = cie->ra;
--- 802,816 ----
    context->args_size = 0;
    context->lsda = 0;
  
!   if ((fde = get_fde_for_addr (context->ra - 1)) == NULL)
!     return;
!   
!   fs->pc = fde->initial_location;
  
+   if (fde->cie_ptr)
+   {
        cie = fde->cie_ptr;
+       
        fs->code_align = cie->code_align;
        fs->data_align = cie->data_align;
        fs->retaddr_column = cie->ra;
*************** frame_state_for (struct context *context
*** 817,823 ****
  			   cie->data + cie->data_length, context, fs);
        execute_cfa_program (cie->objfile, fde->data,
  			   fde->data + fde->data_length, context, fs);
!     }
  }
  
  static void
--- 821,831 ----
  			   cie->data + cie->data_length, context, fs);
        execute_cfa_program (cie->objfile, fde->data,
  			   fde->data + fde->data_length, context, fs);
!   }
!   else
! 	internal_error (__FILE__, __LINE__,
! 		"%s(): Internal error: fde->cie_ptr==NULL !", 
! 		__func__);
  }
  
  static void
*************** dwarf2_build_frame_info (struct objfile 
*** 1367,1372 ****
--- 1375,1381 ----
    bfd *abfd = objfile->obfd;
    char *start = NULL;
    char *end = NULL;
+   int from_eh = 0;
  
    obstack_init (&unwind_tmp_obstack);
  
*************** dwarf2_build_frame_info (struct objfile 
*** 1389,1394 ****
--- 1398,1405 ----
  
        start = dwarf_frame_buffer;
        end = dwarf_frame_buffer + dwarf_eh_frame_size;
+ 
+       from_eh = 1;
      }
  
    if (start)
*************** dwarf2_build_frame_info (struct objfile 
*** 1410,1416 ****
  	  cie_id = read_length (abfd, start, &bytes_read, dwarf64);
  	  start += bytes_read;
  
! 	  if (is_cie (cie_id, dwarf64))
  	    {
  	      struct cie_unit *cie = cie_unit_alloc ();
  	      char *aug;
--- 1421,1427 ----
  	  cie_id = read_length (abfd, start, &bytes_read, dwarf64);
  	  start += bytes_read;
  
! 	  if ((from_eh && cie_id == 0) || is_cie (cie_id, dwarf64))
  	    {
  	      struct cie_unit *cie = cie_unit_alloc ();
  	      char *aug;
*************** dwarf2_build_frame_info (struct objfile 
*** 1479,1486 ****
  	      fde->initial_location = read_pointer (abfd, &start);
  	      fde->address_range = read_pointer (abfd, &start);
  
! 	      for (cie = cie_chunks;
! 		   cie && (cie->offset != cie_id); cie = cie->next);
  	      if (!cie)
  		error ("dwarf cfi error: can't find CIE pointer");
  	      fde->cie_ptr = cie;
--- 1490,1509 ----
  	      fde->initial_location = read_pointer (abfd, &start);
  	      fde->address_range = read_pointer (abfd, &start);
  
! 	      cie = cie_chunks;
! 	      while(cie)
! 	      {
! 	        if (cie.objfile == objfile)
! 		{
! 		  if (from_eh && (cie->offset == (unit_offset + bytes_read - cie_id)))
! 		    break;
! 		  if (!from_eh && (cie->offset == cie_id))
! 		    break;
! 		}
! 
! 		cie = cie->next;
! 	      }
! 	    
  	      if (!cie)
  		error ("dwarf cfi error: can't find CIE pointer");
  	      fde->cie_ptr = cie;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]