From b9aa4c4c7b1db71584032e03d0bee50c13664456 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Tue, 9 Aug 2011 15:18:29 +0200 Subject: [PATCH] Improve GDB performance on inferior dlopen calls (Gary Benson, BZ 698001). [python] Fix crash when pretty printer fails (Phil Muldoon, BZ 712715). Fix crash on invalid C++ mangled names (BZ 729283). --- gdb-dlopen-skip_inline_frames-perf.patch | 90 ++++++++ gdb-upstream.patch | 278 +++++++++++++++++++++++ gdb.spec | 11 +- 3 files changed, 378 insertions(+), 1 deletion(-) create mode 100644 gdb-dlopen-skip_inline_frames-perf.patch diff --git a/gdb-dlopen-skip_inline_frames-perf.patch b/gdb-dlopen-skip_inline_frames-perf.patch new file mode 100644 index 0000000..1141dd2 --- /dev/null +++ b/gdb-dlopen-skip_inline_frames-perf.patch @@ -0,0 +1,90 @@ +diff --git a/gdb/infrun.c b/gdb/infrun.c +index 91e0fc2..1d7c808 100644 +--- a/gdb/infrun.c ++++ b/gdb/infrun.c +@@ -3111,6 +3111,56 @@ fill_in_stop_func (struct gdbarch *gdbarch, + } + } + ++/* Argument for at_solib_event_breakpoint_helper. */ ++ ++struct solib_event_breakpoint_helper_arg ++{ ++ CORE_ADDR prev_pc; ++ int shlib_bp_count; ++ int other_bp_count; ++}; ++ ++/* Helper for at_solib_event_breakpoint. */ ++ ++static int ++at_solib_event_breakpoint_helper (struct breakpoint *b, void *argp) ++{ ++ struct solib_event_breakpoint_helper_arg *arg ++ = (struct solib_event_breakpoint_helper_arg *) argp; ++ struct bp_location *loc; ++ ++ for (loc = b->loc; loc; loc = loc->next) ++ { ++ if (loc->pspace == current_program_space ++ && (loc->address == stop_pc || loc->address == arg->prev_pc)) ++ { ++ if (b->type == bp_shlib_event) ++ arg->shlib_bp_count++; ++ else ++ { ++ arg->other_bp_count++; ++ return 1; /* quick exit */ ++ } ++ } ++ } ++ ++ return 0; /* carry on looking */ ++} ++ ++/* Nonzero if the location stopoed at is the shlib event breakpoint. */ ++ ++static int ++at_solib_event_breakpoint (struct execution_control_state *ecs) ++{ ++ struct solib_event_breakpoint_helper_arg arg; ++ arg.prev_pc = ecs->event_thread->prev_pc; ++ arg.shlib_bp_count = arg.other_bp_count = 0; ++ ++ iterate_over_breakpoints (at_solib_event_breakpoint_helper, &arg); ++ ++ return arg.shlib_bp_count && !arg.other_bp_count; ++} ++ + /* Given an execution control state that has been freshly filled in + by an event from the inferior, figure out what it means and take + appropriate action. */ +@@ -3964,11 +4014,23 @@ handle_inferior_event (struct execution_control_state *ecs) + ecs->random_signal = 0; + stopped_by_random_signal = 0; + +- /* Hide inlined functions starting here, unless we just performed stepi or +- nexti. After stepi and nexti, always show the innermost frame (not any +- inline function call sites). */ +- if (ecs->event_thread->control.step_range_end != 1) +- skip_inline_frames (ecs->ptid); ++ /* If we have stopped at the solib event breakpoint and ++ stop_on_solib_events is not set then we can avoid calling ++ anything that calls find_pc_section. This saves a lot ++ of time when the inferior loads a lot of shared libraries, ++ because otherwise the section map gets regenerated every ++ time we stop. */ ++ if (stop_on_solib_events ++ || ecs->event_thread->suspend.stop_signal != TARGET_SIGNAL_TRAP ++ || stop_after_trap ++ || !at_solib_event_breakpoint (ecs)) ++ { ++ /* Hide inlined functions starting here, unless we just ++ performed stepi or nexti. After stepi and nexti, always show ++ the innermost frame (not any inline function call sites). */ ++ if (ecs->event_thread->control.step_range_end != 1) ++ skip_inline_frames (ecs->ptid); ++ } + + if (ecs->event_thread->suspend.stop_signal == TARGET_SIGNAL_TRAP + && ecs->event_thread->control.trap_expected diff --git a/gdb-upstream.patch b/gdb-upstream.patch index b73d4d2..b380c2f 100644 --- a/gdb-upstream.patch +++ b/gdb-upstream.patch @@ -937,3 +937,281 @@ http://sourceware.org/ml/gdb-cvs/2011-07/msg00224.html }; static void + + + +[patch][python] Fix sigsegv when a printer fails to return a value and string_print is set. +http://sourceware.org/ml/gdb-patches/2011-07/msg00719.html +http://sourceware.org/ml/gdb-cvs/2011-07/msg00234.html + +### src/gdb/ChangeLog 2011/07/27 19:31:30 1.13236 +### src/gdb/ChangeLog 2011/07/28 10:36:37 1.13237 +## -1,3 +1,8 @@ ++2011-07-28 Phil Muldoon ++ ++ * varobj.c (value_get_print_value): Move hint check later into the ++ function. Comment function. Free thevalue before reusing it. ++ + 2011-07-27 Jan Kratochvil + Pedro Alves + +--- src/gdb/varobj.c 2011/07/18 09:21:43 1.180 ++++ src/gdb/varobj.c 2011/07/28 10:36:40 1.181 +@@ -2610,25 +2610,21 @@ + + if (PyObject_HasAttr (value_formatter, gdbpy_to_string_cst)) + { +- char *hint; + struct value *replacement; + PyObject *output = NULL; + +- hint = gdbpy_get_display_hint (value_formatter); +- if (hint) +- { +- if (!strcmp (hint, "string")) +- string_print = 1; +- xfree (hint); +- } +- + output = apply_varobj_pretty_printer (value_formatter, + &replacement, + stb); ++ ++ /* If we have string like output ... */ + if (output) + { + make_cleanup_py_decref (output); + ++ /* If this is a lazy string, extract it. For lazy ++ strings we always print as a string, so set ++ string_print. */ + if (gdbpy_is_lazy_string (output)) + { + gdbpy_extract_lazy_string (output, &str_addr, &type, +@@ -2638,12 +2634,27 @@ + } + else + { ++ /* If it is a regular (non-lazy) string, extract ++ it and copy the contents into THEVALUE. If the ++ hint says to print it as a string, set ++ string_print. Otherwise just return the extracted ++ string as a value. */ ++ + PyObject *py_str + = python_string_to_target_python_string (output); + + if (py_str) + { + char *s = PyString_AsString (py_str); ++ char *hint; ++ ++ hint = gdbpy_get_display_hint (value_formatter); ++ if (hint) ++ { ++ if (!strcmp (hint, "string")) ++ string_print = 1; ++ xfree (hint); ++ } + + len = PyString_Size (py_str); + thevalue = xmemdup (s, len + 1, len + 1); +@@ -2662,6 +2673,9 @@ + gdbpy_print_stack (); + } + } ++ /* If the printer returned a replacement value, set VALUE ++ to REPLACEMENT. If there is not a replacement value, ++ just use the value passed to this function. */ + if (replacement) + value = replacement; + } +@@ -2672,12 +2686,18 @@ + get_formatted_print_options (&opts, format_code[(int) format]); + opts.deref_ref = 0; + opts.raw = 1; ++ ++ /* If the THEVALUE has contents, it is a regular string. */ + if (thevalue) + LA_PRINT_STRING (stb, type, thevalue, len, encoding, 0, &opts); + else if (string_print) ++ /* Otherwise, if string_print is set, and it is not a regular ++ string, it is a lazy string. */ + val_print_string (type, encoding, str_addr, len, stb, &opts); + else ++ /* All other cases. */ + common_val_print (value, stb, 0, &opts, current_language); ++ + thevalue = ui_file_xstrdup (stb, NULL); + + do_cleanups (old_chain); +### src/gdb/testsuite/ChangeLog 2011/07/27 21:18:39 1.2816 +### src/gdb/testsuite/ChangeLog 2011/07/28 10:36:40 1.2817 +## -1,3 +1,10 @@ ++2011-07-28 Phil Muldoon ++ ++ * gdb.python/py-mi.exp: Test printers returning string hint, and ++ also not returning a value. ++ * gdb.python/py-prettyprint.c: Add testcase for above. ++ * gdb.python/py-prettyprint.py: Add test printer for above. ++ + 2011-07-27 Jan Kratochvil + + * gdb.dwarf2/dw2-simple-locdesc.S: Change DWARF version to 3. +--- src/gdb/testsuite/gdb.python/py-mi.exp 2011/07/26 18:38:55 1.13 ++++ src/gdb/testsuite/gdb.python/py-mi.exp 2011/07/28 10:36:40 1.14 +@@ -284,6 +284,13 @@ mi_list_varobj_children nstype2 { + { {nstype2.} {} 6 {char \[6\]} } + } "list children after setting exception flag" + ++mi_create_varobj me me \ ++ "create me varobj" ++ ++mi_gdb_test "-var-evaluate-expression me" \ ++ "\\^done,value=\".*\"" \ ++ "evaluate me varobj" ++ + # C++ MI tests + gdb_exit + if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \ +--- src/gdb/testsuite/gdb.python/py-prettyprint.c 2011/04/29 12:45:46 1.12 ++++ src/gdb/testsuite/gdb.python/py-prettyprint.c 2011/07/28 10:36:40 1.13 +@@ -149,6 +149,11 @@ + + typedef struct justchildren nostring_type; + ++struct memory_error ++{ ++ const char *s; ++}; ++ + struct container + { + string name; +@@ -227,6 +232,7 @@ + /* Clearing by being `static' could invoke an other GDB C++ bug. */ + struct nullstr nullstr; + nostring_type nstype, nstype2; ++ struct memory_error me; + struct ns ns, ns2; + struct lazystring estring, estring2; + struct hint_error hint_error; +@@ -234,6 +240,8 @@ + nstype.elements = narray; + nstype.len = 0; + ++ me.s = "blah"; ++ + init_ss(&ss, 1, 2); + init_ss(ssa+0, 3, 4); + init_ss(ssa+1, 5, 6); +--- src/gdb/testsuite/gdb.python/py-prettyprint.py 2011/04/11 17:40:41 1.11 ++++ src/gdb/testsuite/gdb.python/py-prettyprint.py 2011/07/28 10:36:40 1.12 +@@ -17,6 +17,7 @@ + # printers. + + import re ++import gdb + + # Test returning a Value from a printer. + class string_print: +@@ -186,6 +187,18 @@ + yield 's', self.val['s'] + yield 'x', self.val['x'] + ++class MemoryErrorString: ++ "Raise an error" ++ ++ def __init__(self, val): ++ self.val = val ++ ++ def to_string(self): ++ raise gdb.MemoryError ("Cannot access memory."); ++ ++ def display_hint (self): ++ return 'string' ++ + def lookup_function (val): + "Look-up and return a pretty-printer that can print val." + +@@ -261,6 +274,8 @@ + pretty_printers_dict[re.compile ('^struct hint_error$')] = pp_hint_error + pretty_printers_dict[re.compile ('^hint_error$')] = pp_hint_error + ++ pretty_printers_dict[re.compile ('^memory_error$')] = MemoryErrorString ++ + pretty_printers_dict = {} + + register_pretty_printers () + + + +commit 84be2b4d0a55c95697c9ecc72bb31c2fbd316127 +Author: ian +Date: Tue Jul 26 14:28:23 2011 +0000 + + * cp-demangle.c (d_print_init): Initialize pack_index field. + (d_print_comp): Check for NULL template argument. + * testsuite/demangle-expected: Add test case. + + + git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@176791 138bc75d-0d04-0410-961f-82ee72b054a4 + +### a/libiberty/ChangeLog +### b/libiberty/ChangeLog +## -1,3 +1,9 @@ ++2011-07-26 Ian Lance Taylor ++ ++ * cp-demangle.c (d_print_init): Initialize pack_index field. ++ (d_print_comp): Check for NULL template argument. ++ * testsuite/demangle-expected: Add test case. ++ + 2011-07-22 Gerald Pfeifer + + PR target/49817 +--- a/libiberty/cp-demangle.c ++++ b/libiberty/cp-demangle.c +@@ -1,5 +1,5 @@ + /* Demangler for g++ V3 ABI. +- Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 ++ Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 + Free Software Foundation, Inc. + Written by Ian Lance Taylor . + +@@ -3306,6 +3306,7 @@ d_print_init (struct d_print_info *dpi, demangle_callbackref callback, + dpi->last_char = '\0'; + dpi->templates = NULL; + dpi->modifiers = NULL; ++ dpi->pack_index = 0; + dpi->flush_count = 0; + + dpi->callback = callback; +@@ -3893,6 +3894,13 @@ d_print_comp (struct d_print_info *dpi, int options, + struct demangle_component *a = d_lookup_template_argument (dpi, sub); + if (a && a->type == DEMANGLE_COMPONENT_TEMPLATE_ARGLIST) + a = d_index_template_argument (a, dpi->pack_index); ++ ++ if (a == NULL) ++ { ++ d_print_error (dpi); ++ return; ++ } ++ + sub = a; + } + +--- a/libiberty/testsuite/demangle-expected ++++ b/libiberty/testsuite/demangle-expected +@@ -4010,6 +4010,12 @@ K<1, &S::m>::f() + _ZN1KILi1EXadL_ZN1S1mEEEE1fEv + K<1, &S::m>::f() + # ++# Used to crash -- binutils PR 13030. ++--format=gnu-v3 ++_ZSt10_ConstructI10CellBorderIS0_EEvPT_DpOT0_ ++_ZSt10_ConstructI10CellBorderIS0_EEvPT_DpOT0_ ++_ZSt10_ConstructI10CellBorderIS0_EEvPT_DpOT0_ ++# + # Ada (GNAT) tests. + # + # Simple test. diff --git a/gdb.spec b/gdb.spec index d0732af..ca03f93 100644 --- a/gdb.spec +++ b/gdb.spec @@ -27,7 +27,7 @@ Version: 7.3.50.20110722 # 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: 3%{?_with_upstream:.upstream}%{?dist} +Release: 4%{?_with_upstream:.upstream}%{?dist} License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain Group: Development/Debuggers @@ -530,6 +530,9 @@ Patch556: gdb-gcc46-stdarg-prologue.patch # rebuild to fix it, we need to be able to use gdb :) Patch579: gdb-7.2.50-sparc-add-workaround-to-broken-debug-files.patch +# Improve GDB performance on inferior dlopen calls (Gary Benson, BZ 698001). +Patch617: gdb-dlopen-skip_inline_frames-perf.patch + BuildRequires: ncurses-devel%{?_isa} texinfo gettext flex bison expat-devel%{?_isa} # --without-system-readline # Requires: readline%{?_isa} @@ -791,6 +794,7 @@ rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c %patch548 -p1 %patch556 -p1 %patch579 -p1 +%patch617 -p1 %patch393 -p1 %patch335 -p1 @@ -1213,6 +1217,11 @@ fi %{_infodir}/gdb.info* %changelog +* Tue Aug 9 2011 Jan Kratochvil - 7.3.50.20110722-4.fc16 +- Improve GDB performance on inferior dlopen calls (Gary Benson, BZ 698001). +- [python] Fix crash when pretty printer fails (Phil Muldoon, BZ 712715). +- Fix crash on invalid C++ mangled names (BZ 729283). + * Fri Jul 29 2011 Jan Kratochvil - 7.3.50.20110722-3.fc16 - Fix regression from VLA merge affecting -O0 -g watchpoints.