[scl] Disable Python frame filters on scl.

- Update libraries opening performance fix from upstream.
- Fix C++ lookups performance regression (Doug Evans, BZ 972677).
This commit is contained in:
Jan Kratochvil 2013-06-10 15:04:37 +02:00
parent a5cf0a66f1
commit 19d4458238
14 changed files with 1562 additions and 1285 deletions

View File

@ -0,0 +1,209 @@
http://sourceware.org/ml/gdb-cvs/2013-06/msg00034.html
### src/gdb/ChangeLog 2013/06/05 20:43:53 1.15689
### src/gdb/ChangeLog 2013/06/05 22:28:51 1.15690
## -1,3 +1,14 @@
+2013-06-05 Doug Evans <dje@google.com>
+ Keith Seitz <keiths@redhat.com>
+
+ PR 15519
+ * cp-namespace.c (find_symbol_in_baseclass): Call
+ cp_lookup_symbol_in_namespace instead of cp_lookup_symbol_namespace.
+ Check result of call to lookup_symbol_static.
+ Call lookup_static_symbol_aux unconditionally.
+ Call check_typedef on base types before accessing them.
+ (cp_lookup_nested_symbol): Fix comment.
+
2013-06-05 Luis Machado <lgustavo@codesourcery.com>
* gnu-v3-abi.c (gnuv3_skip_trampoline): Handle thunk
--- src/gdb/cp-namespace.c 2013/05/30 17:29:06 1.67
+++ src/gdb/cp-namespace.c 2013/06/05 22:28:51 1.68
@@ -720,36 +720,40 @@
for (i = 0; i < TYPE_N_BASECLASSES (parent_type); ++i)
{
size_t len;
+ struct type *base_type = TYPE_BASECLASS (parent_type, i);
const char *base_name = TYPE_BASECLASS_NAME (parent_type, i);
if (base_name == NULL)
continue;
/* Search this particular base class. */
- sym = cp_lookup_symbol_namespace (base_name, name, block, VAR_DOMAIN);
+ sym = cp_lookup_symbol_in_namespace (base_name, name, block,
+ VAR_DOMAIN, 0);
if (sym != NULL)
break;
+ /* Now search all static file-level symbols. We have to do this for
+ things like typedefs in the class. First search in this symtab,
+ what we want is possibly there. */
len = strlen (base_name) + 2 + strlen (name) + 1;
concatenated_name = xrealloc (concatenated_name, len);
xsnprintf (concatenated_name, len, "%s::%s", base_name, name);
sym = lookup_symbol_static (concatenated_name, block, VAR_DOMAIN);
+ if (sym != NULL)
+ break;
- /* If there is currently no BLOCK, e.g., the inferior hasn't yet
- been started, then try searching all STATIC_BLOCK symbols in
- all objfiles. */
- if (block == NULL)
- {
- sym = lookup_static_symbol_aux (concatenated_name, VAR_DOMAIN);
- if (sym != NULL)
- break;
- }
+ /* Nope. We now have to search all static blocks in all objfiles,
+ even if block != NULL, because there's no guarantees as to which
+ symtab the symbol we want is in. */
+ sym = lookup_static_symbol_aux (concatenated_name, VAR_DOMAIN);
+ if (sym != NULL)
+ break;
/* If this class has base classes, search them next. */
- if (TYPE_N_BASECLASSES (TYPE_BASECLASS (parent_type, i)) > 0)
+ CHECK_TYPEDEF (base_type);
+ if (TYPE_N_BASECLASSES (base_type) > 0)
{
- sym = find_symbol_in_baseclass (TYPE_BASECLASS (parent_type, i),
- name, block);
+ sym = find_symbol_in_baseclass (base_type, name, block);
if (sym != NULL)
break;
}
@@ -797,8 +801,8 @@
if (sym != NULL)
return sym;
- /* Now search all static file-level symbols. Not strictly
- correct, but more useful than an error. We do not try to
+ /* Now search all static file-level symbols. We have to do this
+ for things like typedefs in the class. We do not try to
guess any imported namespace as even the fully specified
namespace search is already not C++ compliant and more
assumptions could make it too magic. */
### src/gdb/testsuite/ChangeLog 2013/06/05 20:38:37 1.3685
### src/gdb/testsuite/ChangeLog 2013/06/05 22:28:51 1.3686
## -1,3 +1,11 @@
+2013-06-05 Doug Evans <dje@google.com>
+ Keith Seitz <keiths@redhat.com>
+
+ * gdb.cp/derivation2.cc: New file.
+ * gdb.cp/derivation.cc (main): Call foo2.
+ * gdb.cp/derivation.exp: Add tests for typedefs in another
+ file, and when there's an active block.
+
2013-06-05 Luis Machado <lgustavo@codesourcery.com>
* gdb.cp/virtfunc.exp (make_one_vtable_result): Handle extra output
--- src/gdb/testsuite/gdb.cp/derivation2.cc
+++ src/gdb/testsuite/gdb.cp/derivation2.cc 2013-06-10 12:35:14.881272247 +0000
@@ -0,0 +1,49 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2013 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/>.
+ */
+
+/* A copy of some classes in derivation.cc so that we can test symbol lookup
+ in other CUs. */
+
+class A2 {
+public:
+ typedef int value_type;
+ value_type a;
+
+ A2()
+ {
+ a=1;
+ }
+};
+
+class D2 : public A2 {
+public:
+ value_type d;
+
+ D2()
+ {
+ d=7;
+ }
+};
+
+void
+foo2 ()
+{
+ D2 d2_instance;
+ d2_instance.a = 42;
+ d2_instance.d = 43;
+}
--- src/gdb/testsuite/gdb.cp/derivation.cc 2013/01/01 06:33:27 1.5
+++ src/gdb/testsuite/gdb.cp/derivation.cc 2013/06/05 22:28:51 1.6
@@ -16,6 +16,8 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+extern void foo2 (); /* from derivation2.cc */
+
namespace N {
typedef double value_type;
struct Base { typedef int value_type; };
@@ -306,9 +308,7 @@
N::Derived::value_type d = 1;
N::value_type n = 3.0;
dobj.doit ();
+ foo2 ();
return 0;
}
-
-
-
--- src/gdb/testsuite/gdb.cp/derivation.exp 2013/01/01 06:33:27 1.24
+++ src/gdb/testsuite/gdb.cp/derivation.exp 2013/06/05 22:28:51 1.25
@@ -32,14 +32,15 @@
load_lib "cp-support.exp"
-standard_testfile .cc
+standard_testfile derivation.cc derivation2.cc
-if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
+if {[prepare_for_testing $testfile.exp $testfile \
+ [list $srcfile $srcfile2] {debug c++}]} {
return -1
}
# Check inheritance of typedefs.
-foreach klass {"A" "D" "E" "F"} {
+foreach klass {"A" "D" "E" "F" "A2" "D2"} {
gdb_test "ptype ${klass}::value_type" "type = int"
gdb_test "whatis ${klass}::value_type" "type = int"
gdb_test "p (${klass}::value_type) 0" " = 0"
@@ -57,6 +58,13 @@
continue
}
+# Check inheritance of typedefs again, but this time with an active block.
+foreach klass {"A" "D" "A2" "D2"} {
+ gdb_test "ptype ${klass}::value_type" "type = int"
+ gdb_test "whatis ${klass}::value_type" "type = int"
+ gdb_test "p (${klass}::value_type) 0" " = 0"
+}
+
gdb_test "up" ".*main.*" "up from marker1"
# Print class types and values.

View File

@ -0,0 +1,58 @@
http://sourceware.org/ml/gdb-cvs/2013-06/msg00044.html
### src/gdb/testsuite/ChangeLog 2013/06/06 19:00:13 1.3688
### src/gdb/testsuite/ChangeLog 2013/06/06 19:02:26 1.3689
## -1,3 +1,7 @@
+2013-06-06 Doug Evans <dje@google.com>
+
+ * gdb.cp/derivation.exp: Make tests have unique names.
+
2013-06-06 Tom Tromey <tromey@redhat.com>
* gdb.base/dump.exp (capture_value): Don't put expression into
--- src/gdb/testsuite/gdb.cp/derivation.exp 2013/06/05 22:28:51 1.25
+++ src/gdb/testsuite/gdb.cp/derivation.exp 2013/06/06 19:02:27 1.26
@@ -40,15 +40,17 @@
}
# Check inheritance of typedefs.
-foreach klass {"A" "D" "E" "F" "A2" "D2"} {
- gdb_test "ptype ${klass}::value_type" "type = int"
- gdb_test "whatis ${klass}::value_type" "type = int"
- gdb_test "p (${klass}::value_type) 0" " = 0"
-}
-foreach klass {"Z" "ZZ"} {
- gdb_test "ptype ${klass}::value_type" "type = float"
- gdb_test "whatis ${klass}::value_type" "type = float"
- gdb_test "p (${klass}::value_type) 0" " = 0"
+with_test_prefix "before run" {
+ foreach klass {"A" "D" "E" "F" "A2" "D2"} {
+ gdb_test "ptype ${klass}::value_type" "type = int"
+ gdb_test "whatis ${klass}::value_type" "type = int"
+ gdb_test "p (${klass}::value_type) 0" " = 0"
+ }
+ foreach klass {"Z" "ZZ"} {
+ gdb_test "ptype ${klass}::value_type" "type = float"
+ gdb_test "whatis ${klass}::value_type" "type = float"
+ gdb_test "p (${klass}::value_type) 0" " = 0"
+ }
}
# Set it up at a breakpoint so we can play with the variable values.
@@ -59,10 +61,12 @@
}
# Check inheritance of typedefs again, but this time with an active block.
-foreach klass {"A" "D" "A2" "D2"} {
- gdb_test "ptype ${klass}::value_type" "type = int"
- gdb_test "whatis ${klass}::value_type" "type = int"
- gdb_test "p (${klass}::value_type) 0" " = 0"
+with_test_prefix "at marker1" {
+ foreach klass {"A" "D" "A2" "D2"} {
+ gdb_test "ptype ${klass}::value_type" "type = int"
+ gdb_test "whatis ${klass}::value_type" "type = int"
+ gdb_test "p (${klass}::value_type) 0" " = 0"
+ }
}
gdb_test "up" ".*main.*" "up from marker1"

View File

@ -1,55 +1,22 @@
http://sourceware.org/ml/gdb-patches/2013-05/msg00625.html http://sourceware.org/ml/gdb-cvs/2013-06/msg00012.html
Subject: [RFA 1/7] Probes API convenience patch
### src/gdb/ChangeLog 2013/06/04 02:44:34 1.15680
--uuKVzAmB+c+zQlhu ### src/gdb/ChangeLog 2013/06/04 12:50:20 1.15681
Content-Type: text/plain; charset=us-ascii ## -1,3 +1,11 @@
Content-Disposition: inline +2013-06-04 Gary Benson <gbenson@redhat.com>
This patch exposes part of the probes API in a more convenient
way. I've included it for completeness, but it has previously
been approved:
http://www.cygwin.com/ml/gdb-patches/2012-07/msg00340.html
--uuKVzAmB+c+zQlhu
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="rtld-probes-1-convenience.patch"
2013-05-16 Gary Benson <gbenson@redhat.com>
* probe.h (get_probe_argument_count): New declaration.
(evaluate_probe_argument): Likewise.
* probe.c (get_probe_argument_count): New function.
(evaluate_probe_argument): Likewise.
(probe_safe_evaluate_at_pc): Use the above new functions.
diff --git a/gdb/probe.h b/gdb/probe.h
index 8d44ca2..1d29b87 100644
--- a/gdb/probe.h
+++ b/gdb/probe.h
@@ -214,6 +214,16 @@ extern void info_probes_for_ops (char *arg, int from_tty,
extern struct cmd_list_element **info_probes_cmdlist_get (void);
+/* Return the argument count of the specified probe. */
+ +
+extern unsigned get_probe_argument_count (struct probe *probe); + * probe.h (get_probe_argument_count): New declaration.
+ (evaluate_probe_argument): Likewise.
+ * probe.c (get_probe_argument_count): New function.
+ (evaluate_probe_argument): Likewise.
+ (probe_safe_evaluate_at_pc): Use the above new functions.
+ +
+/* Evaluate argument N of the specified probe. N must be between 0 2013-06-04 Alan Modra <amodra@gmail.com>
+ inclusive and get_probe_argument_count exclusive. */
+ * ppc-tdep.h (ppc_insns_match_pattern): Update prototype.
+extern struct value *evaluate_probe_argument (struct probe *probe, --- src/gdb/probe.c 2013/05/30 17:39:34 1.8
+ unsigned n); +++ src/gdb/probe.c 2013/06/04 12:50:20 1.9
+ @@ -611,28 +611,55 @@
/* A convenience function that finds a probe at the PC in FRAME and
evaluates argument N, with 0 <= N < number_of_args. If there is no
probe at that location, or if the probe does not have enough arguments,
diff --git a/gdb/probe.c b/gdb/probe.c
index 77f3b13..a61f4ea 100644
--- a/gdb/probe.c
+++ b/gdb/probe.c
@@ -608,28 +608,55 @@ info_probes_command (char *arg, int from_tty)
/* See comments in probe.h. */ /* See comments in probe.h. */
@ -114,6 +81,22 @@ index 77f3b13..a61f4ea 100644
} }
/* See comment in probe.h. */ /* See comment in probe.h. */
--- src/gdb/probe.h 2013/01/01 06:32:49 1.4
+++ src/gdb/probe.h 2013/06/04 12:50:21 1.5
@@ -214,6 +214,16 @@
--uuKVzAmB+c+zQlhu-- extern struct cmd_list_element **info_probes_cmdlist_get (void);
+/* Return the argument count of the specified probe. */
+
+extern unsigned get_probe_argument_count (struct probe *probe);
+
+/* Evaluate argument N of the specified probe. N must be between 0
+ inclusive and get_probe_argument_count exclusive. */
+
+extern struct value *evaluate_probe_argument (struct probe *probe,
+ unsigned n);
+
/* A convenience function that finds a probe at the PC in FRAME and
evaluates argument N, with 0 <= N < number_of_args. If there is no
probe at that location, or if the probe does not have enough arguments,

View File

@ -1,74 +1,35 @@
http://sourceware.org/ml/gdb-patches/2013-05/msg00627.html http://sourceware.org/ml/gdb-cvs/2013-06/msg00013.html
Subject: [RFA 2/7] API for inhibiting section map updates
### src/gdb/ChangeLog 2013/06/04 12:50:20 1.15681
### src/gdb/ChangeLog 2013/06/04 12:53:33 1.15682
## -1,5 +1,24 @@
2013-06-04 Gary Benson <gbenson@redhat.com>
--bPg9NdpM9EETxvqt + * objfiles.h (inhibit_section_map_updates): New function
Content-Type: text/plain; charset=us-ascii + declaration.
Content-Disposition: inline + (resume_section_map_updates): Likewise.
+ (resume_section_map_updates_cleanup): Likewise.
This patch adds a couple of functions to allow section map updates + * objfiles.c (objfile_pspace_info): Removed field
to be temporarily inhibited. Without this ability, the calls to + "objfiles_changed_p". New fields "new_objfiles_available",
evaluate_probe_argument in svr4_handle_solib_event trigger a section + "section_map_dirty" and "inhibit_updates".
map update every time a group of shared objects are mapped, which + (allocate_objfile): Set new_objfiles_available.
significantly affects performance. The updates are unnecessary in + (free_objfile): Set section_map_dirty.
this case as the sections in question are in the runtime linker and + (objfile_relocate1): Likewise.
so already in the section map. + (in_plt_section): Likewise.
+ (find_pc_section): Update the conditions under which the
--bPg9NdpM9EETxvqt + section map will be updated.
Content-Type: text/plain; charset=us-ascii + (inhibit_section_map_updates): New function.
Content-Disposition: attachment; filename="rtld-probes-2-inhibit-sm-updates.patch" + (resume_section_map_updates): Likewise.
+ (resume_section_map_updates_cleanup): Likewise.
2013-05-16 Gary Benson <gbenson@redhat.com>
* objfiles.h (inhibit_section_map_updates): New function
declaration.
(resume_section_map_updates): Likewise.
(resume_section_map_updates_cleanup): Likewise.
* objfiles.c (objfile_pspace_info): Removed field
"objfiles_changed_p". New fields "new_objfiles_available",
"section_map_dirty" and "inhibit_updates".
(allocate_objfile): Set new_objfiles_available.
(free_objfile): Set section_map_dirty.
(objfile_relocate1): Likewise.
(in_plt_section): Likewise.
(find_pc_section): Update the conditions under which the
section map will be updated.
(inhibit_section_map_updates): New function.
(resume_section_map_updates): Likewise.
(resume_section_map_updates_cleanup): Likewise.
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index 93149e2..0b7eea9 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -501,6 +501,22 @@ extern int in_plt_section (CORE_ADDR, char *);
modules. */
DECLARE_REGISTRY(objfile);
+/* In normal use, the section map will be rebuilt by FIND_PC_SECTION
+ if objfiles have been added, removed or relocated since it was last
+ called. Calling INHIBIT_SECTION_MAP_UPDATES will inhibit this
+ behavior until RESUME_SECTION_MAP_UPDATES is called. If you call
+ INHIBIT_SECTION_MAP_UPDATES you must ensure that every call to
+ FIND_PC_SECTION in the inhibited region relates to a section that
+ is already in the section map and has not since been removed or
+ relocated. */
+extern void inhibit_section_map_updates (void);
+ +
+/* Resume automatically rebuilding the section map as required. */ +2013-06-04 Gary Benson <gbenson@redhat.com>
+extern void resume_section_map_updates (void);
+ +
+/* Version of the above suitable for use as a cleanup. */ * probe.h (get_probe_argument_count): New declaration.
+extern void resume_section_map_updates_cleanup (void *arg); (evaluate_probe_argument): Likewise.
+ * probe.c (get_probe_argument_count): New function.
extern void default_iterate_over_objfiles_in_search_order --- src/gdb/objfiles.c 2013/05/06 19:15:17 1.160
(struct gdbarch *gdbarch, +++ src/gdb/objfiles.c 2013/06/04 12:53:34 1.161
iterate_over_objfiles_in_search_order_cb_ftype *cb, @@ -67,9 +67,18 @@
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 3e49ea2..3af1064 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -67,9 +67,18 @@ struct objfile *rt_common_objfile; /* For runtime common symbols */
struct objfile_pspace_info struct objfile_pspace_info
{ {
@ -88,7 +49,7 @@ index 3e49ea2..3af1064 100644
}; };
/* Per-program-space data key. */ /* Per-program-space data key. */
@@ -317,7 +326,7 @@ allocate_objfile (bfd *abfd, int flags) @@ -317,7 +326,7 @@
objfile->flags |= flags; objfile->flags |= flags;
/* Rebuild section map next time we need it. */ /* Rebuild section map next time we need it. */
@ -97,7 +58,7 @@ index 3e49ea2..3af1064 100644
return objfile; return objfile;
} }
@@ -646,7 +655,7 @@ free_objfile (struct objfile *objfile) @@ -646,7 +655,7 @@
obstack_free (&objfile->objfile_obstack, 0); obstack_free (&objfile->objfile_obstack, 0);
/* Rebuild section map next time we need it. */ /* Rebuild section map next time we need it. */
@ -106,7 +67,7 @@ index 3e49ea2..3af1064 100644
xfree (objfile); xfree (objfile);
} }
@@ -826,7 +835,7 @@ objfile_relocate1 (struct objfile *objfile, @@ -826,7 +835,7 @@
} }
/* Rebuild section map next time we need it. */ /* Rebuild section map next time we need it. */
@ -115,7 +76,7 @@ index 3e49ea2..3af1064 100644
/* Update the table in exec_ops, used to read memory. */ /* Update the table in exec_ops, used to read memory. */
ALL_OBJFILE_OSECTIONS (objfile, s) ALL_OBJFILE_OSECTIONS (objfile, s)
@@ -1291,11 +1300,14 @@ static void @@ -1291,11 +1300,14 @@
update_section_map (struct program_space *pspace, update_section_map (struct program_space *pspace,
struct obj_section ***pmap, int *pmap_size) struct obj_section ***pmap, int *pmap_size)
{ {
@ -125,13 +86,13 @@ index 3e49ea2..3af1064 100644
struct objfile *objfile; struct objfile *objfile;
- gdb_assert (get_objfile_pspace_data (pspace)->objfiles_changed_p != 0); - gdb_assert (get_objfile_pspace_data (pspace)->objfiles_changed_p != 0);
+ pspace_info = get_objfile_pspace_data (current_program_space); + pspace_info = get_objfile_pspace_data (pspace);
+ gdb_assert (pspace_info->section_map_dirty != 0 + gdb_assert (pspace_info->section_map_dirty != 0
+ || pspace_info->new_objfiles_available != 0); + || pspace_info->new_objfiles_available != 0);
map = *pmap; map = *pmap;
xfree (map); xfree (map);
@@ -1365,7 +1377,9 @@ find_pc_section (CORE_ADDR pc) @@ -1365,7 +1377,9 @@
return s; return s;
pspace_info = get_objfile_pspace_data (current_program_space); pspace_info = get_objfile_pspace_data (current_program_space);
@ -142,7 +103,7 @@ index 3e49ea2..3af1064 100644
{ {
update_section_map (current_program_space, update_section_map (current_program_space,
&pspace_info->sections, &pspace_info->sections,
@@ -1373,7 +1387,8 @@ find_pc_section (CORE_ADDR pc) @@ -1373,7 +1387,8 @@
/* Don't need updates to section map until objfiles are added, /* Don't need updates to section map until objfiles are added,
removed or relocated. */ removed or relocated. */
@ -152,7 +113,7 @@ index 3e49ea2..3af1064 100644
} }
/* The C standard (ISO/IEC 9899:TC2) requires the BASE argument to /* The C standard (ISO/IEC 9899:TC2) requires the BASE argument to
@@ -1414,14 +1429,38 @@ in_plt_section (CORE_ADDR pc, char *name) @@ -1414,14 +1429,38 @@
} }
@ -171,17 +132,17 @@ index 3e49ea2..3af1064 100644
+/* See comments in objfiles.h. */ +/* See comments in objfiles.h. */
+ +
+void +void
+inhibit_section_map_updates (void) +inhibit_section_map_updates (struct program_space *pspace)
+{ +{
+ get_objfile_pspace_data (current_program_space)->inhibit_updates = 1; + get_objfile_pspace_data (pspace)->inhibit_updates = 1;
+} +}
+ +
+/* See comments in objfiles.h. */ +/* See comments in objfiles.h. */
+ +
+void +void
+resume_section_map_updates (void) +resume_section_map_updates (struct program_space *pspace)
+{ +{
+ get_objfile_pspace_data (current_program_space)->inhibit_updates = 0; + get_objfile_pspace_data (pspace)->inhibit_updates = 0;
+} +}
+ +
+/* See comments in objfiles.h. */ +/* See comments in objfiles.h. */
@ -189,10 +150,32 @@ index 3e49ea2..3af1064 100644
+void +void
+resume_section_map_updates_cleanup (void *arg) +resume_section_map_updates_cleanup (void *arg)
+{ +{
+ resume_section_map_updates (); + resume_section_map_updates (arg);
} }
/* The default implementation for the "iterate_over_objfiles_in_search_order" /* The default implementation for the "iterate_over_objfiles_in_search_order"
--- src/gdb/objfiles.h 2013/05/06 19:15:17 1.106
+++ src/gdb/objfiles.h 2013/06/04 12:53:34 1.107
@@ -501,6 +501,22 @@
modules. */
DECLARE_REGISTRY(objfile);
--bPg9NdpM9EETxvqt-- +/* In normal use, the section map will be rebuilt by find_pc_section
+ if objfiles have been added, removed or relocated since it was last
+ called. Calling inhibit_section_map_updates will inhibit this
+ behavior until resume_section_map_updates is called. If you call
+ inhibit_section_map_updates you must ensure that every call to
+ find_pc_section in the inhibited region relates to a section that
+ is already in the section map and has not since been removed or
+ relocated. */
+extern void inhibit_section_map_updates (struct program_space *pspace);
+
+/* Resume automatically rebuilding the section map as required. */
+extern void resume_section_map_updates (struct program_space *pspace);
+
+/* Version of the above suitable for use as a cleanup. */
+extern void resume_section_map_updates_cleanup (void *arg);
+
extern void default_iterate_over_objfiles_in_search_order
(struct gdbarch *gdbarch,
iterate_over_objfiles_in_search_order_cb_ftype *cb,

View File

@ -1,59 +1,23 @@
http://sourceware.org/ml/gdb-patches/2013-05/msg00626.html http://sourceware.org/ml/gdb-cvs/2013-06/msg00014.html
Subject: [RFA 3/7] New gdbserver functionality
### src/gdb/gdbserver/ChangeLog 2013/05/31 19:14:33 1.720
### src/gdb/gdbserver/ChangeLog 2013/06/04 12:59:20 1.721
## -1,3 +1,12 @@
+2013-06-04 Gary Benson <gbenson@redhat.com>
+
+ * server.c (handle_query): Add "augmented-libraries-svr4-read+"
+ to qSupported response when appropriate.
+ (handle_qxfer_libraries_svr4): Allow qXfer:libraries-svr4:read
+ with nonzero-length annex.
+ * linux-low.c (linux_qxfer_libraries_svr4): Parse and handle
+ arguments supplied in annex.
+
2013-05-31 Doug Evans <dje@google.com>
--Kc9HNjpzOXVc7FFU * linux-x86-low.c (ps_get_thread_area): Properly extend address to
Content-Type: text/plain; charset=us-ascii --- src/gdb/gdbserver/linux-low.c 2013/05/23 17:17:50 1.237
Content-Disposition: inline +++ src/gdb/gdbserver/linux-low.c 2013/06/04 12:59:21 1.238
@@ -5728,6 +5728,12 @@
This patch updates gdbserver to allow arguments to be passed in the
annex of qXfer:libraries-svr4:read to allow that function to transfer
partial lists of libraries. The ability of gdbserver to support
these arguments is indicated by a qSupported response containing
"augmented-libraries-svr4-read+".
--Kc9HNjpzOXVc7FFU
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="rtld-probes-3-gdbserver.patch"
2013-05-16 Gary Benson <gbenson@redhat.com>
* server.c (handle_query): Add "augmented-libraries-svr4-read+"
to qSupported response when appropriate.
(handle_qxfer_libraries_svr4): Allow qXfer:libraries-svr4:read
with nonzero-length annex.
* linux-low.c (linux_qxfer_libraries_svr4): Parse and handle
arguments supplied in annex.
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 6bb36d8..0a8f68b 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -1115,8 +1115,7 @@ handle_qxfer_libraries_svr4 (const char *annex,
if (writebuf != NULL)
return -2;
- if (annex[0] != '\0' || !target_running ()
- || the_target->qxfer_libraries_svr4 == NULL)
+ if (!target_running () || the_target->qxfer_libraries_svr4 == NULL)
return -1;
return the_target->qxfer_libraries_svr4 (annex, readbuf, writebuf, offset, len);
@@ -1743,7 +1742,8 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
PBUFSIZ - 1);
if (the_target->qxfer_libraries_svr4 != NULL)
- strcat (own_buf, ";qXfer:libraries-svr4:read+");
+ strcat (own_buf, ";qXfer:libraries-svr4:read+"
+ ";augmented-libraries-svr4-read+");
else
{
/* We do not have any hook to indicate whether the non-SVR4 target
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 72c51e0..beb3b8f 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -5677,6 +5677,12 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf,
}; };
const struct link_map_offsets *lmo; const struct link_map_offsets *lmo;
unsigned int machine; unsigned int machine;
@ -66,7 +30,7 @@ index 72c51e0..beb3b8f 100644
if (writebuf != NULL) if (writebuf != NULL)
return -2; return -2;
@@ -5687,128 +5693,146 @@ linux_qxfer_libraries_svr4 (const char *annex, unsigned char *readbuf, @@ -5738,128 +5744,144 @@
xsnprintf (filename, sizeof filename, "/proc/%d/exe", pid); xsnprintf (filename, sizeof filename, "/proc/%d/exe", pid);
is_elf64 = elf_64_file_p (filename, &machine); is_elf64 = elf_64_file_p (filename, &machine);
lmo = is_elf64 ? &lmo_64bit_offsets : &lmo_32bit_offsets; lmo = is_elf64 ? &lmo_64bit_offsets : &lmo_32bit_offsets;
@ -74,45 +38,44 @@ index 72c51e0..beb3b8f 100644
- if (priv->r_debug == 0) - if (priv->r_debug == 0)
- priv->r_debug = get_r_debug (pid, is_elf64); - priv->r_debug = get_r_debug (pid, is_elf64);
+ if (annex[0] == '\0') -
+ {
+ int r_version = 0;
- /* We failed to find DT_DEBUG. Such situation will not change for this - /* We failed to find DT_DEBUG. Such situation will not change for this
- inferior - do not retry it. Report it to GDB as E01, see for the reasons - inferior - do not retry it. Report it to GDB as E01, see for the reasons
- at the GDB solib-svr4.c side. */ - at the GDB solib-svr4.c side. */
- if (priv->r_debug == (CORE_ADDR) -1) - if (priv->r_debug == (CORE_ADDR) -1)
- return -1; - return -1;
+ if (priv->r_debug == 0) -
+ priv->r_debug = get_r_debug (pid, is_elf64);
- if (priv->r_debug == 0) - if (priv->r_debug == 0)
- { + while (annex[0] != '\0')
{
- document = xstrdup ("<library-list-svr4 version=\"1.0\"/>\n"); - document = xstrdup ("<library-list-svr4 version=\"1.0\"/>\n");
+ /* We failed to find DT_DEBUG. Such situation will not change + const char *sep;
+ for this inferior - do not retry it. Report it to GDB as + CORE_ADDR *addrp;
+ E01, see for the reasons at the GDB solib-svr4.c side. */ + int len;
+ if (priv->r_debug == (CORE_ADDR) -1)
+ return -1;
+ +
+ if (priv->r_debug != 0) + sep = strchr (annex, '=');
+ if (sep == NULL)
+ break;
+
+ len = sep - annex;
+ if (len == 5 && strncmp (annex, "start", 5) == 0)
+ addrp = &lm_addr;
+ else if (len == 4 && strncmp (annex, "prev", 4) == 0)
+ addrp = &lm_prev;
+ else
+ { + {
+ if (linux_read_memory (priv->r_debug + lmo->r_version_offset, + annex = strchr (sep, ';');
+ (unsigned char *) &r_version, + if (annex == NULL)
+ sizeof (r_version)) != 0 + break;
+ || r_version != 1) + annex++;
+ { + continue;
+ warning ("unexpected r_debug version %d", r_version);
+ }
+ else if (read_one_ptr (priv->r_debug + lmo->r_map_offset,
+ &lm_addr, ptr_size) != 0)
+ {
+ warning ("unable to read r_map from 0x%lx",
+ (long) priv->r_debug + lmo->r_map_offset);
+ }
+ } + }
+
+ annex = decode_address_to_semicolon (addrp, sep + 1);
} }
else - else
+
+ if (lm_addr == 0)
{ {
- int allocated = 1024; - int allocated = 1024;
- char *p; - char *p;
@ -129,38 +92,37 @@ index 72c51e0..beb3b8f 100644
- (unsigned char *) &r_version, - (unsigned char *) &r_version,
- sizeof (r_version)) != 0 - sizeof (r_version)) != 0
- || r_version != 1) - || r_version != 1)
+ while (annex[0] != '\0') + int r_version = 0;
+
+ if (priv->r_debug == 0)
+ priv->r_debug = get_r_debug (pid, is_elf64);
+
+ /* We failed to find DT_DEBUG. Such situation will not change
+ for this inferior - do not retry it. Report it to GDB as
+ E01, see for the reasons at the GDB solib-svr4.c side. */
+ if (priv->r_debug == (CORE_ADDR) -1)
+ return -1;
+
+ if (priv->r_debug != 0)
{ {
- warning ("unexpected r_debug version %d", r_version); - warning ("unexpected r_debug version %d", r_version);
- goto done; - goto done;
+ const char *sep; + if (linux_read_memory (priv->r_debug + lmo->r_version_offset,
+ CORE_ADDR *addrp; + (unsigned char *) &r_version,
+ int len; + sizeof (r_version)) != 0
+ + || r_version != 1)
+ sep = strchr (annex, '=');
+ if (!sep)
+ break;
+
+ len = sep - annex;
+ if (len == 5 && !strncmp (annex, "start", 5))
+ addrp = &lm_addr;
+ else if (len == 4 && !strncmp (annex, "prev", 4))
+ addrp = &lm_prev;
+ else
+ { + {
+ annex = strchr (sep, ';'); + warning ("unexpected r_debug version %d", r_version);
+ if (!annex) + }
+ break; + else if (read_one_ptr (priv->r_debug + lmo->r_map_offset,
+ annex++; + &lm_addr, ptr_size) != 0)
+ continue; + {
+ warning ("unable to read r_map from 0x%lx",
+ (long) priv->r_debug + lmo->r_map_offset);
+ } + }
+
+ annex = decode_address_to_semicolon (addrp, sep + 1);
} }
+ } + }
+
- if (read_one_ptr (priv->r_debug + lmo->r_map_offset,
- &lm_addr, ptr_size) != 0)
+ document = xmalloc (allocated); + document = xmalloc (allocated);
+ strcpy (document, "<library-list-svr4 version=\"1.0\""); + strcpy (document, "<library-list-svr4 version=\"1.0\"");
+ p = document + strlen (document); + p = document + strlen (document);
@ -178,7 +140,9 @@ index 72c51e0..beb3b8f 100644
+ &l_next, ptr_size) == 0) + &l_next, ptr_size) == 0)
+ { + {
+ unsigned char libname[PATH_MAX]; + unsigned char libname[PATH_MAX];
+
- if (read_one_ptr (priv->r_debug + lmo->r_map_offset,
- &lm_addr, ptr_size) != 0)
+ if (lm_prev != l_prev) + if (lm_prev != l_prev)
{ {
- warning ("unable to read r_map from 0x%lx", - warning ("unable to read r_map from 0x%lx",
@ -251,9 +215,7 @@ index 72c51e0..beb3b8f 100644
- allocated *= 2; - allocated *= 2;
- p = document + document_len; - p = document + document_len;
- } - }
+ /* Expand to guarantee sufficient storage. */ -
+ uintptr_t document_len = p - document;
- name = xml_escape_text ((char *) libname); - name = xml_escape_text ((char *) libname);
- p += sprintf (p, "<library name=\"%s\" lm=\"0x%lx\" " - p += sprintf (p, "<library name=\"%s\" lm=\"0x%lx\" "
- "l_addr=\"0x%lx\" l_ld=\"0x%lx\"/>", - "l_addr=\"0x%lx\" l_ld=\"0x%lx\"/>",
@ -265,14 +227,17 @@ index 72c51e0..beb3b8f 100644
- { - {
- sprintf (p, " main-lm=\"0x%lx\"", (unsigned long) lm_addr); - sprintf (p, " main-lm=\"0x%lx\"", (unsigned long) lm_addr);
- p = p + strlen (p); - p = p + strlen (p);
+ document = xrealloc (document, 2 * allocated); - }
+ allocated *= 2; + /* Expand to guarantee sufficient storage. */
+ p = document + document_len; + uintptr_t document_len = p - document;
}
- if (l_next == 0) - if (l_next == 0)
- break; - break;
- + document = xrealloc (document, 2 * allocated);
+ allocated *= 2;
+ p = document + document_len;
+ }
- lm_prev = lm_addr; - lm_prev = lm_addr;
- lm_addr = l_next; - lm_addr = l_next;
+ name = xml_escape_text ((char *) libname); + name = xml_escape_text ((char *) libname);
@ -309,6 +274,25 @@ index 72c51e0..beb3b8f 100644
document_len = strlen (document); document_len = strlen (document);
if (offset < document_len) if (offset < document_len)
document_len -= offset; document_len -= offset;
--- src/gdb/gdbserver/server.c 2013/05/24 11:28:06 1.191
+++ src/gdb/gdbserver/server.c 2013/06/04 12:59:21 1.192
@@ -1115,8 +1115,7 @@
if (writebuf != NULL)
return -2;
--Kc9HNjpzOXVc7FFU-- - if (annex[0] != '\0' || !target_running ()
- || the_target->qxfer_libraries_svr4 == NULL)
+ if (!target_running () || the_target->qxfer_libraries_svr4 == NULL)
return -1;
return the_target->qxfer_libraries_svr4 (annex, readbuf, writebuf, offset, len);
@@ -1743,7 +1742,8 @@
PBUFSIZ - 1);
if (the_target->qxfer_libraries_svr4 != NULL)
- strcat (own_buf, ";qXfer:libraries-svr4:read+");
+ strcat (own_buf, ";qXfer:libraries-svr4:read+"
+ ";augmented-libraries-svr4-read+");
else
{
/* We do not have any hook to indicate whether the non-SVR4 target

View File

@ -0,0 +1,35 @@
http://sourceware.org/ml/gdb-cvs/2013-06/msg00015.html
### src/gdb/ChangeLog 2013/06/04 12:53:33 1.15682
### src/gdb/ChangeLog 2013/06/04 13:02:15 1.15683
## -1,5 +1,9 @@
2013-06-04 Gary Benson <gbenson@redhat.com>
+ * NEWS: Update.
+
+2013-06-04 Gary Benson <gbenson@redhat.com>
+
* objfiles.h (inhibit_section_map_updates): New function
declaration.
(resume_section_map_updates): Likewise.
Index: gdb-7.6/gdb/NEWS
===================================================================
--- gdb-7.6.orig/gdb/NEWS 2013-06-10 14:27:02.071184153 +0200
+++ gdb-7.6/gdb/NEWS 2013-06-10 14:28:34.391145339 +0200
@@ -4,6 +4,16 @@
* Newly installed $prefix/bin/gcore acts as a shell interface for the
GDB command gcore.
+* New remote packets
+
+qXfer:libraries-svr4:read's annex
+ The previously unused annex of the qXfer:libraries-svr4:read packet
+ is now used to support passing an argument list. The remote stub
+ reports support for this argument list to GDB's qSupported query.
+ The defined arguments are "start" and "prev", used to reduce work
+ necessary for library list updating, resulting in significant
+ speedup.
+
*** Changes in GDB 7.6
* Target record has been renamed to record-full.

View File

@ -0,0 +1,91 @@
http://sourceware.org/ml/gdb-cvs/2013-06/msg00016.html
### src/gdb/doc/ChangeLog 2013/05/24 04:50:26 1.1463
### src/gdb/doc/ChangeLog 2013/06/04 13:07:45 1.1464
## -1,3 +1,12 @@
+2013-06-04 Gary Benson <gbenson@redhat.com>
+
+ * gdb.texinfo (General Query Packets/qSupported): Added
+ "qXfer:libraries-svr4:read" and "augmented-libraries-svr4-read".
+ to the table of currently defined stub features.
+ Added a more detailed entry for "augmented-libraries-svr4-read".
+ (General Query Packets/qXfer:libraries-svr4:read): Documented
+ the augmented form of this packet.
+
2013-05-23 Joel Brobecker <brobecker@adacore.com>
* gdb.texinfo (System-wide Configuration Scripts): Renames
--- src/gdb/doc/gdb.texinfo 2013/05/24 04:50:26 1.1093
+++ src/gdb/doc/gdb.texinfo 2013/06/04 13:07:45 1.1094
@@ -38594,6 +38594,16 @@
@tab @samp{-}
@tab Yes
+@item @samp{qXfer:libraries-svr4:read}
+@tab No
+@tab @samp{-}
+@tab Yes
+
+@item @samp{augmented-libraries-svr4-read}
+@tab No
+@tab @samp{-}
+@tab No
+
@item @samp{qXfer:memory-map:read}
@tab No
@tab @samp{-}
@@ -38770,6 +38780,11 @@
The remote stub understands the @samp{qXfer:libraries-svr4:read} packet
(@pxref{qXfer svr4 library list read}).
+@item augmented-libraries-svr4-read
+The remote stub understands the augmented form of the
+@samp{qXfer:libraries-svr4:read} packet
+(@pxref{qXfer svr4 library list read}).
+
@item qXfer:memory-map:read
The remote stub understands the @samp{qXfer:memory-map:read} packet
(@pxref{qXfer memory map read}).
@@ -39065,7 +39080,10 @@
@anchor{qXfer svr4 library list read}
Access the target's list of loaded libraries when the target is an SVR4
platform. @xref{Library List Format for SVR4 Targets}. The annex part
-of the generic @samp{qXfer} packet must be empty (@pxref{qXfer read}).
+of the generic @samp{qXfer} packet must be empty unless the remote
+stub indicated it supports the augmented form of this packet
+by supplying an appropriate @samp{qSupported} response
+(@pxref{qXfer read}, @ref{qSupported}).
This packet is optional for better performance on SVR4 targets.
@value{GDBN} uses memory read packets to read the SVR4 library list otherwise.
@@ -39073,6 +39091,30 @@
This packet is not probed by default; the remote stub must request it,
by supplying an appropriate @samp{qSupported} response (@pxref{qSupported}).
+If the remote stub indicates it supports the augmented form of this
+packet then the annex part of the generic @samp{qXfer} packet may
+contain a semicolon-separated list of @samp{@var{name}=@var{value}}
+arguments. The currently supported arguments are:
+
+@table @code
+@item start=@var{address}
+A hexadecimal number specifying the address of the @samp{struct
+link_map} to start reading the library list from. If unset or zero
+then the first @samp{struct link_map} in the library list will be
+chosen as the starting point.
+
+@item prev=@var{address}
+A hexadecimal number specifying the address of the @samp{struct
+link_map} immediately preceding the @samp{struct link_map}
+specified by the @samp{start} argument. If unset or zero then
+the remote stub will expect that no @samp{struct link_map}
+exists prior to the starting point.
+
+@end table
+
+Arguments that are not understood by the remote stub will be silently
+ignored.
+
@item qXfer:memory-map:read::@var{offset},@var{length}
@anchor{qXfer memory map read}
Access the target's @dfn{memory-map}. @xref{Memory Map Format}. The

View File

@ -1,86 +1,32 @@
http://sourceware.org/ml/gdb-patches/2013-05/msg00628.html http://sourceware.org/ml/gdb-cvs/2013-06/msg00017.html
Subject: [RFA 4/7] GDB support for new gdbserver functionality
### src/gdb/ChangeLog 2013/06/04 13:02:15 1.15683
### src/gdb/ChangeLog 2013/06/04 13:10:53 1.15684
## -1,5 +1,21 @@
2013-06-04 Gary Benson <gbenson@redhat.com>
--CaPKgh3XHpq3rEUV + * target.h (target_ops): New field
Content-Type: text/plain; charset=us-ascii + "to_augmented_libraries_svr4_read".
Content-Disposition: inline + (target_augmented_libraries_svr4_read): New macro.
+ * target.c (update_current_target): Handle
This patch adds client support for the new gdbserver functionality + to_augmented_libraries_svr4_read.
provided by patch 3 of this series. + * remote.c (remote_state): New field
+ "augmented_libraries_svr4_read".
--CaPKgh3XHpq3rEUV + (remote_augmented_libraries_svr4_read_feature): New function.
Content-Type: text/plain; charset=us-ascii + (remote_protocol_features): Add entry for
Content-Disposition: attachment; filename="rtld-probes-4-remote.patch" + "augmented-libraries-svr4-read".
+ (remote_augmented_libraries_svr4_read): New function.
2013-05-16 Gary Benson <gbenson@redhat.com> + (init_remote_ops): Initialize
+ remote_ops.to_augmented_libraries_svr4_read.
* target.h (target_ops): New field
"to_augmented_libraries_svr4_read".
(target_augmented_libraries_svr4_read): New macro.
* target.c (update_current_target): Handle
to_augmented_libraries_svr4_read.
* remote.c (remote_state): New field
"augmented_libraries_svr4_read".
(remote_augmented_libraries_svr4_read_feature): New function.
(remote_protocol_features): Add entry for
"augmented-libraries-svr4-read".
(remote_augmented_libraries_svr4_read): New function.
(init_remote_ops): Initialize
remote_ops.to_augmented_libraries_svr4_read.
diff --git a/gdb/target.h b/gdb/target.h
index e937d39..a8587e8 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -941,6 +941,10 @@ struct target_ops
(inclusive) to function END (exclusive). */
void (*to_call_history_range) (ULONGEST begin, ULONGEST end, int flags);
+ /* Nonzero if TARGET_OBJECT_LIBRARIES_SVR4 may be read with a
+ non-empty annex. */
+ int (*to_augmented_libraries_svr4_read) (void);
+ +
int to_magic; +2013-06-04 Gary Benson <gbenson@redhat.com>
/* Need sub-structure for target machine related rather than comm related?
*/
@@ -1809,6 +1813,9 @@ extern char *target_fileio_read_stralloc (const char *filename);
#define target_can_use_agent() \
(*current_target.to_can_use_agent) ()
+#define target_augmented_libraries_svr4_read() \
+ (*current_target.to_augmented_libraries_svr4_read) ()
+ +
/* Command logging facility. */ * NEWS: Update.
#define target_log_command(p) \ 2013-06-04 Gary Benson <gbenson@redhat.com>
diff --git a/gdb/target.c b/gdb/target.c --- src/gdb/remote.c 2013/05/30 09:29:18 1.552
index 8653dac..519b97f 100644 +++ src/gdb/remote.c 2013/06/04 13:10:53 1.553
--- a/gdb/target.c @@ -361,6 +361,10 @@
+++ b/gdb/target.c
@@ -731,6 +731,7 @@ update_current_target (void)
INHERIT (to_traceframe_info, t);
INHERIT (to_use_agent, t);
INHERIT (to_can_use_agent, t);
+ INHERIT (to_augmented_libraries_svr4_read, t);
INHERIT (to_magic, t);
INHERIT (to_supports_evaluation_of_breakpoint_conditions, t);
INHERIT (to_can_run_breakpoint_commands, t);
@@ -975,6 +976,9 @@ update_current_target (void)
de_fault (to_can_use_agent,
(int (*) (void))
return_zero);
+ de_fault (to_augmented_libraries_svr4_read,
+ (int (*) (void))
+ return_zero);
de_fault (to_execution_direction, default_execution_direction);
#undef de_fault
diff --git a/gdb/remote.c b/gdb/remote.c
index 51bf025..e1cf8a4 100644
--- a/gdb/remote.c
+++ b/gdb/remote.c
@@ -343,6 +343,10 @@ struct remote_state
/* True if the stub can collect strings using tracenz bytecode. */ /* True if the stub can collect strings using tracenz bytecode. */
int string_tracing; int string_tracing;
@ -91,7 +37,7 @@ index 51bf025..e1cf8a4 100644
/* Nonzero if the user has pressed Ctrl-C, but the target hasn't /* Nonzero if the user has pressed Ctrl-C, but the target hasn't
responded to that. */ responded to that. */
int ctrlc_pending_p; int ctrlc_pending_p;
@@ -3931,6 +3935,16 @@ remote_string_tracing_feature (const struct protocol_feature *feature, @@ -3949,6 +3953,16 @@
rs->string_tracing = (support == PACKET_ENABLE); rs->string_tracing = (support == PACKET_ENABLE);
} }
@ -108,7 +54,7 @@ index 51bf025..e1cf8a4 100644
static struct protocol_feature remote_protocol_features[] = { static struct protocol_feature remote_protocol_features[] = {
{ "PacketSize", PACKET_DISABLE, remote_packet_size, -1 }, { "PacketSize", PACKET_DISABLE, remote_packet_size, -1 },
{ "qXfer:auxv:read", PACKET_DISABLE, remote_supported_packet, { "qXfer:auxv:read", PACKET_DISABLE, remote_supported_packet,
@@ -3941,6 +3955,8 @@ static struct protocol_feature remote_protocol_features[] = { @@ -3959,6 +3973,8 @@
PACKET_qXfer_libraries }, PACKET_qXfer_libraries },
{ "qXfer:libraries-svr4:read", PACKET_DISABLE, remote_supported_packet, { "qXfer:libraries-svr4:read", PACKET_DISABLE, remote_supported_packet,
PACKET_qXfer_libraries_svr4 }, PACKET_qXfer_libraries_svr4 },
@ -117,7 +63,7 @@ index 51bf025..e1cf8a4 100644
{ "qXfer:memory-map:read", PACKET_DISABLE, remote_supported_packet, { "qXfer:memory-map:read", PACKET_DISABLE, remote_supported_packet,
PACKET_qXfer_memory_map }, PACKET_qXfer_memory_map },
{ "qXfer:spu:read", PACKET_DISABLE, remote_supported_packet, { "qXfer:spu:read", PACKET_DISABLE, remote_supported_packet,
@@ -11343,6 +11359,14 @@ remote_read_btrace (struct btrace_target_info *tinfo, @@ -11439,6 +11455,14 @@
return btrace; return btrace;
} }
@ -132,7 +78,7 @@ index 51bf025..e1cf8a4 100644
static void static void
init_remote_ops (void) init_remote_ops (void)
{ {
@@ -11465,6 +11489,8 @@ Specify the serial device it is connected to\n\ @@ -11561,6 +11585,8 @@
remote_ops.to_disable_btrace = remote_disable_btrace; remote_ops.to_disable_btrace = remote_disable_btrace;
remote_ops.to_teardown_btrace = remote_teardown_btrace; remote_ops.to_teardown_btrace = remote_teardown_btrace;
remote_ops.to_read_btrace = remote_read_btrace; remote_ops.to_read_btrace = remote_read_btrace;
@ -141,6 +87,46 @@ index 51bf025..e1cf8a4 100644
} }
/* Set up the extended remote vector by making a copy of the standard /* Set up the extended remote vector by making a copy of the standard
--- src/gdb/target.c 2013/05/14 20:33:36 1.335
+++ src/gdb/target.c 2013/06/04 13:10:53 1.336
@@ -731,6 +731,7 @@
INHERIT (to_traceframe_info, t);
INHERIT (to_use_agent, t);
INHERIT (to_can_use_agent, t);
+ INHERIT (to_augmented_libraries_svr4_read, t);
INHERIT (to_magic, t);
INHERIT (to_supports_evaluation_of_breakpoint_conditions, t);
INHERIT (to_can_run_breakpoint_commands, t);
@@ -975,6 +976,9 @@
de_fault (to_can_use_agent,
(int (*) (void))
return_zero);
+ de_fault (to_augmented_libraries_svr4_read,
+ (int (*) (void))
+ return_zero);
de_fault (to_execution_direction, default_execution_direction);
--CaPKgh3XHpq3rEUV-- #undef de_fault
--- src/gdb/target.h 2013/05/14 20:33:36 1.262
+++ src/gdb/target.h 2013/06/04 13:10:53 1.263
@@ -941,6 +941,10 @@
(inclusive) to function END (exclusive). */
void (*to_call_history_range) (ULONGEST begin, ULONGEST end, int flags);
+ /* Nonzero if TARGET_OBJECT_LIBRARIES_SVR4 may be read with a
+ non-empty annex. */
+ int (*to_augmented_libraries_svr4_read) (void);
+
int to_magic;
/* Need sub-structure for target machine related rather than comm related?
*/
@@ -1809,6 +1813,9 @@
#define target_can_use_agent() \
(*current_target.to_can_use_agent) ()
+#define target_augmented_libraries_svr4_read() \
+ (*current_target.to_augmented_libraries_svr4_read) ()
+
/* Command logging facility. */
#define target_log_command(p) \

View File

@ -1,92 +1,70 @@
http://sourceware.org/ml/gdb-patches/2013-05/msg00632.html http://sourceware.org/ml/gdb-cvs/2013-06/msg00018.html
Subject: [RFA 5/7] Improved linker-debugger interface
### src/gdb/ChangeLog 2013/06/04 13:10:53 1.15684
### src/gdb/ChangeLog 2013/06/04 13:17:05 1.15685
## -1,5 +1,58 @@
2013-06-04 Gary Benson <gbenson@redhat.com>
--qse+WBH4guesipZ+ + * breakpoint.h (handle_solib_event): Moved function declaration
Content-Type: text/plain; charset=us-ascii + to solib.h.
Content-Disposition: inline + * breakpoint.c (handle_solib_event): Moved function to solib.c.
+ (bpstat_stop_status): Pass new argument to handle_solib_event.
This patch implements the probes-based runtime linker interface. + * solib.h (update_solib_breakpoints): New function declaration.
It works as follows: + (handle_solib_event): Moved function declaration from
+ breakpoint.h.
- On inferior startup, GDB searches the dynamic linker for a + * solib.c (update_solib_breakpoints): New function.
number of named probes. + (handle_solib_event): Moved function from breakpoint.c.
+ Updated to call solib_ops->handle_event if not NULL.
- If all probes are found, GDB sets a breakpoint on each one. + * solist.h (target_so_ops): New fields "update_breakpoints" and
Otherwise, the standard function _dl_debug_state is used. + "handle_event".
+ * infrun.c (set_stop_on_solib_events): New function.
- When using probes, a per-pspace list is maintained of all + (_initialize_infrun): Use the above for "set
libraries currently loaded by the inferior. It's updated + stop-on-solib-events".
as necessary every time a solib event stop occurs. + (handle_inferior_event): Pass new argument to handle_solib_event.
+ * solib-svr4.c (probe.h): New include.
- When using probes, svr4_current_sos will return a copy of + (svr4_free_library_list): New forward declaration.
the cached list. When not using probes the entire list + (probe_action): New enum.
will be fetched from the inferior as before. + (probe_info): New struct.
+ (probe_info): New static variable.
- If any error occurs, GDB will print a warning and revert to + (NUM_PROBES): New definition.
the standard interface. + (svr4_info): New fields "using_xfer", "probes_table" and
+ "solib_list".
--qse+WBH4guesipZ+ + (free_probes_table): New function.
Content-Type: text/plain; charset=us-ascii + (free_solib_list): New function.
Content-Disposition: attachment; filename="rtld-probes-5-main-changes.patch" + (svr4_pspace_data_cleanup): Free probes table and solib list.
+ (svr4_copy_library_list): New function.
2013-05-16 Gary Benson <gbenson@redhat.com> + (svr4_current_sos_via_xfer_libraries): New parameter "annex".
+ (svr4_read_so_list): New parameter "prev_lm".
* breakpoint.h (handle_solib_event): Moved function declaration + (svr4_current_sos_direct): Renamed from "svr4_current_sos".
to solib.h. + (svr4_current_sos): New function.
* breakpoint.c (handle_solib_event): Moved function to solib.c. + (probe_and_action): New struct.
(bpstat_stop_status): Pass new argument to handle_solib_event. + (hash_probe_and_action): New function.
* solib.h (update_solib_breakpoints): New function declaration. + (equal_probe_and_action): Likewise.
(handle_solib_event): Moved function declaration from + (register_solib_event_probe): Likewise.
breakpoint.h. + (solib_event_probe_at): Likewise.
* solib.c (update_solib_breakpoints): New function. + (solib_event_probe_action): Likewise.
(handle_solib_event): Moved function from breakpoint.c. + (solist_update_full): Likewise.
Updated to call solib_ops->handle_event if not NULL. + (solist_update_incremental): Likewise.
* solist.h (target_so_ops): New fields "update_breakpoints" and + (disable_probes_interface_cleanup): Likewise.
"handle_event". + (svr4_handle_solib_event): Likewise.
* infrun.c (set_stop_on_solib_events): New function. + (svr4_update_solib_event_breakpoint): Likewise.
(_initialize_infrun): Use the above for "set + (svr4_update_solib_event_breakpoints): Likewise.
stop-on-solib-events". + (svr4_create_solib_event_breakpoints): Likewise.
(handle_inferior_event): Pass new argument to handle_solib_event. + (enable_break): Free probes table before creating breakpoints.
* solib-svr4.c (probe.h): New include. + Use svr4_create_solib_event_breakpoints to create breakpoints.
(svr4_free_library_list): New forward declaration. + (svr4_solib_create_inferior_hook): Free the solib list.
(probe_action): New enum. + (_initialize_svr4_solib): Initialise
(probe_info): New struct. + svr4_so_ops.handle_solib_event and svr4_so_ops.update_breakpoints.
(probe_info): New static variable. +
(NUM_PROBES): New definition. +2013-06-04 Gary Benson <gbenson@redhat.com>
(svr4_info): New fields "using_xfer", "probes_table" and +
"solib_list". * target.h (target_ops): New field
(free_probes_table): New function. "to_augmented_libraries_svr4_read".
(free_solib_list): New function. (target_augmented_libraries_svr4_read): New macro.
(svr4_pspace_data_cleanup): Free probes table and solib list.
(svr4_copy_library_list): New function.
(svr4_current_sos_via_xfer_libraries): New parameter "annex".
(svr4_read_so_list): New parameter "prev_lm".
(svr4_current_sos_direct): Renamed from "svr4_current_sos".
(svr4_current_sos): New function.
(probe_and_action): New struct.
(hash_probe_and_action): New function.
(equal_probe_and_action): Likewise.
(register_solib_event_probe): Likewise.
(solib_event_probe_at): Likewise.
(solib_event_probe_action): Likewise.
(solist_update_full): Likewise.
(solist_update_incremental): Likewise.
(disable_probes_interface_cleanup): Likewise.
(svr4_handle_solib_event): Likewise.
(svr4_update_solib_event_breakpoint): Likewise.
(svr4_update_solib_event_breakpoints): Likewise.
(svr4_create_solib_event_breakpoints): Likewise.
(enable_break): Free probes table before creating breakpoints.
Use svr4_create_solib_event_breakpoints to create breakpoints.
(svr4_solib_create_inferior_hook): Free the solib list.
(_initialize_svr4_solib): Initialise
svr4_so_ops.handle_solib_event and svr4_so_ops.update_breakpoints.
Index: gdb-7.6/gdb/breakpoint.h Index: gdb-7.6/gdb/breakpoint.h
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/breakpoint.h 2013-05-19 16:16:20.551087270 +0200 --- gdb-7.6.orig/gdb/breakpoint.h 2013-06-10 14:44:37.455812656 +0200
+++ gdb-7.6/gdb/breakpoint.h 2013-05-19 16:16:20.837086948 +0200 +++ gdb-7.6/gdb/breakpoint.h 2013-06-10 14:44:37.709812579 +0200
@@ -1552,8 +1552,6 @@ extern int user_breakpoint_p (struct bre @@ -1552,8 +1552,6 @@ extern int user_breakpoint_p (struct bre
/* Attempt to determine architecture of location identified by SAL. */ /* Attempt to determine architecture of location identified by SAL. */
extern struct gdbarch *get_sal_arch (struct symtab_and_line sal); extern struct gdbarch *get_sal_arch (struct symtab_and_line sal);
@ -96,94 +74,10 @@ Index: gdb-7.6/gdb/breakpoint.h
extern void breakpoint_free_objfile (struct objfile *objfile); extern void breakpoint_free_objfile (struct objfile *objfile);
extern void breakpoints_relocate (struct objfile *objfile, extern void breakpoints_relocate (struct objfile *objfile,
Index: gdb-7.6/gdb/solib.h
===================================================================
--- gdb-7.6.orig/gdb/solib.h 2013-01-01 07:32:51.000000000 +0100
+++ gdb-7.6/gdb/solib.h 2013-05-19 16:16:20.838086946 +0200
@@ -90,4 +90,12 @@ extern CORE_ADDR gdb_bfd_lookup_symbol_f
void *),
void *data);
+/* Enable or disable optional solib event breakpoints as appropriate. */
+
+extern void update_solib_breakpoints (void);
+
+/* Handle an solib event by calling solib_add. */
+
+extern void handle_solib_event (void);
+
#endif /* SOLIB_H */
Index: gdb-7.6/gdb/solib.c
===================================================================
--- gdb-7.6.orig/gdb/solib.c 2013-05-19 16:16:20.468087363 +0200
+++ gdb-7.6/gdb/solib.c 2013-05-19 16:16:20.838086946 +0200
@@ -1221,6 +1221,38 @@ no_shared_libraries (char *ignored, int
objfile_purge_solibs ();
}
+/* See solib.h. */
+
+void
+update_solib_breakpoints (void)
+{
+ struct target_so_ops *ops = solib_ops (target_gdbarch ());
+
+ if (ops->update_breakpoints != NULL)
+ ops->update_breakpoints ();
+}
+
+/* See solib.h. */
+
+void
+handle_solib_event (void)
+{
+ struct target_so_ops *ops = solib_ops (target_gdbarch ());
+
+ if (ops->handle_event != NULL)
+ ops->handle_event ();
+
+ clear_program_space_solib_cache (current_inferior ()->pspace);
+
+ /* Check for any newly added shared libraries if we're supposed to
+ be adding them automatically. Switch terminal for any messages
+ produced by breakpoint_re_set. */
+ target_terminal_ours_for_output ();
+ solib_add (NULL, 0, &current_target, auto_solib_add);
+ target_terminal_inferior ();
+}
+
+
/* Reload shared libraries, but avoid reloading the same symbol file
we already have loaded. */
Index: gdb-7.6/gdb/solist.h
===================================================================
--- gdb-7.6.orig/gdb/solist.h 2013-01-01 07:32:51.000000000 +0100
+++ gdb-7.6/gdb/solist.h 2013-05-19 16:16:20.838086946 +0200
@@ -148,6 +148,19 @@ struct target_so_ops
core file (in particular, for readonly sections). */
int (*keep_data_in_core) (CORE_ADDR vaddr,
unsigned long size);
+
+ /* Enable or disable optional solib event breakpoints as
+ appropriate. This should be called whenever
+ stop_on_solib_events is changed. This pointer can be
+ NULL, in which case no enabling or disabling is necessary
+ for this target. */
+ void (*update_breakpoints) (void);
+
+ /* Target-specific processing of solib events that will be
+ performed before solib_add is called. This pointer can be
+ NULL, in which case no specific preprocessing is necessary
+ for this target. */
+ void (*handle_event) (void);
};
/* Free the memory associated with a (so_list *). */
Index: gdb-7.6/gdb/infrun.c Index: gdb-7.6/gdb/infrun.c
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/infrun.c 2013-05-19 16:16:20.508087318 +0200 --- gdb-7.6.orig/gdb/infrun.c 2013-06-10 14:44:37.427812664 +0200
+++ gdb-7.6/gdb/infrun.c 2013-05-19 16:16:20.840086944 +0200 +++ gdb-7.6/gdb/infrun.c 2013-06-10 14:44:37.711812579 +0200
@@ -370,6 +370,16 @@ static struct symbol *step_start_functio @@ -370,6 +370,16 @@ static struct symbol *step_start_functio
/* Nonzero if we want to give control to the user when we're notified /* Nonzero if we want to give control to the user when we're notified
of shared library events by the dynamic linker. */ of shared library events by the dynamic linker. */
@ -212,14 +106,14 @@ Index: gdb-7.6/gdb/infrun.c
Index: gdb-7.6/gdb/solib-svr4.c Index: gdb-7.6/gdb/solib-svr4.c
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/solib-svr4.c 2013-05-19 16:16:20.468087363 +0200 --- gdb-7.6.orig/gdb/solib-svr4.c 2013-06-10 14:44:37.392812675 +0200
+++ gdb-7.6/gdb/solib-svr4.c 2013-05-19 16:21:40.285816084 +0200 +++ gdb-7.6/gdb/solib-svr4.c 2013-06-10 14:44:37.712812578 +0200
@@ -47,9 +47,12 @@ @@ -46,10 +46,12 @@
#include "auxv.h"
#include "exceptions.h" #include "exceptions.h"
#include "gdb_bfd.h" #include "gdb_bfd.h"
+#include "probe.h" +#include "probe.h"
+
static struct link_map_offsets *svr4_fetch_link_map_offsets (void); static struct link_map_offsets *svr4_fetch_link_map_offsets (void);
static int svr4_have_link_map_offsets (void); static int svr4_have_link_map_offsets (void);
static void svr4_relocate_main_executable (void); static void svr4_relocate_main_executable (void);
@ -227,7 +121,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
/* Link map info to include in an allocated so_list entry. */ /* Link map info to include in an allocated so_list entry. */
@@ -106,6 +109,55 @@ static const char * const main_name_lis @@ -106,6 +108,55 @@ static const char * const main_name_lis
NULL NULL
}; };
@ -283,7 +177,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
/* Return non-zero if GDB_SO_NAME and INFERIOR_SO_NAME represent /* Return non-zero if GDB_SO_NAME and INFERIOR_SO_NAME represent
the same shared library. */ the same shared library. */
@@ -313,17 +365,56 @@ struct svr4_info @@ -313,17 +364,58 @@ struct svr4_info
CORE_ADDR interp_text_sect_high; CORE_ADDR interp_text_sect_high;
CORE_ADDR interp_plt_sect_low; CORE_ADDR interp_plt_sect_low;
CORE_ADDR interp_plt_sect_high; CORE_ADDR interp_plt_sect_high;
@ -292,8 +186,10 @@ Index: gdb-7.6/gdb/solib-svr4.c
+ via qXfer:libraries-svr4:read. */ + via qXfer:libraries-svr4:read. */
+ int using_xfer; + int using_xfer;
+ +
+ /* Table mapping breakpoint addresses to probes and actions, used + /* Table of struct probe_and_action instances, used by the
+ by the probes-based interface. */ + probes-based interface to map breakpoint addresses to probes
+ and their associated actions. Lookup is performed using
+ probe_and_action->probe->address. */
+ htab_t probes_table; + htab_t probes_table;
+ +
+ /* List of objects loaded into the inferior, used by the probes- + /* List of objects loaded into the inferior, used by the probes-
@ -340,7 +236,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
xfree (info); xfree (info);
} }
@@ -982,6 +1073,36 @@ svr4_free_library_list (void *p_list) @@ -982,6 +1074,34 @@ svr4_free_library_list (void *p_list)
} }
} }
@ -349,7 +245,6 @@ Index: gdb-7.6/gdb/solib-svr4.c
+static struct so_list * +static struct so_list *
+svr4_copy_library_list (struct so_list *src) +svr4_copy_library_list (struct so_list *src)
+{ +{
+ struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
+ struct so_list *dst = NULL; + struct so_list *dst = NULL;
+ struct so_list **link = &dst; + struct so_list **link = &dst;
+ +
@ -357,12 +252,11 @@ Index: gdb-7.6/gdb/solib-svr4.c
+ { + {
+ struct so_list *new; + struct so_list *new;
+ +
+ new = XZALLOC (struct so_list); + new = xmalloc (sizeof (struct so_list));
+
+ memcpy (new, src, sizeof (struct so_list)); + memcpy (new, src, sizeof (struct so_list));
+ +
+ new->lm_info = xmalloc (lmo->link_map_size); + new->lm_info = xmalloc (sizeof (struct lm_info));
+ memcpy (new->lm_info, src->lm_info, lmo->link_map_size); + memcpy (new->lm_info, src->lm_info, sizeof (struct lm_info));
+ +
+ new->next = NULL; + new->next = NULL;
+ *link = new; + *link = new;
@ -377,7 +271,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
#ifdef HAVE_LIBEXPAT #ifdef HAVE_LIBEXPAT
#include "xml-support.h" #include "xml-support.h"
@@ -1097,14 +1218,19 @@ svr4_parse_libraries (const char *docume @@ -1097,23 +1217,30 @@ svr4_parse_libraries (const char *docume
return 0; return 0;
} }
@ -400,7 +294,10 @@ Index: gdb-7.6/gdb/solib-svr4.c
{ {
char *svr4_library_document; char *svr4_library_document;
int result; int result;
@@ -1113,7 +1239,7 @@ svr4_current_sos_via_xfer_libraries (str struct cleanup *back_to;
+ gdb_assert (annex == NULL || target_augmented_libraries_svr4_read ());
+
/* Fetch the list of shared libraries. */ /* Fetch the list of shared libraries. */
svr4_library_document = target_read_stralloc (&current_target, svr4_library_document = target_read_stralloc (&current_target,
TARGET_OBJECT_LIBRARIES_SVR4, TARGET_OBJECT_LIBRARIES_SVR4,
@ -409,7 +306,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
if (svr4_library_document == NULL) if (svr4_library_document == NULL)
return 0; return 0;
@@ -1127,7 +1253,8 @@ svr4_current_sos_via_xfer_libraries (str @@ -1127,7 +1254,8 @@ svr4_current_sos_via_xfer_libraries (str
#else #else
static int static int
@ -419,7 +316,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
{ {
return 0; return 0;
} }
@@ -1161,15 +1288,17 @@ svr4_default_sos (void) @@ -1161,15 +1289,19 @@ svr4_default_sos (void)
return new; return new;
} }
@ -430,7 +327,9 @@ Index: gdb-7.6/gdb/solib-svr4.c
+ Expect the first entry in the chain's previous entry to be PREV_LM. + Expect the first entry in the chain's previous entry to be PREV_LM.
+ Add the entries to the tail referenced by LINK_PTR_PTR. Ignore the + Add the entries to the tail referenced by LINK_PTR_PTR. Ignore the
+ first entry if IGNORE_FIRST and set global MAIN_LM_ADDR according + first entry if IGNORE_FIRST and set global MAIN_LM_ADDR according
+ to it. Returns nonzero upon success. */ + to it. Returns nonzero upon success. If zero is returned the
+ entries stored to LINK_PTR_PTR are still valid although they may
+ represent only part of the inferior library list. */
-static void -static void
-svr4_read_so_list (CORE_ADDR lm, struct so_list ***link_ptr_ptr, -svr4_read_so_list (CORE_ADDR lm, struct so_list ***link_ptr_ptr,
@ -444,7 +343,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
for (; lm != 0; prev_lm = lm, lm = next_lm) for (; lm != 0; prev_lm = lm, lm = next_lm)
{ {
@@ -1185,7 +1314,7 @@ svr4_read_so_list (CORE_ADDR lm, struct @@ -1185,7 +1317,7 @@ svr4_read_so_list (CORE_ADDR lm, struct
if (new->lm_info == NULL) if (new->lm_info == NULL)
{ {
do_cleanups (old_chain); do_cleanups (old_chain);
@ -453,7 +352,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
} }
next_lm = new->lm_info->l_next; next_lm = new->lm_info->l_next;
@@ -1196,7 +1325,7 @@ svr4_read_so_list (CORE_ADDR lm, struct @@ -1196,7 +1328,7 @@ svr4_read_so_list (CORE_ADDR lm, struct
paddress (target_gdbarch (), prev_lm), paddress (target_gdbarch (), prev_lm),
paddress (target_gdbarch (), new->lm_info->l_prev)); paddress (target_gdbarch (), new->lm_info->l_prev));
do_cleanups (old_chain); do_cleanups (old_chain);
@ -462,7 +361,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
} }
/* For SVR4 versions, the first entry in the link map is for the /* For SVR4 versions, the first entry in the link map is for the
@@ -1291,17 +1420,19 @@ svr4_read_so_list (CORE_ADDR lm, struct @@ -1291,17 +1423,21 @@ svr4_read_so_list (CORE_ADDR lm, struct
**link_ptr_ptr = new; **link_ptr_ptr = new;
*link_ptr_ptr = &new->next; *link_ptr_ptr = &new->next;
} }
@ -471,8 +370,10 @@ Index: gdb-7.6/gdb/solib-svr4.c
} }
-/* Implement the "current_sos" target_so_ops method. */ -/* Implement the "current_sos" target_so_ops method. */
+/* Read the full list of currently loaded shared objects directly from +/* Read the full list of currently loaded shared objects directly
+ the inferior. */ + from the inferior, without referring to any libraries read and
+ stored by the probes interface. Handle special cases relating
+ to the first elements of the list. */
static struct so_list * static struct so_list *
-svr4_current_sos (void) -svr4_current_sos (void)
@ -485,7 +386,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
struct cleanup *back_to; struct cleanup *back_to;
int ignore_first; int ignore_first;
struct svr4_library_list library_list; struct svr4_library_list library_list;
@@ -1314,19 +1445,16 @@ svr4_current_sos (void) @@ -1314,19 +1450,16 @@ svr4_current_sos (void)
Unfortunately statically linked inferiors will also fall back through this Unfortunately statically linked inferiors will also fall back through this
suboptimal code path. */ suboptimal code path. */
@ -509,7 +410,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
/* Always locate the debug struct, in case it has moved. */ /* Always locate the debug struct, in case it has moved. */
info->debug_base = 0; info->debug_base = 0;
locate_base (info); locate_base (info);
@@ -1349,7 +1477,7 @@ svr4_current_sos (void) @@ -1349,7 +1482,7 @@ svr4_current_sos (void)
`struct so_list' nodes. */ `struct so_list' nodes. */
lm = solib_svr4_r_map (info); lm = solib_svr4_r_map (info);
if (lm) if (lm)
@ -518,7 +419,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
/* On Solaris, the dynamic linker is not in the normal list of /* On Solaris, the dynamic linker is not in the normal list of
shared objects, so make sure we pick it up too. Having shared objects, so make sure we pick it up too. Having
@@ -1357,7 +1485,7 @@ svr4_current_sos (void) @@ -1357,7 +1490,7 @@ svr4_current_sos (void)
for skipping dynamic linker resolver code. */ for skipping dynamic linker resolver code. */
lm = solib_svr4_r_ldsomap (info); lm = solib_svr4_r_ldsomap (info);
if (lm) if (lm)
@ -527,7 +428,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
discard_cleanups (back_to); discard_cleanups (back_to);
@@ -1367,6 +1495,22 @@ svr4_current_sos (void) @@ -1367,6 +1500,22 @@ svr4_current_sos (void)
return head; return head;
} }
@ -538,8 +439,8 @@ Index: gdb-7.6/gdb/solib-svr4.c
+{ +{
+ struct svr4_info *info = get_svr4_info (); + struct svr4_info *info = get_svr4_info ();
+ +
+ /* If we are using the probes interface and the solib list has + /* If the solib list has been read and stored by the probes
+ been cached then we simply return that. */ + interface then we return a copy of the stored list. */
+ if (info->solib_list != NULL) + if (info->solib_list != NULL)
+ return svr4_copy_library_list (info->solib_list); + return svr4_copy_library_list (info->solib_list);
+ +
@ -550,7 +451,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
/* Get the address of the link_map for a given OBJFILE. */ /* Get the address of the link_map for a given OBJFILE. */
CORE_ADDR CORE_ADDR
@@ -1449,6 +1593,434 @@ exec_entry_point (struct bfd *abfd, stru @@ -1449,6 +1598,476 @@ exec_entry_point (struct bfd *abfd, stru
return gdbarch_addr_bits_remove (target_gdbarch (), addr); return gdbarch_addr_bits_remove (target_gdbarch (), addr);
} }
@ -599,11 +500,9 @@ Index: gdb-7.6/gdb/solib-svr4.c
+ +
+ /* Create the probes table, if necessary. */ + /* Create the probes table, if necessary. */
+ if (info->probes_table == NULL) + if (info->probes_table == NULL)
+ {
+ info->probes_table = htab_create_alloc (1, hash_probe_and_action, + info->probes_table = htab_create_alloc (1, hash_probe_and_action,
+ equal_probe_and_action, + equal_probe_and_action,
+ xfree, xcalloc, xfree); + xfree, xcalloc, xfree);
+ }
+ +
+ lookup.probe = probe; + lookup.probe = probe;
+ slot = htab_find_slot (info->probes_table, &lookup, INSERT); + slot = htab_find_slot (info->probes_table, &lookup, INSERT);
@ -667,12 +566,13 @@ Index: gdb-7.6/gdb/solib-svr4.c
+} +}
+ +
+/* Populate the shared object list by reading the entire list of +/* Populate the shared object list by reading the entire list of
+ shared objects from the inferior. Returns nonzero on success. */ + shared objects from the inferior. Handle special cases relating
+ to the first elements of the list. Returns nonzero on success. */
+ +
+static int +static int
+solist_update_full (struct svr4_info *info) +solist_update_full (struct svr4_info *info)
+{ +{
+ svr4_free_library_list (&info->solib_list); + free_solib_list (info);
+ info->solib_list = svr4_current_sos_direct (info); + info->solib_list = svr4_current_sos_direct (info);
+ +
+ return 1; + return 1;
@ -689,7 +589,10 @@ Index: gdb-7.6/gdb/solib-svr4.c
+ struct so_list *tail; + struct so_list *tail;
+ CORE_ADDR prev_lm; + CORE_ADDR prev_lm;
+ +
+ /* Fall back to a full update if we haven't read anything yet. */ + /* svr4_current_sos_direct contains logic to handle a number of
+ special cases relating to the first elements of the list. To
+ avoid duplicating this logic we defer to solist_update_full
+ if the list is empty. */
+ if (info->solib_list == NULL) + if (info->solib_list == NULL)
+ return 0; + return 0;
+ +
@ -699,7 +602,8 @@ Index: gdb-7.6/gdb/solib-svr4.c
+ return 0; + return 0;
+ +
+ /* Walk to the end of the list. */ + /* Walk to the end of the list. */
+ for (tail = info->solib_list; tail->next; tail = tail->next); + for (tail = info->solib_list; tail->next != NULL; tail = tail->next)
+ /* Nothing. */;
+ prev_lm = tail->lm_info->lm_addr; + prev_lm = tail->lm_info->lm_addr;
+ +
+ /* Read the new objects. */ + /* Read the new objects. */
@ -708,7 +612,9 @@ Index: gdb-7.6/gdb/solib-svr4.c
+ struct svr4_library_list library_list; + struct svr4_library_list library_list;
+ char annex[64]; + char annex[64];
+ +
+ xsnprintf (annex, sizeof (annex), "start=%lx;prev=%lx", lm, prev_lm); + xsnprintf (annex, sizeof (annex), "start=%s;prev=%s",
+ phex_nz (lm, sizeof (lm)),
+ phex_nz (prev_lm, sizeof (prev_lm)));
+ if (!svr4_current_sos_via_xfer_libraries (&library_list, annex)) + if (!svr4_current_sos_via_xfer_libraries (&library_list, annex))
+ return 0; + return 0;
+ +
@ -718,6 +624,10 @@ Index: gdb-7.6/gdb/solib-svr4.c
+ { + {
+ struct so_list **link = &tail->next; + struct so_list **link = &tail->next;
+ +
+ /* IGNORE_FIRST may safely be set to zero here because the
+ above check and deferral to solist_update_full ensures
+ that this call to svr4_read_so_list will never see the
+ first element. */
+ if (!svr4_read_so_list (lm, prev_lm, &link, 0)) + if (!svr4_read_so_list (lm, prev_lm, &link, 0))
+ return 0; + return 0;
+ } + }
@ -767,42 +677,64 @@ Index: gdb-7.6/gdb/solib-svr4.c
+ pc = regcache_read_pc (get_current_regcache ()); + pc = regcache_read_pc (get_current_regcache ());
+ pa = solib_event_probe_at (info, pc); + pa = solib_event_probe_at (info, pc);
+ if (pa == NULL) + if (pa == NULL)
+ goto error; + {
+ do_cleanups (old_chain);
+ return;
+ }
+ +
+ action = solib_event_probe_action (pa); + action = solib_event_probe_action (pa);
+ if (action == PROBES_INTERFACE_FAILED) + if (action == PROBES_INTERFACE_FAILED)
+ goto error; + {
+ do_cleanups (old_chain);
+ return;
+ }
+ +
+ if (action == DO_NOTHING) + if (action == DO_NOTHING)
+ {
+ discard_cleanups (old_chain);
+ return; + return;
+ }
+ +
+ /* EVALUATE_PROBE_ARGUMENT looks up symbols in the dynamic linker + /* evaluate_probe_argument looks up symbols in the dynamic linker
+ using FIND_PC_SECTION. FIND_PC_SECTION is accelerated by a cache + using find_pc_section. find_pc_section is accelerated by a cache
+ called the section map. The section map is invalidated every + called the section map. The section map is invalidated every
+ time a shared library is loaded or unloaded, and if the inferior + time a shared library is loaded or unloaded, and if the inferior
+ is generating a lot of shared library events then the section map + is generating a lot of shared library events then the section map
+ will be updated every time SVR4_HANDLE_SOLIB_EVENT is called. + will be updated every time svr4_handle_solib_event is called.
+ We called FIND_PC_SECTION in SVR4_CREATE_SOLIB_EVENT_BREAKPOINTS, + We called find_pc_section in svr4_create_solib_event_breakpoints,
+ so we can guarantee that the dynamic linker's sections are in the + so we can guarantee that the dynamic linker's sections are in the
+ section map. We can therefore inhibit section map updates across + section map. We can therefore inhibit section map updates across
+ these calls to EVALUATE_PROBE_ARGUMENT and save a lot of time. */ + these calls to evaluate_probe_argument and save a lot of time. */
+ inhibit_section_map_updates (); + inhibit_section_map_updates (current_program_space);
+ usm_chain = make_cleanup (resume_section_map_updates_cleanup, NULL); + usm_chain = make_cleanup (resume_section_map_updates_cleanup,
+ current_program_space);
+ +
+ val = evaluate_probe_argument (pa->probe, 1); + val = evaluate_probe_argument (pa->probe, 1);
+ if (val == NULL) + if (val == NULL)
+ goto error; + {
+ do_cleanups (old_chain);
+ return;
+ }
+ +
+ debug_base = value_as_address (val); + debug_base = value_as_address (val);
+ if (debug_base == 0) + if (debug_base == 0)
+ goto error; + {
+ do_cleanups (old_chain);
+ return;
+ }
+ +
+ /* Always locate the debug struct, in case it moved. */ + /* Always locate the debug struct, in case it moved. */
+ info->debug_base = 0; + info->debug_base = 0;
+ if (locate_base (info) == 0) + if (locate_base (info) == 0)
+ goto error; + {
+ do_cleanups (old_chain);
+ return;
+ }
+ +
+ /* Do not process namespaces other than the initial one. */ + /* GDB does not currently support libraries loaded via dlmopen
+ into namespaces other than the initial one. We must ignore
+ any namespace other than the initial namespace here until
+ support for this is added to GDB. */
+ if (debug_base != info->debug_base) + if (debug_base != info->debug_base)
+ action = DO_NOTHING; + action = DO_NOTHING;
+ +
@ -828,17 +760,13 @@ Index: gdb-7.6/gdb/solib-svr4.c
+ if (action == FULL_RELOAD) + if (action == FULL_RELOAD)
+ { + {
+ if (!solist_update_full (info)) + if (!solist_update_full (info))
+ goto error; + {
+ do_cleanups (old_chain);
+ return;
+ }
+ } + }
+ +
+ discard_cleanups (old_chain); + discard_cleanups (old_chain);
+ return;
+
+ error:
+ /* We should never reach here, but if we do we disable the
+ probes interface and revert to the original interface. */
+
+ do_cleanups (old_chain);
+} +}
+ +
+/* Helper function for svr4_update_solib_event_breakpoints. */ +/* Helper function for svr4_update_solib_event_breakpoints. */
@ -846,27 +774,40 @@ Index: gdb-7.6/gdb/solib-svr4.c
+static int +static int
+svr4_update_solib_event_breakpoint (struct breakpoint *b, void *arg) +svr4_update_solib_event_breakpoint (struct breakpoint *b, void *arg)
+{ +{
+ struct svr4_info *info = get_svr4_info ();
+ struct bp_location *loc; + struct bp_location *loc;
+ +
+ if (b->type != bp_shlib_event) + if (b->type != bp_shlib_event)
+ return 0; /* Continue iterating. */
+
+ for (loc = b->loc; loc; loc = loc->next)
+ { + {
+ struct probe_and_action *pa = solib_event_probe_at (info, loc->address); + /* Continue iterating. */
+ return 0;
+ }
+ +
+ if (pa != NULL) + for (loc = b->loc; loc != NULL; loc = loc->next)
+ { + {
+ struct svr4_info *info;
+ struct probe_and_action *pa;
+
+ info = program_space_data (loc->pspace, solib_svr4_pspace_data);
+ if (info == NULL || info->probes_table == NULL)
+ continue;
+
+ pa = solib_event_probe_at (info, loc->address);
+ if (pa == NULL)
+ continue;
+
+ if (pa->action == DO_NOTHING) + if (pa->action == DO_NOTHING)
+ b->enable_state = (stop_on_solib_events + {
+ ? bp_enabled : bp_disabled); + if (b->enable_state == bp_disabled && stop_on_solib_events)
+ + enable_breakpoint (b);
+ return 0; /* Continue iterating. */ + else if (b->enable_state == bp_enabled && !stop_on_solib_events)
+ } + disable_breakpoint (b);
+ } + }
+ +
+ return 0; /* Continue iterating. */ + break;
+ }
+
+ /* Continue iterating. */
+ return 0;
+} +}
+ +
+/* Enable or disable optional solib event breakpoints as appropriate. +/* Enable or disable optional solib event breakpoints as appropriate.
@ -875,13 +816,13 @@ Index: gdb-7.6/gdb/solib-svr4.c
+static void +static void
+svr4_update_solib_event_breakpoints (void) +svr4_update_solib_event_breakpoints (void)
+{ +{
+ struct svr4_info *info = get_svr4_info ();
+
+ if (info->probes_table)
+ iterate_over_breakpoints (svr4_update_solib_event_breakpoint, NULL); + iterate_over_breakpoints (svr4_update_solib_event_breakpoint, NULL);
+} +}
+ +
+/* Create and register solib event breakpoints. */ +/* Create and register solib event breakpoints. PROBES is an array
+ of NUM_PROBES elements, each of which is vector of probes. A
+ solib event breakpoint will be created and registered for each
+ probe. */
+ +
+static void +static void
+svr4_create_probe_breakpoints (struct gdbarch *gdbarch, +svr4_create_probe_breakpoints (struct gdbarch *gdbarch,
@ -923,7 +864,6 @@ Index: gdb-7.6/gdb/solib-svr4.c
+svr4_create_solib_event_breakpoints (struct gdbarch *gdbarch, +svr4_create_solib_event_breakpoints (struct gdbarch *gdbarch,
+ CORE_ADDR address) + CORE_ADDR address)
+{ +{
+ struct svr4_info *info = get_svr4_info ();
+ struct obj_section *os; + struct obj_section *os;
+ +
+ os = find_pc_section (address); + os = find_pc_section (address);
@ -940,28 +880,31 @@ Index: gdb-7.6/gdb/solib-svr4.c
+ memset (probes, 0, sizeof (probes)); + memset (probes, 0, sizeof (probes));
+ for (i = 0; i < NUM_PROBES; i++) + for (i = 0; i < NUM_PROBES; i++)
+ { + {
+ char name[32] = { '\0' }; + const char *name = probe_info[i].name;
+ + char buf[32];
+ /* Fedora 17, RHEL 6.2, and RHEL 6.3 shipped with an
+ early version of the probes code in which the probes'
+ names were prefixed with "rtld_" and the "map_failed"
+ probe did not exist. The locations of the probes are
+ otherwise the same, so we check for probes with
+ prefixed names if probes with unprefixed names are
+ not present. */
+ +
+ /* Fedora 17 and Red Hat Enterprise Linux 6.2-6.4
+ shipped with an early version of the probes code in
+ which the probes' names were prefixed with "rtld_"
+ and the "map_failed" probe did not exist. The
+ locations of the probes are otherwise the same, so
+ we check for probes with prefixed names if probes
+ with unprefixed names are not present. */
+ if (with_prefix) + if (with_prefix)
+ strncat (name, "rtld_", sizeof (name) - strlen (name) - 1); + {
+ + xsnprintf (buf, sizeof (buf), "rtld_%s", name);
+ strncat (name, probe_info[i].name, + name = buf;
+ sizeof (name) - strlen (name) - 1); + }
+ +
+ probes[i] = find_probes_in_objfile (os->objfile, "rtld", name); + probes[i] = find_probes_in_objfile (os->objfile, "rtld", name);
+ +
+ if (!strcmp (name, "rtld_map_failed")) + /* The "map_failed" probe did not exist in early
+ versions of the probes code in which the probes'
+ names were prefixed with "rtld_". */
+ if (strcmp (name, "rtld_map_failed") == 0)
+ continue; + continue;
+ +
+ if (!VEC_length (probe_p, probes[i])) + if (VEC_empty (probe_p, probes[i]))
+ { + {
+ all_probes_found = 0; + all_probes_found = 0;
+ break; + break;
@ -985,16 +928,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
/* Helper function for gdb_bfd_lookup_symbol. */ /* Helper function for gdb_bfd_lookup_symbol. */
static int static int
@@ -1501,6 +2073,8 @@ enable_break (struct svr4_info *info, in @@ -1532,7 +2151,7 @@ enable_break (struct svr4_info *info, in
info->interp_text_sect_low = info->interp_text_sect_high = 0;
info->interp_plt_sect_low = info->interp_plt_sect_high = 0;
+ free_probes_table (info);
+
/* If we already have a shared library list in the target, and
r_debug contains r_brk, set the breakpoint there - this should
mean r_brk has already been relocated. Assume the dynamic linker
@@ -1532,7 +2106,7 @@ enable_break (struct svr4_info *info, in
That knowledge is encoded in the address, if it's Thumb the low bit That knowledge is encoded in the address, if it's Thumb the low bit
is 1. However, we've stripped that info above and it's not clear is 1. However, we've stripped that info above and it's not clear
what all the consequences are of passing a non-addr_bits_remove'd what all the consequences are of passing a non-addr_bits_remove'd
@ -1003,7 +937,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
find_pc_section verifies we know about the address and have some find_pc_section verifies we know about the address and have some
hope of computing the right kind of breakpoint to use (via hope of computing the right kind of breakpoint to use (via
symbol info). It does mean that GDB needs to be pointed at a symbol info). It does mean that GDB needs to be pointed at a
@@ -1570,7 +2144,7 @@ enable_break (struct svr4_info *info, in @@ -1570,7 +2189,7 @@ enable_break (struct svr4_info *info, in
+ bfd_section_size (tmp_bfd, interp_sect); + bfd_section_size (tmp_bfd, interp_sect);
} }
@ -1012,7 +946,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
return 1; return 1;
} }
} }
@@ -1728,7 +2302,8 @@ enable_break (struct svr4_info *info, in @@ -1728,7 +2347,8 @@ enable_break (struct svr4_info *info, in
if (sym_addr != 0) if (sym_addr != 0)
{ {
@ -1022,7 +956,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
xfree (interp_name); xfree (interp_name);
return 1; return 1;
} }
@@ -1754,7 +2329,7 @@ enable_break (struct svr4_info *info, in @@ -1754,7 +2374,7 @@ enable_break (struct svr4_info *info, in
sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (), sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
sym_addr, sym_addr,
&current_target); &current_target);
@ -1031,7 +965,7 @@ Index: gdb-7.6/gdb/solib-svr4.c
return 1; return 1;
} }
} }
@@ -1770,7 +2345,7 @@ enable_break (struct svr4_info *info, in @@ -1770,7 +2390,7 @@ enable_break (struct svr4_info *info, in
sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (), sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch (),
sym_addr, sym_addr,
&current_target); &current_target);
@ -1040,28 +974,112 @@ Index: gdb-7.6/gdb/solib-svr4.c
return 1; return 1;
} }
} }
@@ -2266,6 +2841,9 @@ svr4_solib_create_inferior_hook (int fro @@ -2266,6 +2886,10 @@ svr4_solib_create_inferior_hook (int fro
info = get_svr4_info (); info = get_svr4_info ();
+ /* Free the probes-based interface's solib list. */ + /* Clear the probes-based interface's state. */
+ free_probes_table (info);
+ free_solib_list (info); + free_solib_list (info);
+ +
/* Relocate the main executable if necessary. */ /* Relocate the main executable if necessary. */
svr4_relocate_main_executable (); svr4_relocate_main_executable ();
@@ -2507,4 +3085,6 @@ _initialize_svr4_solib (void) @@ -2507,4 +3131,6 @@ _initialize_svr4_solib (void)
svr4_so_ops.lookup_lib_global_symbol = elf_lookup_lib_symbol; svr4_so_ops.lookup_lib_global_symbol = elf_lookup_lib_symbol;
svr4_so_ops.same = svr4_same; svr4_so_ops.same = svr4_same;
svr4_so_ops.keep_data_in_core = svr4_keep_data_in_core; svr4_so_ops.keep_data_in_core = svr4_keep_data_in_core;
+ svr4_so_ops.update_breakpoints = svr4_update_solib_event_breakpoints; + svr4_so_ops.update_breakpoints = svr4_update_solib_event_breakpoints;
+ svr4_so_ops.handle_event = svr4_handle_solib_event; + svr4_so_ops.handle_event = svr4_handle_solib_event;
} }
Index: gdb-7.6/gdb/solib.c
===================================================================
--- gdb-7.6.orig/gdb/solib.c 2013-06-10 14:44:37.392812675 +0200
+++ gdb-7.6/gdb/solib.c 2013-06-10 14:44:37.713812578 +0200
@@ -1221,6 +1221,37 @@ no_shared_libraries (char *ignored, int
objfile_purge_solibs ();
}
+/* See solib.h. */
+
+void
+update_solib_breakpoints (void)
+{
+ const struct target_so_ops *ops = solib_ops (target_gdbarch ());
+
+ if (ops->update_breakpoints != NULL)
+ ops->update_breakpoints ();
+}
+
+/* See solib.h. */
+
+void
+handle_solib_event (void)
+{
+ const struct target_so_ops *ops = solib_ops (target_gdbarch ());
+
+ if (ops->handle_event != NULL)
+ ops->handle_event ();
+
+ clear_program_space_solib_cache (current_inferior ()->pspace);
+
+ /* Check for any newly added shared libraries if we're supposed to
+ be adding them automatically. Switch terminal for any messages
+ produced by breakpoint_re_set. */
+ target_terminal_ours_for_output ();
+ solib_add (NULL, 0, &current_target, auto_solib_add);
+ target_terminal_inferior ();
+}
+
/* Reload shared libraries, but avoid reloading the same symbol file
we already have loaded. */
Index: gdb-7.6/gdb/solib.h
===================================================================
--- gdb-7.6.orig/gdb/solib.h 2013-01-01 07:32:51.000000000 +0100
+++ gdb-7.6/gdb/solib.h 2013-06-10 14:44:37.713812578 +0200
@@ -90,4 +90,12 @@ extern CORE_ADDR gdb_bfd_lookup_symbol_f
void *),
void *data);
+/* Enable or disable optional solib event breakpoints as appropriate. */
+
+extern void update_solib_breakpoints (void);
+
+/* Handle an solib event by calling solib_add. */
+
+extern void handle_solib_event (void);
+
#endif /* SOLIB_H */
Index: gdb-7.6/gdb/solist.h
===================================================================
--- gdb-7.6.orig/gdb/solist.h 2013-01-01 07:32:51.000000000 +0100
+++ gdb-7.6/gdb/solist.h 2013-06-10 14:44:37.713812578 +0200
@@ -148,6 +148,19 @@ struct target_so_ops
core file (in particular, for readonly sections). */
int (*keep_data_in_core) (CORE_ADDR vaddr,
unsigned long size);
+
+ /* Enable or disable optional solib event breakpoints as
+ appropriate. This should be called whenever
+ stop_on_solib_events is changed. This pointer can be
+ NULL, in which case no enabling or disabling is necessary
+ for this target. */
+ void (*update_breakpoints) (void);
+
+ /* Target-specific processing of solib events that will be
+ performed before solib_add is called. This pointer can be
+ NULL, in which case no specific preprocessing is necessary
+ for this target. */
+ void (*handle_event) (void);
};
/* Free the memory associated with a (so_list *). */
Index: gdb-7.6/gdb/breakpoint.c Index: gdb-7.6/gdb/breakpoint.c
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/breakpoint.c 2013-05-19 16:16:20.606087208 +0200 --- gdb-7.6.orig/gdb/breakpoint.c 2013-06-10 14:44:37.500812642 +0200
+++ gdb-7.6/gdb/breakpoint.c 2013-05-19 16:21:55.288805269 +0200 +++ gdb-7.6/gdb/breakpoint.c 2013-06-10 14:44:57.301806708 +0200
@@ -5361,25 +5361,6 @@ handle_jit_event (void) @@ -5348,25 +5348,6 @@ handle_jit_event (void)
target_terminal_inferior (); target_terminal_inferior ();
} }

View File

@ -1,165 +1,31 @@
http://sourceware.org/ml/gdb-patches/2013-05/msg00631.html http://sourceware.org/ml/gdb-cvs/2013-06/msg00019.html
Subject: [RFA 6/7] Linker-debugger interface tests by Jan
### src/gdb/testsuite/ChangeLog 2013/05/30 00:25:16 1.3682
--IYV9cRr2u6rjcP4B ### src/gdb/testsuite/ChangeLog 2013/06/04 13:23:31 1.3683
Content-Type: text/plain; charset=us-ascii ## -1,3 +1,19 @@
Content-Disposition: inline +2013-06-04 Jan Kratochvil <jan.kratochvil@redhat.com>
+ Gary Benson <gbenson@redhat.com>
This patch updates the testsuite to cope with some changes resulting
from the probes-based interface, and adds a new test. This patch is
principally the work of Jan Kratochvil.
--IYV9cRr2u6rjcP4B
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="rtld-probes-6-tests-jk.patch"
2013-05-16 Jan Kratochvil <jan.kratochvil@redhat.com>
Gary Benson <gbenson@redhat.com>
* lib/gdb.exp (build_executable_from_specs): Use gdb_compile_pthread,
gdb_compile_shlib or gdb_compile_shlib_pthreads where appropriate.
* lib/prelink-support.exp (build_executable_own_libs): Allow INTERP
to be set to "no" to indicate that no ld.so copy should be made.
* gdb.base/break-interp.exp (solib_bp): New constant.
(reach_1): Use the above instead of "_dl_debug_state".
(test_attach): Likewise.
(test_ld): Likewise.
* gdb.threads/dlopen-libpthread.exp: New file.
* gdb.threads/dlopen-libpthread.c: Likewise.
* gdb.threads/dlopen-libpthread-lib.c: Likewise.
* gdb.base/solib-corrupted.exp: Disable test if GDB is using probes.
Index: gdb-7.6/gdb/testsuite/lib/gdb.exp
===================================================================
--- gdb-7.6.orig/gdb/testsuite/lib/gdb.exp 2013-05-19 16:05:37.881840646 +0200
+++ gdb-7.6/gdb/testsuite/lib/gdb.exp 2013-05-19 16:06:10.436822964 +0200
@@ -4011,22 +4011,6 @@ proc build_executable_from_specs {testna
set binfile [standard_output_file $executable]
- set objects {}
- set i 0
- foreach {s local_options} $args {
- if { [gdb_compile "${srcdir}/${subdir}/${s}" "${binfile}${i}.o" object $local_options] != "" } {
- untested $testname
- return -1
- }
- lappend objects "${binfile}${i}.o"
- incr i
- }
-
- if { [gdb_compile $objects "${binfile}" executable $options] != "" } {
- untested $testname
- return -1
- }
-
set info_options ""
if { [lsearch -exact $options "c++"] >= 0 } {
set info_options "c++"
@@ -4034,6 +4018,42 @@ proc build_executable_from_specs {testna
if [get_compiler_info ${info_options}] {
return -1
}
+ +
+ set binfile [standard_output_file $executable] + * lib/gdb.exp (build_executable_from_specs): Use gdb_compile_pthread,
+ gdb_compile_shlib or gdb_compile_shlib_pthreads where appropriate.
+ * lib/prelink-support.exp (build_executable_own_libs): Allow INTERP
+ to be set to "no" to indicate that no ld.so copy should be made.
+ * gdb.base/break-interp.exp (solib_bp): New constant.
+ (reach_1): Use the above instead of "_dl_debug_state".
+ (test_attach): Likewise.
+ (test_ld): Likewise.
+ * gdb.threads/dlopen-libpthread.exp: New file.
+ * gdb.threads/dlopen-libpthread.c: Likewise.
+ * gdb.threads/dlopen-libpthread-lib.c: Likewise.
+ * gdb.base/solib-corrupted.exp: Disable test if GDB is using probes.
+ +
+ set func gdb_compile 2013-05-30 Yao Qi <yao@codesourcery.com>
+ set func_index [lsearch -regexp $options {^(pthreads|shlib|shlib_pthreads)$}]
+ if {$func_index != -1} {
+ set func "${func}_[lindex $options $func_index]"
+ }
+
+ # gdb_compile_shlib and gdb_compile_shlib_pthreads do not use the 3rd
+ # parameter. They also requires $sources while gdb_compile and
+ # gdb_compile_pthreads require $objects. Moreover they ignore any options.
+ if [string match gdb_compile_shlib* $func] {
+ set sources_path {}
+ foreach {s local_options} $args {
+ lappend sources_path "${srcdir}/${subdir}/${s}"
+ }
+ set ret [$func $sources_path "${binfile}" $options]
+ } else {
+ set objects {}
+ set i 0
+ foreach {s local_options} $args {
+ if { [gdb_compile "${srcdir}/${subdir}/${s}" "${binfile}${i}.o" object $local_options] != "" } {
+ untested $testname
+ return -1
+ }
+ lappend objects "${binfile}${i}.o"
+ incr i
+ }
+ set ret [$func $objects "${binfile}" executable $options]
+ }
+ if { $ret != "" } {
+ untested $testname
+ return -1
+ }
+
return 0
}
Index: gdb-7.6/gdb/testsuite/lib/prelink-support.exp
===================================================================
--- gdb-7.6.orig/gdb/testsuite/lib/prelink-support.exp 2013-05-19 16:05:37.881840646 +0200
+++ gdb-7.6/gdb/testsuite/lib/prelink-support.exp 2013-05-19 16:05:39.100839980 +0200
@@ -95,8 +95,9 @@ proc file_copy {src dest} {
# Wrap function build_executable so that the resulting executable is fully
# self-sufficient (without dependencies on system libraries). Parameter
# INTERP may be used to specify a loader (ld.so) to be used that is
-# different from the default system one. Libraries on which the executable
-# depends are copied into directory DIR. Default DIR value to
+# different from the default system one. INTERP can be set to "no" if no ld.so
+# copy should be made. Libraries on which the executable depends are copied
+# into directory DIR. Default DIR value to
# `${objdir}/${subdir}/${EXECUTABLE}.d'.
#
# In case of success, return a string containing the arguments to be used
@@ -151,8 +152,15 @@ proc build_executable_own_libs {testname
if {$interp == ""} {
set interp_system [section_get $binfile .interp]
- set interp ${dir}/[file tail $interp_system]
- file_copy $interp_system $interp
+ if {$interp_system == ""} {
+ fail "$test could not find .interp"
+ } else {
+ set interp ${dir}/[file tail $interp_system]
+ file_copy $interp_system $interp
+ }
+ }
+ if {$interp == "no"} {
+ set interp ""
}
set dests {}
@@ -164,13 +172,19 @@ proc build_executable_own_libs {testname
# Do not lappend it so that "-rpath $dir" overrides any possible "-rpath"s
# specified by the caller to be able to link it for ldd" above.
- set options [linsert $options 0 "ldflags=-Wl,--dynamic-linker,$interp,-rpath,$dir"]
+ set options [linsert $options 0 "ldflags=-Wl,-rpath,$dir"]
+ if {$interp != ""} {
+ set options [linsert $options 0 "ldflags=-Wl,--dynamic-linker,$interp"]
+ }
if {[build_executable $testname $executable $sources $options] == -1} {
return ""
}
- set prelink_args "--dynamic-linker=$interp --ld-library-path=$dir $binfile $interp [concat $dests]"
+ set prelink_args "--ld-library-path=$dir $binfile [concat $dests]"
+ if {$interp != ""} {
+ set prelink_args "--dynamic-linker=$interp $prelink_args $interp"
+ }
return $prelink_args
}
* gdb.mi/mi-cmd-param-changed.exp (test_command_param_changed):
Index: gdb-7.6/gdb/testsuite/gdb.base/break-interp.exp Index: gdb-7.6/gdb/testsuite/gdb.base/break-interp.exp
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/testsuite/gdb.base/break-interp.exp 2013-05-19 16:05:37.882840646 +0200 --- gdb-7.6.orig/gdb/testsuite/gdb.base/break-interp.exp 2013-06-10 14:29:24.815123941 +0200
+++ gdb-7.6/gdb/testsuite/gdb.base/break-interp.exp 2013-05-19 16:05:39.101839979 +0200 +++ gdb-7.6/gdb/testsuite/gdb.base/break-interp.exp 2013-06-10 14:30:18.086102375 +0200
@@ -109,12 +109,19 @@ proc strip_debug {dest} { @@ -109,12 +109,19 @@ proc strip_debug {dest} {
} }
} }
@ -255,12 +121,146 @@ Index: gdb-7.6/gdb/testsuite/gdb.base/break-interp.exp
# Use two separate gdb_test_multiple statements to avoid timeouts due # Use two separate gdb_test_multiple statements to avoid timeouts due
# to slow processing of wildcard capturing long output # to slow processing of wildcard capturing long output
Index: gdb-7.6/gdb/testsuite/gdb.base/solib-corrupted.exp
===================================================================
--- gdb-7.6.orig/gdb/testsuite/gdb.base/solib-corrupted.exp 2013-06-10 14:29:24.816123941 +0200
+++ gdb-7.6/gdb/testsuite/gdb.base/solib-corrupted.exp 2013-06-10 14:30:18.086102375 +0200
@@ -36,6 +36,33 @@ if ![runto_main] {
return
}
+# With probes interface GDB no longer scans the inferior library list so its
+# corruption cannot be tested. There is no way to disable the probes
+# interface.
+
+set probes { init_start init_complete map_start reloc_complete unmap_start
+ unmap_complete }
+set test "info probes"
+gdb_test_multiple $test $test {
+ -re "^rtld\[ \t\]+(?:rtld_)?(\[a-z_\]+)\[ \t\]" {
+ set idx [lsearch -exact $probes $expect_out(1,string)]
+ if { $idx >= 0 } {
+ set probes [lreplace $probes $idx $idx]
+ }
+ exp_continue
+ }
+ -re "^\[^\r\n\]*\r\n" {
+ exp_continue
+ }
+ -re "^$gdb_prompt $" {
+ }
+}
+if { [llength $probes] == 0 } {
+ xfail $test
+ untested "GDB is using probes"
+ return
+}
+
gdb_test "info sharedlibrary" "From * To .*" "normal list"
# GDB checks there for matching L_PREV.
Index: gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread-lib.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread-lib.c 2013-06-10 14:30:18.086102375 +0200
@@ -0,0 +1,40 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2011-2013 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 <pthread.h>
+#include <assert.h>
+
+static void *
+tfunc (void *arg)
+{
+ void (*notifyp) (void) = arg;
+
+ notifyp ();
+}
+
+void
+f (void (*notifyp) (void))
+{
+ pthread_t t;
+ int i;
+
+ i = pthread_create (&t, NULL, tfunc, notifyp);
+ assert (i == 0);
+
+ i = pthread_join (t, NULL);
+ assert (i == 0);
+}
Index: gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread.c 2013-06-10 14:30:18.087102375 +0200
@@ -0,0 +1,46 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2011-2013 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 <dlfcn.h>
+#include <stddef.h>
+#include <assert.h>
+
+static const char *volatile filename;
+
+static void
+notify (void)
+{
+ filename = NULL; /* notify-here */
+}
+
+int
+main (void)
+{
+ void *h;
+ void (*fp) (void (*) (void));
+
+ assert (filename != NULL);
+ h = dlopen (filename, RTLD_LAZY);
+ assert (h != NULL);
+
+ fp = dlsym (h, "f");
+ assert (fp != NULL);
+
+ fp (notify);
+
+ return 0;
+}
Index: gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread.exp Index: gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread.exp
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread.exp 2013-05-19 16:05:39.101839979 +0200 +++ gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread.exp 2013-06-10 14:30:18.087102375 +0200
@@ -0,0 +1,74 @@ @@ -0,0 +1,74 @@
+# Copyright 2011 Free Software Foundation, Inc. +# Copyright 2011-2013 Free Software Foundation, Inc.
+# +#
+# This program is free software; you can redistribute it and/or modify +# 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 +# it under the terms of the GNU General Public License as published by
@ -334,137 +334,129 @@ Index: gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread.exp
+gdb_continue_to_breakpoint "notify" ".* notify-here .*" +gdb_continue_to_breakpoint "notify" ".* notify-here .*"
+ +
+gdb_test "info sharedlibrary" {/libpthread\.so.*} "libpthread.so found" +gdb_test "info sharedlibrary" {/libpthread\.so.*} "libpthread.so found"
Index: gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread.c Index: gdb-7.6/gdb/testsuite/lib/gdb.exp
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- gdb-7.6.orig/gdb/testsuite/lib/gdb.exp 2013-06-10 14:29:24.819123940 +0200
+++ gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread.c 2013-05-19 16:05:39.101839979 +0200 +++ gdb-7.6/gdb/testsuite/lib/gdb.exp 2013-06-10 14:30:44.654092140 +0200
@@ -0,0 +1,46 @@ @@ -4011,22 +4011,6 @@ proc build_executable_from_specs {testna
+/* This testcase is part of GDB, the GNU debugger.
set binfile [standard_output_file $executable]
- set objects {}
- set i 0
- foreach {s local_options} $args {
- if { [gdb_compile "${srcdir}/${subdir}/${s}" "${binfile}${i}.o" object $local_options] != "" } {
- untested $testname
- return -1
- }
- lappend objects "${binfile}${i}.o"
- incr i
- }
-
- if { [gdb_compile $objects "${binfile}" executable $options] != "" } {
- untested $testname
- return -1
- }
-
set info_options ""
if { [lsearch -exact $options "c++"] >= 0 } {
set info_options "c++"
@@ -4034,6 +4018,42 @@ proc build_executable_from_specs {testna
if [get_compiler_info ${info_options}] {
return -1
}
+ +
+ Copyright 2011 Free Software Foundation, Inc. + set binfile [standard_output_file $executable]
+ +
+ This program is free software; you can redistribute it and/or modify + set func gdb_compile
+ it under the terms of the GNU General Public License as published by + set func_index [lsearch -regexp $options {^(pthreads|shlib|shlib_pthreads)$}]
+ the Free Software Foundation; either version 3 of the License, or + if {$func_index != -1} {
+ (at your option) any later version. + set func "${func}_[lindex $options $func_index]"
+
+ 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 <dlfcn.h>
+#include <stddef.h>
+#include <assert.h>
+
+static const char *volatile filename;
+
+static void
+notify (void)
+{
+ filename = NULL; /* notify-here */
+ } + }
+ +
+int + # gdb_compile_shlib and gdb_compile_shlib_pthreads do not use the 3rd
+main (void) + # parameter. They also requires $sources while gdb_compile and
+{ + # gdb_compile_pthreads require $objects. Moreover they ignore any options.
+ void *h; + if [string match gdb_compile_shlib* $func] {
+ void (*fp) (void (*) (void)); + set sources_path {}
+ + foreach {s local_options} $args {
+ assert (filename != NULL); + lappend sources_path "${srcdir}/${subdir}/${s}"
+ h = dlopen (filename, RTLD_LAZY);
+ assert (h != NULL);
+
+ fp = dlsym (h, "f");
+ assert (fp != NULL);
+
+ fp (notify);
+
+ return 0;
+ } + }
Index: gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread-lib.c + set ret [$func $sources_path "${binfile}" $options]
=================================================================== + } else {
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 + set objects {}
+++ gdb-7.6/gdb/testsuite/gdb.threads/dlopen-libpthread-lib.c 2013-05-19 16:05:39.101839979 +0200 + set i 0
@@ -0,0 +1,40 @@ + foreach {s local_options} $args {
+/* This testcase is part of GDB, the GNU debugger. + if { [gdb_compile "${srcdir}/${subdir}/${s}" "${binfile}${i}.o" object $local_options] != "" } {
+ + untested $testname
+ Copyright 2011 Free Software Foundation, Inc. + return -1
+ + }
+ This program is free software; you can redistribute it and/or modify + lappend objects "${binfile}${i}.o"
+ it under the terms of the GNU General Public License as published by + incr i
+ the Free Software Foundation; either version 3 of the License, or + }
+ (at your option) any later version. + set ret [$func $objects "${binfile}" executable $options]
+ + }
+ This program is distributed in the hope that it will be useful, + if { $ret != "" } {
+ but WITHOUT ANY WARRANTY; without even the implied warranty of + untested $testname
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + return -1
+ 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 <pthread.h>
+#include <assert.h>
+
+static void *
+tfunc (void *arg)
+{
+ void (*notifyp) (void) = arg;
+
+ notifyp ();
+ } + }
+ +
+void return 0
+f (void (*notifyp) (void))
+{
+ pthread_t t;
+ int i;
+
+ i = pthread_create (&t, NULL, tfunc, notifyp);
+ assert (i == 0);
+
+ i = pthread_join (t, NULL);
+ assert (i == 0);
+}
Index: gdb-7.6/gdb/testsuite/gdb.base/solib-corrupted.exp
===================================================================
--- gdb-7.6.orig/gdb/testsuite/gdb.base/solib-corrupted.exp 2013-05-19 16:05:37.883840645 +0200
+++ gdb-7.6/gdb/testsuite/gdb.base/solib-corrupted.exp 2013-05-19 16:05:39.102839978 +0200
@@ -36,6 +36,33 @@ if ![runto_main] {
return
} }
+# With probes interface GDB no longer scans the inferior library list so its Index: gdb-7.6/gdb/testsuite/lib/prelink-support.exp
+# corruption cannot be tested. There is no way to disable the probes ===================================================================
+# interface. --- gdb-7.6.orig/gdb/testsuite/lib/prelink-support.exp 2013-06-10 14:29:24.819123940 +0200
+ +++ gdb-7.6/gdb/testsuite/lib/prelink-support.exp 2013-06-10 14:30:18.089102374 +0200
+set probes { init_start init_complete map_start reloc_complete unmap_start @@ -95,8 +95,9 @@ proc file_copy {src dest} {
+ unmap_complete } # Wrap function build_executable so that the resulting executable is fully
+set test "info probes" # self-sufficient (without dependencies on system libraries). Parameter
+gdb_test_multiple $test $test { # INTERP may be used to specify a loader (ld.so) to be used that is
+ -re "^rtld\[ \t\]+(?:rtld_)?(\[a-z_\]+)\[ \t\]" { -# different from the default system one. Libraries on which the executable
+ set idx [lsearch -exact $probes $expect_out(1,string)] -# depends are copied into directory DIR. Default DIR value to
+ if { $idx >= 0 } { +# different from the default system one. INTERP can be set to "no" if no ld.so
+ set probes [lreplace $probes $idx $idx] +# copy should be made. Libraries on which the executable depends are copied
+ } +# into directory DIR. Default DIR value to
+ exp_continue # `${objdir}/${subdir}/${EXECUTABLE}.d'.
+ } #
+ -re "^\[^\r\n\]*\r\n" { # In case of success, return a string containing the arguments to be used
+ exp_continue @@ -151,8 +152,15 @@ proc build_executable_own_libs {testname
+ }
+ -re "^$gdb_prompt $" { if {$interp == ""} {
+ } set interp_system [section_get $binfile .interp]
+} - set interp ${dir}/[file tail $interp_system]
+if { [llength $probes] == 0 } { - file_copy $interp_system $interp
+ xfail $test + if {$interp_system == ""} {
+ untested "GDB is using probes" + fail "$test could not find .interp"
+ return + } else {
+} + set interp ${dir}/[file tail $interp_system]
+ + file_copy $interp_system $interp
gdb_test "info sharedlibrary" "From * To .*" "normal list" + }
+ }
+ if {$interp == "no"} {
+ set interp ""
}
set dests {}
@@ -164,13 +172,19 @@ proc build_executable_own_libs {testname
# Do not lappend it so that "-rpath $dir" overrides any possible "-rpath"s
# specified by the caller to be able to link it for ldd" above.
- set options [linsert $options 0 "ldflags=-Wl,--dynamic-linker,$interp,-rpath,$dir"]
+ set options [linsert $options 0 "ldflags=-Wl,-rpath,$dir"]
+ if {$interp != ""} {
+ set options [linsert $options 0 "ldflags=-Wl,--dynamic-linker,$interp"]
+ }
if {[build_executable $testname $executable $sources $options] == -1} {
return ""
}
- set prelink_args "--dynamic-linker=$interp --ld-library-path=$dir $binfile $interp [concat $dests]"
+ set prelink_args "--ld-library-path=$dir $binfile [concat $dests]"
+ if {$interp != ""} {
+ set prelink_args "--dynamic-linker=$interp $prelink_args $interp"
+ }
return $prelink_args
}
# GDB checks there for matching L_PREV.

View File

@ -1,34 +1,83 @@
http://sourceware.org/ml/gdb-patches/2013-05/msg00630.html http://sourceware.org/ml/gdb-cvs/2013-06/msg00020.html
Subject: [RFA 7/7] Linker-debugger interface tests
### src/gdb/testsuite/ChangeLog 2013/06/04 13:23:31 1.3683
### src/gdb/testsuite/ChangeLog 2013/06/04 13:31:00 1.3684
## -1,3 +1,13 @@
+2013-06-04 Gary Benson <gbenson@redhat.com>
+
+ * gdb.base/break-probes.exp: New file.
+ * gdb.base/break-probes.c: Likewise.
+ * gdb.base/break-probes-solib.c: Likewise.
+ * gdb.base/info-shared.exp: New file.
+ * gdb.base/info-shared.c: Likewise.
+ * gdb.base/info-shared-solib1.c: Likewise.
+ * gdb.base/info-shared-solib2.c: Likewise.
+
2013-06-04 Jan Kratochvil <jan.kratochvil@redhat.com>
Gary Benson <gbenson@redhat.com>
--DCA/C9WSnDtl50zu --- src/gdb/testsuite/gdb.base/break-probes-solib.c
Content-Type: text/plain; charset=us-ascii +++ src/gdb/testsuite/gdb.base/break-probes-solib.c 2013-06-10 12:15:11.548935413 +0000
Content-Disposition: inline @@ -0,0 +1,22 @@
+/* Copyright 2012-2013 Free Software Foundation, Inc.
This patch adds some testcases for the linker-debugger interface. +
+ This program is free software; you can redistribute it and/or modify
--DCA/C9WSnDtl50zu + it under the terms of the GNU General Public License as published by
Content-Type: text/plain; charset=us-ascii + the Free Software Foundation; either version 3 of the License, or
Content-Disposition: attachment; filename="rtld-probes-7-tests-gb.patch" + (at your option) any later version.
+
2013-05-16 Gary Benson <gbenson@redhat.com> + This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
* gdb.base/break-probes.exp: New file. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* gdb.base/break-probes.c: Likewise. + GNU General Public License for more details.
* gdb.base/break-probes-solib.c: Likewise. +
* gdb.base/info-shared.exp: New file. + You should have received a copy of the GNU General Public License
* gdb.base/info-shared.c: Likewise. + along with this program. If not, see <http://www.gnu.org/licenses/>. */
* gdb.base/info-shared-solib1.c: Likewise. +
* gdb.base/info-shared-solib2.c: Likewise. +#include <stdio.h>
+
diff --git a/gdb/testsuite/gdb.base/break-probes.exp b/gdb/testsuite/gdb.base/break-probes.exp +int
new file mode 100644 +foo (int n)
index 0000000..8372636 +{
--- /dev/null + return n * n / 17;
+++ b/gdb/testsuite/gdb.base/break-probes.exp +}
@@ -0,0 +1,77 @@ --- src/gdb/testsuite/gdb.base/break-probes.c
+# Copyright 2013 Free Software Foundation, Inc. +++ src/gdb/testsuite/gdb.base/break-probes.c 2013-06-10 12:15:12.047717383 +0000
@@ -0,0 +1,30 @@
+/* Copyright 2012-2013 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 <dlfcn.h>
+#include <assert.h>
+#include <stddef.h>
+
+int
+main (void)
+{
+ void *handle = dlopen (SHLIB_NAME, RTLD_LAZY);
+
+ assert (handle != NULL);
+
+ dlclose (handle);
+
+ return 0;
+}
--- src/gdb/testsuite/gdb.base/break-probes.exp
+++ src/gdb/testsuite/gdb.base/break-probes.exp 2013-06-10 12:15:12.620368040 +0000
@@ -0,0 +1,78 @@
+# Copyright 2012-2013 Free Software Foundation, Inc.
+ +
+# This program is free software; you can redistribute it and/or modify +# 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 +# it under the terms of the GNU General Public License as published by
@ -63,7 +112,7 @@ index 0000000..8372636
+} +}
+ +
+if { [prepare_for_testing $testfile.exp $testfile $srcfile \ +if { [prepare_for_testing $testfile.exp $testfile $srcfile \
+ [list additional_flags=-DSHLIB_NAME\=\"$binfile_lib\" libs=-ldl]] } { + [list additional_flags=-DSHLIB_NAME=\"$binfile_lib\" libs=-ldl]] } {
+ return -1 + return -1
+} +}
+ +
@ -79,7 +128,7 @@ index 0000000..8372636
+set using_probes 0 +set using_probes 0
+gdb_test_multiple "bt" $test { +gdb_test_multiple "bt" $test {
+ -re "#0 +\[^\r\n\]*\\m(__GI_)?$normal_bp\\M.*$gdb_prompt $" { + -re "#0 +\[^\r\n\]*\\m(__GI_)?$normal_bp\\M.*$gdb_prompt $" {
+ xfail $test + untested "probes not present on this system"
+ } + }
+ -re "#0 +\[^\r\n\]*\\m(__GI_)?$probes_bp\\M.*$gdb_prompt $" { + -re "#0 +\[^\r\n\]*\\m(__GI_)?$probes_bp\\M.*$gdb_prompt $" {
+ pass $test + pass $test
@ -90,14 +139,15 @@ index 0000000..8372636
+if { $using_probes } { +if { $using_probes } {
+ # Run til it loads our library + # Run til it loads our library
+ set test "run til our library loads" + set test "run til our library loads"
+ set loaded_library 0 + set not_loaded_library 1
+ while { !$loaded_library } { + while { $not_loaded_library } {
+ set not_loaded_library 0
+ gdb_test_multiple "c" $test { + gdb_test_multiple "c" $test {
+ -re "Inferior loaded $binfile_lib\\M.*$gdb_prompt $" { + -re "Inferior loaded $binfile_lib\\M.*$gdb_prompt $" {
+ pass $test + pass $test
+ set loaded_library 1
+ } + }
+ -re "Stopped due to shared library event\\M.*$gdb_prompt $" { + -re "Stopped due to shared library event\\M.*$gdb_prompt $" {
+ set not_loaded_library 1
+ } + }
+ } + }
+ } + }
@ -105,45 +155,10 @@ index 0000000..8372636
+ # Call something to ensure that relocation occurred + # Call something to ensure that relocation occurred
+ gdb_test "call foo(23)" "\\\$.* = 31.*\\\M.*" + gdb_test "call foo(23)" "\\\$.* = 31.*\\\M.*"
+} +}
diff --git a/gdb/testsuite/gdb.base/break-probes.c b/gdb/testsuite/gdb.base/break-probes.c --- src/gdb/testsuite/gdb.base/info-shared-solib1.c
new file mode 100644 +++ src/gdb/testsuite/gdb.base/info-shared-solib1.c 2013-06-10 12:15:14.399129288 +0000
index 0000000..a778099 @@ -0,0 +1,24 @@
--- /dev/null +/* Copyright 2012-2013 Free Software Foundation, Inc.
+++ b/gdb/testsuite/gdb.base/break-probes.c
@@ -0,0 +1,26 @@
+/* Copyright 2013 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 <dlfcn.h>
+
+int
+main ()
+{
+ void *handle = dlopen (SHLIB_NAME, RTLD_LAZY);
+
+ dlclose (handle);
+
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.base/break-probes-solib.c b/gdb/testsuite/gdb.base/break-probes-solib.c
new file mode 100644
index 0000000..bdde2db
--- /dev/null
+++ b/gdb/testsuite/gdb.base/break-probes-solib.c
@@ -0,0 +1,22 @@
+/* Copyright 2013 Free Software Foundation, Inc.
+ +
+ This program is free software; you can redistribute it and/or modify + 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 + it under the terms of the GNU General Public License as published by
@ -163,15 +178,96 @@ index 0000000..bdde2db
+int +int
+foo (int n) +foo (int n)
+{ +{
+ return n * n / 17; + printf ("foo %d\n", n);
+
+ return 0;
+} +}
diff --git a/gdb/testsuite/gdb.base/info-shared.exp b/gdb/testsuite/gdb.base/info-shared.exp --- src/gdb/testsuite/gdb.base/info-shared-solib2.c
new file mode 100644 +++ src/gdb/testsuite/gdb.base/info-shared-solib2.c 2013-06-10 12:15:14.930135742 +0000
index 0000000..1dabb9f @@ -0,0 +1,24 @@
--- /dev/null +/* Copyright 2012-2013 Free Software Foundation, Inc.
+++ b/gdb/testsuite/gdb.base/info-shared.exp +
@@ -0,0 +1,145 @@ + This program is free software; you can redistribute it and/or modify
+# Copyright 2013 Free Software Foundation, Inc. + 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 <stdio.h>
+
+int
+bar (int n)
+{
+ printf ("bar %d\n", n);
+
+ return 0;
+}
--- src/gdb/testsuite/gdb.base/info-shared.c
+++ src/gdb/testsuite/gdb.base/info-shared.c 2013-06-10 12:15:15.395474819 +0000
@@ -0,0 +1,52 @@
+/* Copyright 2012-2013 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 <dlfcn.h>
+#include <assert.h>
+#include <stddef.h>
+
+void
+stop (void)
+{
+}
+
+int
+main (void)
+{
+ void *handle1, *handle2;
+ void (*func)(int);
+
+ handle1 = dlopen (SHLIB1_NAME, RTLD_LAZY);
+ assert (handle1 != NULL);
+ stop ();
+
+ handle2 = dlopen (SHLIB2_NAME, RTLD_LAZY);
+ assert (handle2 != NULL);
+ stop ();
+
+ func = (void (*)(int)) dlsym (handle1, "foo");
+ func (1);
+
+ func = (void (*)(int)) dlsym (handle2, "bar");
+ func (2);
+
+ dlclose (handle1);
+ stop ();
+
+ dlclose (handle2);
+ stop ();
+
+ return 0;
+}
--- src/gdb/testsuite/gdb.base/info-shared.exp
+++ src/gdb/testsuite/gdb.base/info-shared.exp 2013-06-10 12:15:15.891450285 +0000
@@ -0,0 +1,146 @@
+# Copyright 2012-2013 Free Software Foundation, Inc.
+ +
+# This program is free software; you can redistribute it and/or modify +# 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 +# it under the terms of the GNU General Public License as published by
@ -195,12 +291,12 @@ index 0000000..1dabb9f
+set lib1name $testfile-solib1 +set lib1name $testfile-solib1
+set srcfile_lib1 $srcdir/$subdir/$lib1name.c +set srcfile_lib1 $srcdir/$subdir/$lib1name.c
+set binfile_lib1 [standard_output_file $lib1name.so] +set binfile_lib1 [standard_output_file $lib1name.so]
+set define1 -DSHLIB1_NAME\=\"$binfile_lib1\" +set define1 -DSHLIB1_NAME=\"$binfile_lib1\"
+ +
+set lib2name $testfile-solib2 +set lib2name $testfile-solib2
+set srcfile_lib2 $srcdir/$subdir/$lib2name.c +set srcfile_lib2 $srcdir/$subdir/$lib2name.c
+set binfile_lib2 [standard_output_file $lib2name.so] +set binfile_lib2 [standard_output_file $lib2name.so]
+set define2 -DSHLIB2_NAME\=\"$binfile_lib2\" +set define2 -DSHLIB2_NAME=\"$binfile_lib2\"
+ +
+if { [gdb_compile_shlib $srcfile_lib1 $binfile_lib1 \ +if { [gdb_compile_shlib $srcfile_lib1 $binfile_lib1 \
+ [list additional_flags=-fPIC]] != "" } { + [list additional_flags=-fPIC]] != "" } {
@ -251,28 +347,29 @@ index 0000000..1dabb9f
+ +
+# Start the inferior, and check neither of the libraries are loaded at +# Start the inferior, and check neither of the libraries are loaded at
+# the start. +# the start.
+runto_main +if ![runto_main] {
+ return 0
+}
+check_info_shared "info sharedlibrary #1" 0 0 +check_info_shared "info sharedlibrary #1" 0 0
+ +
+# Set up breakpoints. +# Set up breakpoints.
+gdb_test "break stop" {Breakpoint [0-9]+ at .*} +gdb_breakpoint "stop"
+gdb_test_no_output "set breakpoint pending on" +gdb_breakpoint "foo" allow-pending
+gdb_test "break foo" {Breakpoint [0-9]+ \(foo\) pending\.} +gdb_breakpoint "bar" allow-pending
+gdb_test "break bar" {Breakpoint [0-9]+ \(bar\) pending\.}
+ +
+# Run to the first stop and check that only the first library is loaded. +# Run to the first stop and check that only the first library is loaded.
+gdb_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +gdb_continue_to_breakpoint "library load #1" "stop .*"
+check_info_shared "info sharedlibrary #2" 1 0 +check_info_shared "info sharedlibrary #2" 1 0
+ +
+# Run to the second stop and check that both libraries are loaded. +# Run to the second stop and check that both libraries are loaded.
+gdb_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +gdb_continue_to_breakpoint "library load #2" "stop .*"
+check_info_shared "info sharedlibrary #3" 1 1 +check_info_shared "info sharedlibrary #3" 1 1
+ +
+# Check that the next stop is in foo. +# Check that the next stop is in foo.
+gdb_test "c" {Breakpoint [0-9]+, .* in foo \(\) from .*} +gdb_continue_to_breakpoint "library function #1" "foo .*"
+ +
+# Check that the next stop is in bar. +# Check that the next stop is in bar.
+gdb_test "c" {Breakpoint [0-9]+, .* in bar \(\) from .*} +gdb_continue_to_breakpoint "library function #2" "bar .*"
+ +
+# Restart the inferior and make sure there are no breakpoint reset +# Restart the inferior and make sure there are no breakpoint reset
+# errors. These can happen with the probes-based runtime linker +# errors. These can happen with the probes-based runtime linker
@ -280,7 +377,7 @@ index 0000000..1dabb9f
+set test "restart" +set test "restart"
+gdb_run_cmd +gdb_run_cmd
+gdb_test_multiple "" $test { +gdb_test_multiple "" $test {
+ -re {Start it from the beginning\? \(y or n\) } { + -re {Start it from the beginning\? \(y or n\) $} {
+ send_gdb "y\n" + send_gdb "y\n"
+ exp_continue + exp_continue
+ } + }
@ -296,140 +393,23 @@ index 0000000..1dabb9f
+check_info_shared "info sharedlibrary #4" 0 0 +check_info_shared "info sharedlibrary #4" 0 0
+ +
+# Run to the first stop and check that only the first library is loaded. +# Run to the first stop and check that only the first library is loaded.
+gdb_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +gdb_continue_to_breakpoint "library load #3" "stop .*"
+check_info_shared "info sharedlibrary #5" 1 0 +check_info_shared "info sharedlibrary #5" 1 0
+ +
+# Run to the second stop and check that both libraries are loaded. +# Run to the second stop and check that both libraries are loaded.
+gdb_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +gdb_continue_to_breakpoint "library load #4" "stop .*"
+check_info_shared "info sharedlibrary #6" 1 1 +check_info_shared "info sharedlibrary #6" 1 1
+ +
+# Check that the next stop is in foo. +# Check that the next stop is in foo.
+gdb_test "c" {Breakpoint [0-9]+, .* in foo \(\) from .*} +gdb_continue_to_breakpoint "library function #3" "foo .*"
+ +
+# Check that the next stop is in bar. +# Check that the next stop is in bar.
+gdb_test "c" {Breakpoint [0-9]+, .* in bar \(\) from .*} +gdb_continue_to_breakpoint "library function #4" "bar .*"
+ +
+# Run to the next stop and check that the first library has been unloaded. +# Run to the next stop and check that the first library has been unloaded.
+gdb_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +gdb_continue_to_breakpoint "library unload #1" "stop .*"
+check_info_shared "info sharedlibrary #7" 0 1 +check_info_shared "info sharedlibrary #7" 0 1
+ +
+# Run to the last stop and check that both libraries are gone. +# Run to the last stop and check that both libraries are gone.
+gdb_test "c" {Breakpoint [0-9]+, .* in stop \(\)} +gdb_continue_to_breakpoint "library unload #2" "stop .*"
+check_info_shared "info sharedlibrary #8" 0 0 +check_info_shared "info sharedlibrary #8" 0 0
diff --git a/gdb/testsuite/gdb.base/info-shared.c b/gdb/testsuite/gdb.base/info-shared.c
new file mode 100644
index 0000000..d699a11
--- /dev/null
+++ b/gdb/testsuite/gdb.base/info-shared.c
@@ -0,0 +1,48 @@
+/* Copyright 2013 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 <dlfcn.h>
+
+void
+stop ()
+{
+}
+
+int
+main ()
+{
+ void *handle1, *handle2;
+ void (*func)(int);
+
+ handle1 = dlopen (SHLIB1_NAME, RTLD_LAZY);
+ stop ();
+
+ handle2 = dlopen (SHLIB2_NAME, RTLD_LAZY);
+ stop ();
+
+ func = (void (*)(int)) dlsym (handle1, "foo");
+ func (1);
+
+ func = (void (*)(int)) dlsym (handle2, "bar");
+ func (2);
+
+ dlclose (handle1);
+ stop ();
+
+ dlclose (handle2);
+ stop ();
+
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.base/info-shared-solib1.c b/gdb/testsuite/gdb.base/info-shared-solib1.c
new file mode 100644
index 0000000..9979ee7
--- /dev/null
+++ b/gdb/testsuite/gdb.base/info-shared-solib1.c
@@ -0,0 +1,24 @@
+/* Copyright 2013 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 <stdio.h>
+
+int
+foo (int n)
+{
+ printf ("foo %d\n", n);
+
+ return 0;
+}
diff --git a/gdb/testsuite/gdb.base/info-shared-solib2.c b/gdb/testsuite/gdb.base/info-shared-solib2.c
new file mode 100644
index 0000000..d4ed1e6
--- /dev/null
+++ b/gdb/testsuite/gdb.base/info-shared-solib2.c
@@ -0,0 +1,24 @@
+/* Copyright 2013 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 <stdio.h>
+
+int
+bar (int n)
+{
+ printf ("bar %d\n", n);
+
+ return 0;
+}
--DCA/C9WSnDtl50zu--

View File

@ -1,62 +0,0 @@
--- gdb-7.6-x/gdb/solib-svr4.c 2013-05-19 16:04:36.838874595 +0200
+++ gdb-7.6/gdb/solib-svr4.c 2013-05-19 16:12:35.112514978 +0200
@@ -1078,7 +1078,6 @@ svr4_free_library_list (void *p_list)
static struct so_list *
svr4_copy_library_list (struct so_list *src)
{
- struct link_map_offsets *lmo = svr4_fetch_link_map_offsets ();
struct so_list *dst = NULL;
struct so_list **link = &dst;
@@ -1090,8 +1089,8 @@ svr4_copy_library_list (struct so_list *
memcpy (new, src, sizeof (struct so_list));
- new->lm_info = xmalloc (lmo->link_map_size);
- memcpy (new->lm_info, src->lm_info, lmo->link_map_size);
+ new->lm_info = xmalloc (sizeof (*new->lm_info));
+ memcpy (new->lm_info, src->lm_info, sizeof (*new->lm_info));
new->next = NULL;
*link = new;
@@ -1747,7 +1746,7 @@ solist_update_incremental (struct svr4_i
struct svr4_library_list library_list;
char annex[64];
- xsnprintf (annex, sizeof (annex), "start=%lx;prev=%lx", lm, prev_lm);
+ xsnprintf (annex, sizeof (annex), "start=%lx;prev=%lx", (unsigned long) lm, (unsigned long) prev_lm);
if (!svr4_current_sos_via_xfer_libraries (&library_list, annex))
return 0;
@@ -1813,7 +1812,10 @@ svr4_handle_solib_event (void)
goto error;
if (action == DO_NOTHING)
+{
+do_cleanups (old_chain);
return;
+}
/* EVALUATE_PROBE_ARGUMENT looks up symbols in the dynamic linker
using FIND_PC_SECTION. FIND_PC_SECTION is accelerated by a cache
--- gdb-7.6-x/gdb/testsuite/gdb.base/break-probes.exp 2013-05-19 16:06:19.452818090 +0200
+++ gdb-7.6/gdb/testsuite/gdb.base/break-probes.exp 2013-05-19 16:07:49.730770135 +0200
@@ -60,14 +60,15 @@ gdb_test_multiple "bt" $test {
if { $using_probes } {
# Run til it loads our library
set test "run til our library loads"
- set loaded_library 0
- while { !$loaded_library } {
+ set not_loaded_library 1
+ while { $not_loaded_library } {
+ set not_loaded_library 0
gdb_test_multiple "c" $test {
-re "Inferior loaded $binfile_lib\\M.*$gdb_prompt $" {
pass $test
- set loaded_library 1
}
-re "Stopped due to shared library event\\M.*$gdb_prompt $" {
+ set not_loaded_library 1
}
}
}

View File

@ -57,8 +57,8 @@ http://sourceware.org/ml/gdb-cvs/2013-05/msg00084.html
* symfile.c (syms_from_objfile_1): Delete args offsets, num_offsets. * symfile.c (syms_from_objfile_1): Delete args offsets, num_offsets.
Index: gdb-7.6/gdb/Makefile.in Index: gdb-7.6/gdb/Makefile.in
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/Makefile.in 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/Makefile.in 2013-06-10 14:31:02.704084663 +0200
+++ gdb-7.6/gdb/Makefile.in 2013-05-20 22:25:52.096165773 +0200 +++ gdb-7.6/gdb/Makefile.in 2013-06-10 14:31:08.351082443 +0200
@@ -284,6 +284,7 @@ SUBDIR_PYTHON_OBS = \ @@ -284,6 +284,7 @@ SUBDIR_PYTHON_OBS = \
py-exitedevent.o \ py-exitedevent.o \
py-finishbreakpoint.o \ py-finishbreakpoint.o \
@ -75,7 +75,7 @@ Index: gdb-7.6/gdb/Makefile.in
python/py-function.c \ python/py-function.c \
python/py-gdb-readline.c \ python/py-gdb-readline.c \
python/py-inferior.c \ python/py-inferior.c \
@@ -2135,6 +2137,10 @@ py-frame.o: $(srcdir)/python/py-frame.c @@ -2174,6 +2176,10 @@ py-frame.o: $(srcdir)/python/py-frame.c
$(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-frame.c $(COMPILE) $(PYTHON_CFLAGS) $(srcdir)/python/py-frame.c
$(POSTCOMPILE) $(POSTCOMPILE)
@ -88,8 +88,8 @@ Index: gdb-7.6/gdb/Makefile.in
$(POSTCOMPILE) $(POSTCOMPILE)
Index: gdb-7.6/gdb/NEWS Index: gdb-7.6/gdb/NEWS
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/NEWS 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/NEWS 2013-06-10 14:31:08.353082442 +0200
+++ gdb-7.6/gdb/NEWS 2013-05-20 22:25:52.097165772 +0200 +++ gdb-7.6/gdb/NEWS 2013-06-10 14:31:21.230077319 +0200
@@ -4,6 +4,10 @@ @@ -4,6 +4,10 @@
* Newly installed $prefix/bin/gcore acts as a shell interface for the * Newly installed $prefix/bin/gcore acts as a shell interface for the
GDB command gcore. GDB command gcore.
@ -98,13 +98,13 @@ Index: gdb-7.6/gdb/NEWS
+ +
+ ** Frame filters and frame decorators have been added. + ** Frame filters and frame decorators have been added.
+ +
*** Changes in GDB 7.6 * New remote packets
* Target record has been renamed to record-full. qXfer:libraries-svr4:read's annex
Index: gdb-7.6/gdb/stack.c Index: gdb-7.6/gdb/stack.c
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/stack.c 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/stack.c 2013-06-10 14:31:02.709084661 +0200
+++ gdb-7.6/gdb/stack.c 2013-05-20 22:25:52.098165772 +0200 +++ gdb-7.6/gdb/stack.c 2013-06-10 14:31:08.354082441 +0200
@@ -54,6 +54,7 @@ @@ -54,6 +54,7 @@
#include "psymtab.h" #include "psymtab.h"
@ -329,8 +329,8 @@ Index: gdb-7.6/gdb/stack.c
{ {
Index: gdb-7.6/gdb/data-directory/Makefile.in Index: gdb-7.6/gdb/data-directory/Makefile.in
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/data-directory/Makefile.in 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/data-directory/Makefile.in 2013-06-10 14:31:02.710084660 +0200
+++ gdb-7.6/gdb/data-directory/Makefile.in 2013-05-20 22:25:52.098165772 +0200 +++ gdb-7.6/gdb/data-directory/Makefile.in 2013-06-10 14:31:08.355082441 +0200
@@ -53,7 +53,11 @@ PYTHON_DIR = python @@ -53,7 +53,11 @@ PYTHON_DIR = python
PYTHON_INSTALL_DIR = $(DESTDIR)$(GDB_DATADIR)/$(PYTHON_DIR) PYTHON_INSTALL_DIR = $(DESTDIR)$(GDB_DATADIR)/$(PYTHON_DIR)
PYTHON_FILES = \ PYTHON_FILES = \
@ -345,9 +345,9 @@ Index: gdb-7.6/gdb/data-directory/Makefile.in
gdb/command/type_printers.py \ gdb/command/type_printers.py \
Index: gdb-7.6/gdb/doc/gdb.texinfo Index: gdb-7.6/gdb/doc/gdb.texinfo
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/doc/gdb.texinfo 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/doc/gdb.texinfo 2013-06-10 14:31:02.727084654 +0200
+++ gdb-7.6/gdb/doc/gdb.texinfo 2013-05-20 22:25:52.110165767 +0200 +++ gdb-7.6/gdb/doc/gdb.texinfo 2013-06-10 14:31:08.364082438 +0200
@@ -6453,6 +6453,7 @@ currently executing frame and describes @@ -6459,6 +6459,7 @@ currently executing frame and describes
@menu @menu
* Frames:: Stack frames * Frames:: Stack frames
* Backtrace:: Backtraces * Backtrace:: Backtraces
@ -355,7 +355,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
* Selection:: Selecting a frame * Selection:: Selecting a frame
* Frame Info:: Information on a frame * Frame Info:: Information on a frame
@@ -6540,6 +6541,7 @@ line per frame, for many frames, startin @@ -6546,6 +6547,7 @@ line per frame, for many frames, startin
frame (frame zero), followed by its caller (frame one), and on up the frame (frame zero), followed by its caller (frame one), and on up the
stack. stack.
@ -363,7 +363,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
@table @code @table @code
@kindex backtrace @kindex backtrace
@kindex bt @r{(@code{backtrace})} @kindex bt @r{(@code{backtrace})}
@@ -6565,6 +6567,19 @@ Similar, but print only the outermost @v @@ -6571,6 +6573,19 @@ Similar, but print only the outermost @v
@itemx bt full -@var{n} @itemx bt full -@var{n}
Print the values of the local variables also. @var{n} specifies the Print the values of the local variables also. @var{n} specifies the
number of frames to print, as described above. number of frames to print, as described above.
@ -383,7 +383,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
@end table @end table
@kindex where @kindex where
@@ -6714,6 +6729,149 @@ Display an absolute filename. @@ -6720,6 +6735,149 @@ Display an absolute filename.
Show the current way to display filenames. Show the current way to display filenames.
@end table @end table
@ -533,7 +533,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
@node Selection @node Selection
@section Selecting a Frame @section Selecting a Frame
@@ -23065,6 +23223,9 @@ situation, a Python @code{KeyboardInterr @@ -23100,6 +23258,9 @@ situation, a Python @code{KeyboardInterr
* Selecting Pretty-Printers:: How GDB chooses a pretty-printer. * Selecting Pretty-Printers:: How GDB chooses a pretty-printer.
* Writing a Pretty-Printer:: Writing a Pretty-Printer. * Writing a Pretty-Printer:: Writing a Pretty-Printer.
* Type Printing API:: Pretty-printing types. * Type Printing API:: Pretty-printing types.
@ -543,7 +543,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
* Inferiors In Python:: Python representation of inferiors (processes) * Inferiors In Python:: Python representation of inferiors (processes)
* Events In Python:: Listening for events from @value{GDBN}. * Events In Python:: Listening for events from @value{GDBN}.
* Threads In Python:: Accessing inferior threads from Python. * Threads In Python:: Accessing inferior threads from Python.
@@ -24415,6 +24576,636 @@ done then type printers would have to ma @@ -24450,6 +24611,636 @@ done then type printers would have to ma
order to avoid holding information that could become stale as the order to avoid holding information that could become stale as the
inferior changed. inferior changed.
@ -1180,7 +1180,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
@node Inferiors In Python @node Inferiors In Python
@subsubsection Inferiors In Python @subsubsection Inferiors In Python
@cindex inferiors in Python @cindex inferiors in Python
@@ -25245,6 +26036,11 @@ The @code{type_printers} attribute is a @@ -25280,6 +26071,11 @@ The @code{type_printers} attribute is a
@xref{Type Printing API}, for more information. @xref{Type Printing API}, for more information.
@end defvar @end defvar
@ -1192,7 +1192,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
@node Objfiles In Python @node Objfiles In Python
@subsubsection Objfiles In Python @subsubsection Objfiles In Python
@@ -25295,6 +26091,11 @@ The @code{type_printers} attribute is a @@ -25330,6 +26126,11 @@ The @code{type_printers} attribute is a
@xref{Type Printing API}, for more information. @xref{Type Printing API}, for more information.
@end defvar @end defvar
@ -1204,7 +1204,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
A @code{gdb.Objfile} object has the following methods: A @code{gdb.Objfile} object has the following methods:
@defun Objfile.is_valid () @defun Objfile.is_valid ()
@@ -26313,7 +27114,7 @@ No my-foo-pretty-printers.py @@ -26348,7 +27149,7 @@ No my-foo-pretty-printers.py
When reading an auto-loaded file, @value{GDBN} sets the When reading an auto-loaded file, @value{GDBN} sets the
@dfn{current objfile}. This is available via the @code{gdb.current_objfile} @dfn{current objfile}. This is available via the @code{gdb.current_objfile}
function (@pxref{Objfiles In Python}). This can be useful for function (@pxref{Objfiles In Python}). This can be useful for
@ -1213,7 +1213,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
@menu @menu
* objfile-gdb.py file:: The @file{@var{objfile}-gdb.py} file * objfile-gdb.py file:: The @file{@var{objfile}-gdb.py} file
@@ -30184,6 +30985,22 @@ Is this going away???? @@ -30219,6 +31020,22 @@ Is this going away????
@node GDB/MI Stack Manipulation @node GDB/MI Stack Manipulation
@section @sc{gdb/mi} Stack Manipulation Commands @section @sc{gdb/mi} Stack Manipulation Commands
@ -1236,7 +1236,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
@subheading The @code{-stack-info-frame} Command @subheading The @code{-stack-info-frame} Command
@findex -stack-info-frame @findex -stack-info-frame
@@ -30251,13 +31068,14 @@ For a stack with frame levels 0 through @@ -30286,13 +31103,14 @@ For a stack with frame levels 0 through
(gdb) (gdb)
@end smallexample @end smallexample
@ -1252,7 +1252,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
[ @var{low-frame} @var{high-frame} ] [ @var{low-frame} @var{high-frame} ]
@end smallexample @end smallexample
@@ -30274,7 +31092,9 @@ If @var{print-values} is 0 or @code{--no @@ -30309,7 +31127,9 @@ If @var{print-values} is 0 or @code{--no
the variables; if it is 1 or @code{--all-values}, print also their the variables; if it is 1 or @code{--all-values}, print also their
values; and if it is 2 or @code{--simple-values}, print the name, values; and if it is 2 or @code{--simple-values}, print the name,
type and value for simple data types, and the name and type for arrays, type and value for simple data types, and the name and type for arrays,
@ -1263,7 +1263,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
Use of this command to obtain arguments in a single frame is Use of this command to obtain arguments in a single frame is
deprecated in favor of the @samp{-stack-list-variables} command. deprecated in favor of the @samp{-stack-list-variables} command.
@@ -30345,13 +31165,14 @@ args=[@{name="intarg",value="2"@}, @@ -30380,13 +31200,14 @@ args=[@{name="intarg",value="2"@},
@c @subheading -stack-list-exception-handlers @c @subheading -stack-list-exception-handlers
@ -1279,7 +1279,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
@end smallexample @end smallexample
List the frames currently on the stack. For each frame it displays the List the frames currently on the stack. For each frame it displays the
@@ -30381,7 +31202,9 @@ levels are between the two arguments (in @@ -30416,7 +31237,9 @@ levels are between the two arguments (in
are equal, it shows the single frame at the corresponding level. It is are equal, it shows the single frame at the corresponding level. It is
an error if @var{low-frame} is larger than the actual number of an error if @var{low-frame} is larger than the actual number of
frames. On the other hand, @var{high-frame} may be larger than the frames. On the other hand, @var{high-frame} may be larger than the
@ -1290,7 +1290,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
@subsubheading @value{GDBN} Command @subsubheading @value{GDBN} Command
@@ -30451,11 +31274,12 @@ Show a single frame: @@ -30486,11 +31309,12 @@ Show a single frame:
@subheading The @code{-stack-list-locals} Command @subheading The @code{-stack-list-locals} Command
@findex -stack-list-locals @findex -stack-list-locals
@ -1304,7 +1304,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
@end smallexample @end smallexample
Display the local variable names for the selected frame. If Display the local variable names for the selected frame. If
@@ -30466,7 +31290,8 @@ type and value for simple data types, an @@ -30501,7 +31325,8 @@ type and value for simple data types, an
structures and unions. In this last case, a frontend can immediately structures and unions. In this last case, a frontend can immediately
display the value of simple data types and create variable objects for display the value of simple data types and create variable objects for
other data types when the user wishes to explore their values in other data types when the user wishes to explore their values in
@ -1314,7 +1314,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
This command is deprecated in favor of the This command is deprecated in favor of the
@samp{-stack-list-variables} command. @samp{-stack-list-variables} command.
@@ -30491,13 +31316,14 @@ This command is deprecated in favor of t @@ -30526,13 +31351,14 @@ This command is deprecated in favor of t
(gdb) (gdb)
@end smallexample @end smallexample
@ -1330,7 +1330,7 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
@end smallexample @end smallexample
Display the names of local variables and function arguments for the selected frame. If Display the names of local variables and function arguments for the selected frame. If
@@ -30505,7 +31331,8 @@ Display the names of local variables and @@ -30540,7 +31366,8 @@ Display the names of local variables and
the variables; if it is 1 or @code{--all-values}, print also their the variables; if it is 1 or @code{--all-values}, print also their
values; and if it is 2 or @code{--simple-values}, print the name, values; and if it is 2 or @code{--simple-values}, print the name,
type and value for simple data types, and the name and type for arrays, type and value for simple data types, and the name and type for arrays,
@ -1342,8 +1342,8 @@ Index: gdb-7.6/gdb/doc/gdb.texinfo
Index: gdb-7.6/gdb/mi/mi-cmd-stack.c Index: gdb-7.6/gdb/mi/mi-cmd-stack.c
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/mi/mi-cmd-stack.c 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/mi/mi-cmd-stack.c 2013-06-10 14:31:02.730084652 +0200
+++ gdb-7.6/gdb/mi/mi-cmd-stack.c 2013-05-20 22:25:52.111165767 +0200 +++ gdb-7.6/gdb/mi/mi-cmd-stack.c 2013-06-10 14:31:08.365082437 +0200
@@ -31,6 +31,10 @@ @@ -31,6 +31,10 @@
#include "language.h" #include "language.h"
#include "valprint.h" #include "valprint.h"
@ -1655,8 +1655,8 @@ Index: gdb-7.6/gdb/mi/mi-cmd-stack.c
/* Print single local or argument. ARG must be already read in. For /* Print single local or argument. ARG must be already read in. For
Index: gdb-7.6/gdb/mi/mi-cmds.c Index: gdb-7.6/gdb/mi/mi-cmds.c
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/mi/mi-cmds.c 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/mi/mi-cmds.c 2013-06-10 14:31:02.730084652 +0200
+++ gdb-7.6/gdb/mi/mi-cmds.c 2013-05-20 22:25:52.111165767 +0200 +++ gdb-7.6/gdb/mi/mi-cmds.c 2013-06-10 14:31:08.365082437 +0200
@@ -86,6 +86,7 @@ static struct mi_cmd mi_cmds[] = @@ -86,6 +86,7 @@ static struct mi_cmd mi_cmds[] =
mi_cmd_data_write_register_values), mi_cmd_data_write_register_values),
DEF_MI_CMD_MI ("enable-timings", mi_cmd_enable_timings), DEF_MI_CMD_MI ("enable-timings", mi_cmd_enable_timings),
@ -1667,8 +1667,8 @@ Index: gdb-7.6/gdb/mi/mi-cmds.c
DEF_MI_CMD_MI ("environment-path", mi_cmd_env_path), DEF_MI_CMD_MI ("environment-path", mi_cmd_env_path),
Index: gdb-7.6/gdb/mi/mi-cmds.h Index: gdb-7.6/gdb/mi/mi-cmds.h
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/mi/mi-cmds.h 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/mi/mi-cmds.h 2013-06-10 14:31:02.730084652 +0200
+++ gdb-7.6/gdb/mi/mi-cmds.h 2013-05-20 22:25:52.111165767 +0200 +++ gdb-7.6/gdb/mi/mi-cmds.h 2013-06-10 14:31:08.365082437 +0200
@@ -118,6 +118,7 @@ extern mi_cmd_argv_ftype mi_cmd_var_show @@ -118,6 +118,7 @@ extern mi_cmd_argv_ftype mi_cmd_var_show
extern mi_cmd_argv_ftype mi_cmd_var_show_format; extern mi_cmd_argv_ftype mi_cmd_var_show_format;
extern mi_cmd_argv_ftype mi_cmd_var_update; extern mi_cmd_argv_ftype mi_cmd_var_update;
@ -1680,7 +1680,7 @@ Index: gdb-7.6/gdb/mi/mi-cmds.h
Index: gdb-7.6/gdb/python/py-framefilter.c Index: gdb-7.6/gdb/python/py-framefilter.c
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/python/py-framefilter.c 2013-05-20 22:26:53.029143068 +0200 +++ gdb-7.6/gdb/python/py-framefilter.c 2013-06-10 14:31:08.366082437 +0200
@@ -0,0 +1,1528 @@ @@ -0,0 +1,1528 @@
+/* Python frame filters +/* Python frame filters
+ +
@ -3212,8 +3212,8 @@ Index: gdb-7.6/gdb/python/py-framefilter.c
+} +}
Index: gdb-7.6/gdb/python/py-objfile.c Index: gdb-7.6/gdb/python/py-objfile.c
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/python/py-objfile.c 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/python/py-objfile.c 2013-06-10 14:31:02.731084652 +0200
+++ gdb-7.6/gdb/python/py-objfile.c 2013-05-20 22:25:52.112165767 +0200 +++ gdb-7.6/gdb/python/py-objfile.c 2013-06-10 14:31:08.366082437 +0200
@@ -33,6 +33,8 @@ typedef struct @@ -33,6 +33,8 @@ typedef struct
/* The pretty-printer list of functions. */ /* The pretty-printer list of functions. */
PyObject *printers; PyObject *printers;
@ -3318,8 +3318,8 @@ Index: gdb-7.6/gdb/python/py-objfile.c
{ NULL } { NULL }
Index: gdb-7.6/gdb/python/py-progspace.c Index: gdb-7.6/gdb/python/py-progspace.c
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/python/py-progspace.c 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/python/py-progspace.c 2013-06-10 14:31:02.731084652 +0200
+++ gdb-7.6/gdb/python/py-progspace.c 2013-05-20 22:25:52.112165767 +0200 +++ gdb-7.6/gdb/python/py-progspace.c 2013-06-10 14:31:08.366082437 +0200
@@ -35,6 +35,8 @@ typedef struct @@ -35,6 +35,8 @@ typedef struct
/* The pretty-printer list of functions. */ /* The pretty-printer list of functions. */
PyObject *printers; PyObject *printers;
@ -3424,8 +3424,8 @@ Index: gdb-7.6/gdb/python/py-progspace.c
{ NULL } { NULL }
Index: gdb-7.6/gdb/python/py-utils.c Index: gdb-7.6/gdb/python/py-utils.c
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/python/py-utils.c 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/python/py-utils.c 2013-06-10 14:31:02.732084652 +0200
+++ gdb-7.6/gdb/python/py-utils.c 2013-05-20 22:25:52.113165766 +0200 +++ gdb-7.6/gdb/python/py-utils.c 2013-06-10 14:31:08.366082437 +0200
@@ -48,6 +48,28 @@ make_cleanup_py_decref (PyObject *py) @@ -48,6 +48,28 @@ make_cleanup_py_decref (PyObject *py)
return make_cleanup (py_decref, (void *) py); return make_cleanup (py_decref, (void *) py);
} }
@ -3457,8 +3457,8 @@ Index: gdb-7.6/gdb/python/py-utils.c
returns NULL with a python exception set. returns NULL with a python exception set.
Index: gdb-7.6/gdb/python/python-internal.h Index: gdb-7.6/gdb/python/python-internal.h
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/python/python-internal.h 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/python/python-internal.h 2013-06-10 14:31:02.732084652 +0200
+++ gdb-7.6/gdb/python/python-internal.h 2013-05-20 22:25:52.113165766 +0200 +++ gdb-7.6/gdb/python/python-internal.h 2013-06-10 14:31:08.367082436 +0200
@@ -251,9 +251,11 @@ PyObject *frame_info_to_frame_object (st @@ -251,9 +251,11 @@ PyObject *frame_info_to_frame_object (st
PyObject *pspace_to_pspace_object (struct program_space *); PyObject *pspace_to_pspace_object (struct program_space *);
@ -3481,8 +3481,8 @@ Index: gdb-7.6/gdb/python/python-internal.h
const struct language_defn *language); const struct language_defn *language);
Index: gdb-7.6/gdb/python/python.c Index: gdb-7.6/gdb/python/python.c
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/python/python.c 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/python/python.c 2013-06-10 14:31:02.732084652 +0200
+++ gdb-7.6/gdb/python/python.c 2013-05-20 22:25:52.113165766 +0200 +++ gdb-7.6/gdb/python/python.c 2013-06-10 14:31:08.367082436 +0200
@@ -1442,6 +1442,15 @@ free_type_printers (void *arg) @@ -1442,6 +1442,15 @@ free_type_printers (void *arg)
{ {
} }
@ -3501,8 +3501,8 @@ Index: gdb-7.6/gdb/python/python.c
Index: gdb-7.6/gdb/python/python.h Index: gdb-7.6/gdb/python/python.h
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/python/python.h 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/python/python.h 2013-06-10 14:31:02.732084652 +0200
+++ gdb-7.6/gdb/python/python.h 2013-05-20 22:25:52.113165766 +0200 +++ gdb-7.6/gdb/python/python.h 2013-06-10 14:31:08.367082436 +0200
@@ -21,6 +21,7 @@ @@ -21,6 +21,7 @@
#define GDB_PYTHON_H #define GDB_PYTHON_H
@ -3593,7 +3593,7 @@ Index: gdb-7.6/gdb/python/python.h
Index: gdb-7.6/gdb/python/lib/gdb/FrameDecorator.py Index: gdb-7.6/gdb/python/lib/gdb/FrameDecorator.py
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/python/lib/gdb/FrameDecorator.py 2013-05-20 22:25:52.113165766 +0200 +++ gdb-7.6/gdb/python/lib/gdb/FrameDecorator.py 2013-06-10 14:31:08.367082436 +0200
@@ -0,0 +1,285 @@ @@ -0,0 +1,285 @@
+# Copyright (C) 2013 Free Software Foundation, Inc. +# Copyright (C) 2013 Free Software Foundation, Inc.
+ +
@ -3883,7 +3883,7 @@ Index: gdb-7.6/gdb/python/lib/gdb/FrameDecorator.py
Index: gdb-7.6/gdb/python/lib/gdb/FrameIterator.py Index: gdb-7.6/gdb/python/lib/gdb/FrameIterator.py
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/python/lib/gdb/FrameIterator.py 2013-05-20 22:25:52.114165766 +0200 +++ gdb-7.6/gdb/python/lib/gdb/FrameIterator.py 2013-06-10 14:31:08.367082436 +0200
@@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
+# Copyright (C) 2013 Free Software Foundation, Inc. +# Copyright (C) 2013 Free Software Foundation, Inc.
+ +
@ -3933,7 +3933,7 @@ Index: gdb-7.6/gdb/python/lib/gdb/FrameIterator.py
Index: gdb-7.6/gdb/python/lib/gdb/frames.py Index: gdb-7.6/gdb/python/lib/gdb/frames.py
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/python/lib/gdb/frames.py 2013-05-20 22:25:52.114165766 +0200 +++ gdb-7.6/gdb/python/lib/gdb/frames.py 2013-06-10 14:31:08.368082436 +0200
@@ -0,0 +1,229 @@ @@ -0,0 +1,229 @@
+# Frame-filter commands. +# Frame-filter commands.
+# Copyright (C) 2013 Free Software Foundation, Inc. +# Copyright (C) 2013 Free Software Foundation, Inc.
@ -4166,8 +4166,8 @@ Index: gdb-7.6/gdb/python/lib/gdb/frames.py
+ return sliced + return sliced
Index: gdb-7.6/gdb/python/lib/gdb/__init__.py Index: gdb-7.6/gdb/python/lib/gdb/__init__.py
=================================================================== ===================================================================
--- gdb-7.6.orig/gdb/python/lib/gdb/__init__.py 2013-05-20 22:23:36.748215146 +0200 --- gdb-7.6.orig/gdb/python/lib/gdb/__init__.py 2013-06-10 14:31:02.733084651 +0200
+++ gdb-7.6/gdb/python/lib/gdb/__init__.py 2013-05-20 22:25:52.114165766 +0200 +++ gdb-7.6/gdb/python/lib/gdb/__init__.py 2013-06-10 14:31:08.368082436 +0200
@@ -67,6 +67,8 @@ pretty_printers = [] @@ -67,6 +67,8 @@ pretty_printers = []
# Initial type printers. # Initial type printers.
@ -4180,7 +4180,7 @@ Index: gdb-7.6/gdb/python/lib/gdb/__init__.py
Index: gdb-7.6/gdb/python/lib/gdb/command/frame_filters.py Index: gdb-7.6/gdb/python/lib/gdb/command/frame_filters.py
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/python/lib/gdb/command/frame_filters.py 2013-05-20 22:25:52.114165766 +0200 +++ gdb-7.6/gdb/python/lib/gdb/command/frame_filters.py 2013-06-10 14:31:08.368082436 +0200
@@ -0,0 +1,461 @@ @@ -0,0 +1,461 @@
+# Frame-filter commands. +# Frame-filter commands.
+# Copyright (C) 2013 Free Software Foundation, Inc. +# Copyright (C) 2013 Free Software Foundation, Inc.
@ -4646,7 +4646,7 @@ Index: gdb-7.6/gdb/python/lib/gdb/command/frame_filters.py
Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-gdb.py.in Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-gdb.py.in
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-gdb.py.in 2013-05-20 22:25:52.114165766 +0200 +++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-gdb.py.in 2013-06-10 14:31:08.368082436 +0200
@@ -0,0 +1,48 @@ @@ -0,0 +1,48 @@
+# Copyright (C) 2013 Free Software Foundation, Inc. +# Copyright (C) 2013 Free Software Foundation, Inc.
+ +
@ -4699,7 +4699,7 @@ Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-gdb.py.in
Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-mi.c Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-mi.c
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-mi.c 2013-05-20 22:25:52.114165766 +0200 +++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-mi.c 2013-06-10 14:31:08.368082436 +0200
@@ -0,0 +1,138 @@ @@ -0,0 +1,138 @@
+/* This testcase is part of GDB, the GNU debugger. +/* This testcase is part of GDB, the GNU debugger.
+ +
@ -4842,7 +4842,7 @@ Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-mi.c
Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-mi.exp Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-mi.exp
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-mi.exp 2013-05-20 22:25:52.115165766 +0200 +++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-mi.exp 2013-06-10 14:31:08.368082436 +0200
@@ -0,0 +1,179 @@ @@ -0,0 +1,179 @@
+# Copyright (C) 2013 Free Software Foundation, Inc. +# Copyright (C) 2013 Free Software Foundation, Inc.
+ +
@ -5026,7 +5026,7 @@ Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter-mi.exp
Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.c Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.c
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.c 2013-05-20 22:25:52.115165766 +0200 +++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.c 2013-06-10 14:31:08.369082436 +0200
@@ -0,0 +1,155 @@ @@ -0,0 +1,155 @@
+/* This testcase is part of GDB, the GNU debugger. +/* This testcase is part of GDB, the GNU debugger.
+ +
@ -5186,7 +5186,7 @@ Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.c
Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.exp Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.exp
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.exp 2013-05-20 22:25:52.115165766 +0200 +++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.exp 2013-06-10 14:31:08.369082436 +0200
@@ -0,0 +1,239 @@ @@ -0,0 +1,239 @@
+# Copyright (C) 2013 Free Software Foundation, Inc. +# Copyright (C) 2013 Free Software Foundation, Inc.
+ +
@ -5430,7 +5430,7 @@ Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.exp
Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.py Index: gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.py
=================================================================== ===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.py 2013-05-20 22:25:52.115165766 +0200 +++ gdb-7.6/gdb/testsuite/gdb.python/py-framefilter.py 2013-06-10 14:31:08.369082436 +0200
@@ -0,0 +1,117 @@ @@ -0,0 +1,117 @@
+# Copyright (C) 2013 Free Software Foundation, Inc. +# Copyright (C) 2013 Free Software Foundation, Inc.
+ +

View File

@ -36,7 +36,7 @@ Version: 7.6
# The release always contains a leading reserved number, start it at 1. # 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. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
Release: 31%{?dist} Release: 32%{?dist}
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and BSD and Public Domain
Group: Development/Debuggers Group: Development/Debuggers
@ -508,15 +508,16 @@ Patch579: gdb-7.2.50-sparc-add-workaround-to-broken-debug-files.patch
# Fix dlopen of libpthread.so, patched glibc required (Gary Benson, BZ 669432). # Fix dlopen of libpthread.so, patched glibc required (Gary Benson, BZ 669432).
# Fix crash regression from the dlopen of libpthread.so fix (BZ 911712). # Fix crash regression from the dlopen of libpthread.so fix (BZ 911712).
# Fix performance regression when inferior opens many libraries (Gary Benson). # Fix performance regression when inferior opens many libraries (Gary Benson).
#=push #=drop
Patch718: gdb-dlopen-stap-probe-1of7.patch Patch718: gdb-dlopen-stap-probe-1of9.patch
Patch719: gdb-dlopen-stap-probe-2of7.patch Patch719: gdb-dlopen-stap-probe-2of9.patch
Patch720: gdb-dlopen-stap-probe-3of7.patch Patch720: gdb-dlopen-stap-probe-3of9.patch
Patch721: gdb-dlopen-stap-probe-4of7.patch Patch721: gdb-dlopen-stap-probe-4of9.patch
Patch722: gdb-dlopen-stap-probe-5of7.patch Patch722: gdb-dlopen-stap-probe-5of9.patch
Patch723: gdb-dlopen-stap-probe-6of7.patch Patch723: gdb-dlopen-stap-probe-6of9.patch
Patch822: gdb-dlopen-stap-probe-7of7.patch Patch822: gdb-dlopen-stap-probe-7of9.patch
Patch827: gdb-dlopen-stap-probe-fixup.patch Patch827: gdb-dlopen-stap-probe-8of9.patch
Patch619: gdb-dlopen-stap-probe-9of9.patch
# Work around PR libc/13097 "linux-vdso.so.1" warning message. # Work around PR libc/13097 "linux-vdso.so.1" warning message.
#=push #=push
@ -570,11 +571,18 @@ Patch818: gdb-rhbz795424-bitpos-lazyvalue.patch
Patch832: gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch Patch832: gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch
# Fix gcore for vDSO (on ppc64). # Fix gcore for vDSO (on ppc64).
#=drop
Patch834: gdb-vdso-gcore.patch Patch834: gdb-vdso-gcore.patch
# Fix needless expansion of non-gdbindex symtabs (Doug Evans). # Fix needless expansion of non-gdbindex symtabs (Doug Evans).
#=drop
Patch835: gdb-psymtab-expand.patch Patch835: gdb-psymtab-expand.patch
# Fix C++ lookups performance regression (Doug Evans, BZ 972677).
#=drop
Patch838: gdb-cxx-performance-1of2.patch
Patch839: gdb-cxx-performance-2of2.patch
%if 0%{!?rhel:1} || 0%{?rhel} > 6 %if 0%{!?rhel:1} || 0%{?rhel} > 6
# RL_STATE_FEDORA_GDB would not be found for: # RL_STATE_FEDORA_GDB would not be found for:
# Patch642: gdb-readline62-ask-more-rh.patch # Patch642: gdb-readline62-ask-more-rh.patch
@ -783,8 +791,6 @@ find -name "*.info*"|xargs rm -f
%patch232 -p1 %patch232 -p1
%patch828 -p1 %patch828 -p1
%patch829 -p1 %patch829 -p1
%patch836 -p1
%patch837 -p1
%patch1 -p1 %patch1 -p1
%patch3 -p1 %patch3 -p1
@ -881,6 +887,7 @@ find -name "*.info*"|xargs rm -f
%patch723 -p1 %patch723 -p1
%patch822 -p1 %patch822 -p1
%patch827 -p1 %patch827 -p1
%patch619 -p1
%patch627 -p1 %patch627 -p1
%patch634 -p1 %patch634 -p1
%patch653 -p1 %patch653 -p1
@ -899,7 +906,15 @@ find -name "*.info*"|xargs rm -f
%patch832 -p1 %patch832 -p1
%patch834 -p1 %patch834 -p1
%patch835 -p1 %patch835 -p1
%patch838 -p1
%patch839 -p1
%patch836 -p1
%patch837 -p1
%if 0%{?scl:1}
%patch836 -p1 -R
%patch837 -p1 -R
%endif
%patch393 -p1 %patch393 -p1
%if 0%{!?el5:1} || 0%{?scl:1} %if 0%{!?el5:1} || 0%{?scl:1}
%patch393 -p1 -R %patch393 -p1 -R
@ -1402,6 +1417,11 @@ fi
%endif # 0%{!?el5:1} || "%{_target_cpu}" == "noarch" %endif # 0%{!?el5:1} || "%{_target_cpu}" == "noarch"
%changelog %changelog
* Mon Jun 10 2013 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.6-32.fc19
- [scl] Disable Python frame filters on scl.
- Update libraries opening performance fix from upstream.
- Fix C++ lookups performance regression (Doug Evans, BZ 972677).
* Tue May 28 2013 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.6-31.fc19 * Tue May 28 2013 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.6-31.fc19
- [ppc] Backport hardware watchpoints fix (Edjunior Machado, BZ 967915). - [ppc] Backport hardware watchpoints fix (Edjunior Machado, BZ 967915).