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]

RFA: try to ensure abort has valid return address



2002-01-12  Jim Blandy  <jimb@redhat.com>

	* gdb.base/coremaker.c (func2): Try to arrange for the return
	address passed to `abort' to fall within `func2', so we can get
	backtraces.

Index: gdb/testsuite/gdb.base/coremaker.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gdb/testsuite/gdb.base/coremaker.c,v
retrieving revision 1.4
diff -c -r1.4 coremaker.c
*** gdb/testsuite/gdb.base/coremaker.c	1999/06/25 23:44:28	1.4
--- gdb/testsuite/gdb.base/coremaker.c	2002/01/12 06:42:09
***************
*** 81,87 ****
  }
  
  void
! func2 ()
  {
    int coremaker_local[5];
    int i;
--- 81,87 ----
  }
  
  void
! func2 (int please_abort)
  {
    int coremaker_local[5];
    int i;
***************
*** 104,116 ****
    for (i = 0; i < 5; i++)
      coremaker_bss += coremaker_local[i];
    coremaker_data = coremaker_ro + 1;
!   abort ();
  }
  
  void
  func1 ()
  {
!   func2 ();
  }
  
  int main ()
--- 104,138 ----
    for (i = 0; i < 5; i++)
      coremaker_bss += coremaker_local[i];
    coremaker_data = coremaker_ro + 1;
! 
!   /* This function used to simply call `abort' unconditionally.
!      However, because GCC sometimes knows that `abort' will never
!      return, the `call' instruction that invokes `abort' would
!      sometimes be the very last instruction in this function.  The
!      epilogue instructions you'd normally expect --- deallocating the
!      frame, jumping to the return address --- were omitted, since
!      they'd never be reached anyway.  This means that the return
!      address passed to abort (which it'll never use) actually points
!      beyond the end of the caller!  Sometimes the return address
!      seemed to be in the next function; sometimes it seemed to be in
!      padding instructions between functions, for which there was no
!      line number info.  In any case, GDB had difficulties producing a
!      backtrace in this case.
! 
!      There's no way to force the compiler not to put the call to
!      `abort' at the very end of the function --- after all, it is
!      functionally correct to do so.  But we hope that putting it in a
!      conditional will make it more likely that GDB can get a
!      backtrace, and find coremaker_local, which is what we really care
!      about.  */
!   if (please_abort)
!     abort ();
  }
  
  void
  func1 ()
  {
!   func2 (1);
  }
  
  int main ()


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