From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ulrich Weigand To: gdb-patches@sources.redhat.com Subject: [PATCH] Fix frame ID comparison problem on s390 Date: Thu, 20 May 2004 13:31:00 -0000 Message-id: <200405201331.PAA24924@faui1d.informatik.uni-erlangen.de> X-SW-Source: 2004-05/msg00606.html 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 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