diff --git a/gdb-rhbz1260558-ppc64le-skip_trampoline_code.patch b/gdb-rhbz1260558-ppc64le-skip_trampoline_code.patch new file mode 100644 index 0000000..cdbbd6a --- /dev/null +++ b/gdb-rhbz1260558-ppc64le-skip_trampoline_code.patch @@ -0,0 +1,257 @@ +http://sourceware.org/ml/gdb-patches/2015-09/msg00183.html +Subject: [ppc64le patch v3] Use skip_entrypoint for skip_trampoline_code + + +--mYCpIKhGyMATD0i+ +Content-Type: text/plain; charset=us-ascii +Content-Disposition: inline + +An update to PASS the testcase on non-ppc64le archs. + +--mYCpIKhGyMATD0i+ +Content-Type: text/plain; charset=us-ascii +Content-Disposition: inline; filename=4 + +gdb/ChangeLog +2015-09-07 Jan Kratochvil + + * 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-07 Jan Kratochvil + + * 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. + +diff --git a/gdb/linespec.c b/gdb/linespec.c +index 8f102fa..4c29c12 100644 +--- a/gdb/linespec.c ++++ b/gdb/linespec.c +@@ -3570,6 +3570,8 @@ minsym_found (struct linespec_state *self, struct objfile *objfile, + 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); +diff --git a/gdb/ppc64-tdep.c b/gdb/ppc64-tdep.c +index bb23b6a..4a0b93a 100644 +--- a/gdb/ppc64-tdep.c ++++ b/gdb/ppc64-tdep.c +@@ -454,8 +454,8 @@ ppc64_standard_linkage4_target (struct frame_info *frame, + 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 @@ ppc64_skip_trampoline_code (struct frame_info *frame, CORE_ADDR pc) + 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. + +diff --git a/gdb/symtab.c b/gdb/symtab.c +index 1ba691e..f65e809 100644 +--- a/gdb/symtab.c ++++ b/gdb/symtab.c +@@ -3629,7 +3629,11 @@ find_function_start_sal (struct symbol *sym, int funfirstline) + && (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; + } + +diff --git a/gdb/testsuite/gdb.opt/solib-intra-step-lib.c b/gdb/testsuite/gdb.opt/solib-intra-step-lib.c +new file mode 100644 +index 0000000..9ab1211 +--- /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 . */ ++ ++#include ++ ++void ++shlib_second (int dummy) ++{ /* second-retry */ ++ abort (); /* second-hit */ ++} ++ ++void ++shlib_first (void) ++{ /* first-retry */ ++ shlib_second (0); /* first-hit */ ++} +diff --git a/gdb/testsuite/gdb.opt/solib-intra-step-main.c b/gdb/testsuite/gdb.opt/solib-intra-step-main.c +new file mode 100644 +index 0000000..186bd5f +--- /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 . */ ++ ++extern void shlib_first (void); ++ ++int ++main (void) ++{ ++ shlib_first (); ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.opt/solib-intra-step.exp b/gdb/testsuite/gdb.opt/solib-intra-step.exp +new file mode 100644 +index 0000000..044c4bd +--- /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 . ++ ++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) .*" + +--mYCpIKhGyMATD0i+-- + diff --git a/gdb.spec b/gdb.spec index 29ca50a..92885d4 100644 --- a/gdb.spec +++ b/gdb.spec @@ -26,7 +26,7 @@ Version: 7.10 # The release always contains a leading reserved number, start it at 1. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing. -Release: 19%{?dist} +Release: 20%{?dist} License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain and GFDL Group: Development/Debuggers @@ -540,6 +540,9 @@ Patch978: gdb-jit-reader-multilib.patch Patch1029: gdb-probes-based-interface-robust-1of2.patch Patch1030: gdb-probes-based-interface-robust-2of2.patch +# [ppc64le] Use skip_entrypoint for skip_trampoline_code (RH BZ 1260558). +Patch1031: gdb-rhbz1260558-ppc64le-skip_trampoline_code.patch + %if 0%{!?rhel:1} || 0%{?rhel} > 6 # RL_STATE_FEDORA_GDB would not be found for: # Patch642: gdb-readline62-ask-more-rh.patch @@ -835,6 +838,7 @@ find -name "*.info*"|xargs rm -f %patch978 -p1 %patch1029 -p1 %patch1030 -p1 +%patch1031 -p1 %patch848 -p1 %if 0%{!?el6:1} @@ -1344,6 +1348,9 @@ then fi %changelog +* Thu Sep 10 2015 Jan Kratochvil - 7.10-20.fc23 +- [ppc64le] Use skip_entrypoint for skip_trampoline_code (RH BZ 1260558). + * Thu Sep 10 2015 Jan Kratochvil - 7.10-19.fc23 - Add changelog entry and fix librpm dependency broken by Peter Robinson.