Source: gdb Source-Version: 7.10-1 Tags: patch User: debian-powe...@lists.debian.org Usertags: ppc64el
-- Hi, package "notmuch" is having a problem on some tests because of gdb missing some ppc64el improvements. See bug #803363: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=803363 I did a workaround on notmuch but the patch fixing gdb is the one proposed there and explained : https://sourceware.org/ml/gdb-patches/2015-09/msg00080.html The final accepted patch is here : http://patchwork.sourceware.org/patch/8626/ Here is attached a debdiff that I used on top of gdb-7.10-1 and tested to compile notmuch and run its testsuite successfully. I removed the ChangeLog hunks so that it apply properly. Thanks, F.
diff -Nru gdb-7.10/debian/patches/Use-skip_entrypoint-for-skip_trampoline_code.patch gdb-7.10/debian/patches/Use-skip_entrypoint-for-skip_trampoline_code.patch --- gdb-7.10/debian/patches/Use-skip_entrypoint-for-skip_trampoline_code.patch 1970-01-01 01:00:00.000000000 +0100 +++ gdb-7.10/debian/patches/Use-skip_entrypoint-for-skip_trampoline_code.patch 2015-10-30 08:37:48.000000000 +0100 @@ -0,0 +1,274 @@ +From 141c5cc4c44a6ce1a5c628c0f4849a8b1c91d383 Mon Sep 17 00:00:00 2001 +From: Jan Kratochvil <jan.kratoch...@redhat.com> +Date: Tue, 15 Sep 2015 19:08:04 +0200 +Subject: [PATCH] [ppc64le] Use skip_entrypoint for skip_trampoline_code + +ppc64le loses control when stepping between two PLT-called functions inside +a shared library: + +29 shlib_second (); /* first-hit */^M +(gdb) PASS: gdb.base/solib-intra-step.exp: first-hit +step^M +^M +Program received signal SIGABRT, Aborted.^M +0x00003fffb7cbe578 in __GI_raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56^M +56 return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig);^M +(gdb) FAIL: gdb.base/solib-intra-step.exp: second-hit +-> +29 shlib_second (); /* first-hit */^M +(gdb) PASS: gdb.base/solib-intra-step.exp: first-hit +step^M +shlib_second () at ./gdb.base/solib-intra-step-lib.c:23^M +23 abort (); /* second-hit */^M +(gdb) PASS: gdb.base/solib-intra-step.exp: second-hit + +This is because gdbarch_skip_trampoline_code() will resolve the final function +as shlib_second+0 and place there the breakpoint, but ld.so will jump after +the breakpoint - at shlib_second+8 - as it is ELFv2 local symbol optimization: + +Dump of assembler code for function shlib_second: + 0x0000000000000804 <+0>: addis r2,r12,2 + 0x0000000000000808 <+4>: addi r2,r2,30668 + 0x000000000000080c <+8>: mflr r0 + +Currently gdbarch_skip_entrypoint() has been called in skip_prologue_sal() and +fill_in_stop_func() but that is not enough. I believe +gdbarch_skip_entrypoint() should be called after every +gdbarch_skip_trampoline_code(). + +gdb/ChangeLog +2015-09-15 Jan Kratochvil <jan.kratoch...@redhat.com> + + * linespec.c (minsym_found): Call gdbarch_skip_entrypoint. + * ppc64-tdep.c (ppc64_skip_trampoline_code): Rename to ... + (ppc64_skip_trampoline_code_1): ... here. + (ppc64_skip_trampoline_code): New wrapper function. + * symtab.c (find_function_start_sal): Call gdbarch_skip_entrypoint. + +gdb/testsuite/ChangeLog +2015-09-15 Jan Kratochvil <jan.kratoch...@redhat.com> + + * gdb.opt/solib-intra-step-lib.c: New file. + * gdb.opt/solib-intra-step-main.c: New file. + * gdb.opt/solib-intra-step.exp: New file. +--- + gdb/linespec.c | 2 + + gdb/ppc64-tdep.c | 18 +++++- + gdb/symtab.c | 4 ++ + gdb/testsuite/gdb.opt/solib-intra-step-lib.c | 30 ++++++++++ + gdb/testsuite/gdb.opt/solib-intra-step-main.c | 25 ++++++++ + gdb/testsuite/gdb.opt/solib-intra-step.exp | 86 +++++++++++++++++++++++++++ + 8 files changed, 177 insertions(+), 2 deletions(-) + create mode 100644 gdb/testsuite/gdb.opt/solib-intra-step-lib.c + create mode 100644 gdb/testsuite/gdb.opt/solib-intra-step-main.c + create mode 100644 gdb/testsuite/gdb.opt/solib-intra-step.exp + +--- a/gdb/linespec.c ++++ b/gdb/linespec.c +@@ -3469,6 +3469,8 @@ + sal.pc = MSYMBOL_VALUE_ADDRESS (objfile, msymbol); + sal.pc = gdbarch_convert_from_func_ptr_addr (gdbarch, sal.pc, + ¤t_target); ++ if (gdbarch_skip_entrypoint_p (gdbarch)) ++ sal.pc = gdbarch_skip_entrypoint (gdbarch, sal.pc); + } + else + skip_prologue_sal (&sal); +--- a/gdb/ppc64-tdep.c ++++ b/gdb/ppc64-tdep.c +@@ -454,8 +454,8 @@ + When the execution direction is EXEC_REVERSE, scan backward to + check whether we are in the middle of a PLT stub. */ + +-CORE_ADDR +-ppc64_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) ++static CORE_ADDR ++ppc64_skip_trampoline_code_1 (struct frame_info *frame, CORE_ADDR pc) + { + #define MAX(a,b) ((a) > (b) ? (a) : (b)) + unsigned int insns[MAX (MAX (MAX (ARRAY_SIZE (ppc64_standard_linkage1), +@@ -530,6 +530,20 @@ + return 0; + } + ++/* Wrapper of ppc64_skip_trampoline_code_1 checking also ++ ppc_elfv2_skip_entrypoint. */ ++ ++CORE_ADDR ++ppc64_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) ++{ ++ struct gdbarch *gdbarch = get_frame_arch (frame); ++ ++ pc = ppc64_skip_trampoline_code_1 (frame, pc); ++ if (pc != 0 && gdbarch_skip_entrypoint_p (gdbarch)) ++ pc = gdbarch_skip_entrypoint (gdbarch, pc); ++ return pc; ++} ++ + /* Support for convert_from_func_ptr_addr (ARCH, ADDR, TARG) on PPC64 + GNU/Linux. + +--- a/gdb/symtab.c ++++ b/gdb/symtab.c +@@ -3623,7 +3623,11 @@ + && (COMPUNIT_LOCATIONS_VALID (SYMTAB_COMPUNIT (sal.symtab)) + || SYMTAB_LANGUAGE (sal.symtab) == language_asm)) + { ++ struct gdbarch *gdbarch = symbol_arch (sym); ++ + sal.pc = BLOCK_START (SYMBOL_BLOCK_VALUE (sym)); ++ if (gdbarch_skip_entrypoint_p (gdbarch)) ++ sal.pc = gdbarch_skip_entrypoint (gdbarch, sal.pc); + return sal; + } + +--- /dev/null ++++ b/gdb/testsuite/gdb.opt/solib-intra-step-lib.c +@@ -0,0 +1,30 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2015 Free Software Foundation, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see <http://www.gnu.org/licenses/>. */ ++ ++#include <stdlib.h> ++ ++void ++shlib_second (int dummy) ++{ /* second-retry */ ++ abort (); /* second-hit */ ++} ++ ++void ++shlib_first (void) ++{ /* first-retry */ ++ shlib_second (0); /* first-hit */ ++} +--- /dev/null ++++ b/gdb/testsuite/gdb.opt/solib-intra-step-main.c +@@ -0,0 +1,25 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2015 Free Software Foundation, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see <http://www.gnu.org/licenses/>. */ ++ ++extern void shlib_first (void); ++ ++int ++main (void) ++{ ++ shlib_first (); ++ return 0; ++} +--- /dev/null ++++ b/gdb/testsuite/gdb.opt/solib-intra-step.exp +@@ -0,0 +1,86 @@ ++# Copyright 2015 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see <http://www.gnu.org/licenses/>. ++ ++standard_testfile ++ ++if {[skip_shlib_tests]} { ++ return 0 ++} ++ ++# Library file. ++set libname "${testfile}-lib" ++set srcfile_lib ${srcdir}/${subdir}/${libname}.c ++set binfile_lib [standard_output_file ${libname}.so] ++set lib_flags [list debug optimize=-O2] ++# Binary file. ++set testfile "${testfile}-main" ++set srcfile ${srcdir}/${subdir}/${testfile}.c ++set binfile [standard_output_file ${testfile}] ++set bin_flags [list debug shlib=${binfile_lib}] ++ ++if [get_compiler_info] { ++ return -1 ++} ++ ++if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} $lib_flags] != "" ++ || [gdb_compile ${srcfile} ${binfile} executable $bin_flags] != "" } { ++ untested "Could not compile $binfile_lib or $binfile." ++ return -1 ++} ++ ++clean_restart ${binfile} ++gdb_load_shlibs $binfile_lib ++ ++if ![runto_main] then { ++ return 0 ++} ++ ++set test "first-hit" ++gdb_test_multiple "step" $test { ++ -re " first-hit .*\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re " first-retry .*\r\n$gdb_prompt $" { ++ gdb_test "step" " first-hit .*" "first-hit (optimized)" ++ } ++} ++ ++set test "second-hit" ++gdb_test_multiple "step" $test { ++ -re " second-hit .*\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re " first-retry .*\r\n$gdb_prompt $" { ++ set test "second-hit (optimized 1)" ++ gdb_test_multiple "step" $test { ++ -re " second-hit .*\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re " first-hit .*\r\n$gdb_prompt $" { ++ gdb_test "step" " second-hit .*" "second-hit (optimized 2)" ++ } ++ } ++ } ++ -re " second-retry .*\r\n$gdb_prompt $" { ++ gdb_test "step" " second-hit .*" "second-hit (optimized 3)" ++ } ++} ++ ++if ![runto_main] then { ++ return 0 ++} ++ ++gdb_breakpoint "shlib_second" ++gdb_continue_to_breakpoint "second-hit" ".* (second-hit|second-retry) .*" diff -Nru gdb-7.10/debian/patches/series gdb-7.10/debian/patches/series --- gdb-7.10/debian/patches/series 2015-09-02 03:56:11.000000000 +0200 +++ gdb-7.10/debian/patches/series 2015-10-30 08:37:37.000000000 +0100 @@ -6,3 +6,4 @@ gdb-glibc-vdso-workaround.patch load-versioned-libcc1.patch Segmentation-fault-on-add-symbol-file-command.patch +Use-skip_entrypoint-for-skip_trampoline_code.patch