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]

[PATCH] Fix frame ID comparison problem on s390


Hello,

even after the siglongjmp patch, there was still one failure reported
with the signull test case on s390(x).

The reason turned out to be a problem with frame ID comparison.  In
the back trace we have
  handler
  <sigtramp>
  <NULL call>
  caller

As the NULL call doesn't set up a stack frame, and because our CFA is
determined by stack pointer at function entry, this means that the 
NULL call frame and the sigtramp frame have the same 'stack_addr'
component of their respective frame IDs.

Furthermore, the NULL call frame has 0 as 'code_addr' component of the
frame ID, because the current PC is in fact 0.

Due to the way frame ID comparison works, this causes the two IDs to
compare equal: the stack_addr is equal, and a zero code_addr is
considered a wild card matching any code_addr.

This in turn causes the backtrace to abort since it encounters two
frames with the same frame ID ...

The patch below is a simple fix (cheating a bit ...) in the s390 back
end: we simply set the code_addr component to 1 if the PC is 0.  (Note
that this can never happen normally because code addresses are always
2-aligned on our platform.)

Tested on s390-ibm-linux and s390x-ibm-linux, fixes one test suite
failure.

OK?

ChangeLog:

	* s390-tdep.c (s390_stub_frame_this_id): Set code_addr part of ID
	to 1 if the PC is 0.

Index: gdb/s390-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/s390-tdep.c,v
retrieving revision 1.132
diff -c -p -r1.132 s390-tdep.c
*** gdb/s390-tdep.c	4 May 2004 18:50:26 -0000	1.132
--- gdb/s390-tdep.c	20 May 2004 13:23:44 -0000
*************** s390_stub_frame_this_id (struct frame_in
*** 2078,2086 ****
  			 void **this_prologue_cache,
  			 struct frame_id *this_id)
  {
    struct s390_stub_unwind_cache *info
      = s390_stub_frame_unwind_cache (next_frame, this_prologue_cache);
!   *this_id = frame_id_build (info->frame_base, frame_pc_unwind (next_frame));
  }
  
  static void
--- 2078,2089 ----
  			 void **this_prologue_cache,
  			 struct frame_id *this_id)
  {
+   CORE_ADDR pc = frame_pc_unwind (next_frame);
    struct s390_stub_unwind_cache *info
      = s390_stub_frame_unwind_cache (next_frame, this_prologue_cache);
!   /* For 'call via NULL function pointer' stubs we use 1 as code address
!      in order to avoid the '0 matches everything' special case.  */
!   *this_id = frame_id_build (info->frame_base, pc? pc : 1);
  }
  
  static void
-- 
  Dr. Ulrich Weigand
  weigand@informatik.uni-erlangen.de


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