From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20128 invoked by alias); 17 May 2013 16:22:04 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 20108 invoked by uid 306); 17 May 2013 16:22:04 -0000 Date: Fri, 17 May 2013 16:22:00 -0000 Message-ID: <20130517162204.20063.qmail@sourceware.org> From: tromey@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] tromey/cleanup-checker: fix solib-som.c X-Git-Refname: refs/heads/tromey/cleanup-checker X-Git-Reftype: branch X-Git-Oldrev: b126c46b967e111bece3f8798f1fcc0f550bf692 X-Git-Newrev: 5dff075c4c32032ec8e7f9be971fae85704a57b8 X-SW-Source: 2013-q2/txt/msg00076.txt.bz2 List-Id: The branch, tromey/cleanup-checker has been updated discards b126c46b967e111bece3f8798f1fcc0f550bf692 (commit) discards 927f199f5b4c929e2e6af9f3fefcff1357c1a9b7 (commit) discards 499055a7be510a935a9e0aa0035cb113e300d221 (commit) discards 889ef3796e2432eb0ea30ccc81d7e7099987cdfc (commit) discards 1b1b855dc118d306eb6c4e55c8f34bc705e51fd9 (commit) discards 754ed97cedaa9d4fa4ba49b4483ce47258e71533 (commit) discards 40e6daa4eced95f1cb2d0c3d5bdafe82da0bcdff (commit) discards 197a244755f95dd4740ae50ce56c323cae77d85e (commit) discards d23377272def84730a2adbd4e5a284c67cf25838 (commit) via 5dff075c4c32032ec8e7f9be971fae85704a57b8 (commit) via d0cc19c575ceed4d38fa10533aaea29fea602e63 (commit) via 1d4ff4f4201e491cf8b229df0c66ca7abd4dfb2e (commit) via 1f4b2f9a2f4a8d1ac3de78a856923cebe51bdc76 (commit) via 34746973a5ba4e36723df5fde3cc26fd793a57a9 (commit) via c494ef293b56ea603bfa3afbc186b9dc8a59a7c2 (commit) via f20f49258f17af6caba82d6f0a3a50180835571f (commit) via 3c80a3520156141ba16416bb9073848c87387f28 (commit) via dfc6c5277fa3dacfe6c9b1f69b00c767d9b2e595 (commit) from b126c46b967e111bece3f8798f1fcc0f550bf692 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 5dff075c4c32032ec8e7f9be971fae85704a57b8 Author: Tom Tromey Date: Fri May 17 09:40:41 2013 -0600 fix solib-som.c som_open_symbol_file_object was leaking a cleanup. * solib-som.c (som_open_symbol_file_object): Call do_cleanups. commit d0cc19c575ceed4d38fa10533aaea29fea602e63 Author: Tom Tromey Date: Thu May 16 14:43:34 2013 -0600 fix init_cutu_and_read_dies commit 1d4ff4f4201e491cf8b229df0c66ca7abd4dfb2e Author: Tom Tromey Date: Thu May 16 14:42:15 2013 -0600 fix dwarf_decode_line_header commit 1f4b2f9a2f4a8d1ac3de78a856923cebe51bdc76 Author: Tom Tromey Date: Thu May 9 11:44:45 2013 -0600 introduce scoped cleanups This adds scoped cleanups to gdb. A scoped cleanup is a more efficient, and checkable, alternative to the common idiom: cleanup = make_cleanup (null_cleanup, NULL); ... do_cleanups (cleanup); ... where the cleanup is always run when exiting the scope. The efficiency comes from stack allocating the scoped cleanup. This is probably minor. However, I've noticed myself sometimes avoiding null cleanups on this basis, and it is nice to erase that bias. The checking comes from using a GCC extension when available. This check ensures that the scoped cleanup was either run or discarded when the scope exits. commit 34746973a5ba4e36723df5fde3cc26fd793a57a9 Author: Tom Tromey Date: Wed May 8 14:57:11 2013 -0600 fix up xml-support.c xml-support.c has a function that returns a cleanup via an out parameter. This changes this function to be a normal cleanup constructor -- returning the cleanup directly and returning the other result via an out parameter. This is sort of a hack, but it lets the checker work here. I also noticed that gdb_xml_create_parser_and_cleanup is not really needed, so I removed it. * xml-support.c (gdb_xml_create_parser_and_cleanup_1): Return a cleanup. Remove 'old_chain' argument. Add 'parser_result' argument. (gdb_xml_create_parser_and_cleanup): Remove. (gdb_xml_parse_quick): Use gdb_xml_create_parser_and_cleanup_1. (xml_process_xincludes): Update. * xml-support.h (gdb_xml_create_parser_and_cleanup): Don't declare. commit c494ef293b56ea603bfa3afbc186b9dc8a59a7c2 Author: Tom Tromey Date: Wed May 8 14:52:26 2013 -0600 fix compile_rx_or_error compile_rx_or_error looks like a constructor, but it can return NULL. This patch changes it to remove the NULL return, making it work like any other cleanup constructor. This is a stylistic patch but I think it is also better for code to follow the normal conventions. * probe.c (collect_probes): Check arguments for NULL before calling compile_rx_or_error. * utils.c (compile_rx_or_error): Require 'rx' to be non-NULL. Remove NULL return. commit f20f49258f17af6caba82d6f0a3a50180835571f Author: Tom Tromey Date: Tue May 7 11:57:54 2013 -0600 some fixes to infrun.c This fixes some of the problems in infrun.c that the checker reported. I filed the remaining problems as bugs. This patch is purely stylistic. * infrun.c (adjust_pc_after_break): Introduce an outer null cleanup. commit 3c80a3520156141ba16416bb9073848c87387f28 Author: Tom Tromey Date: Tue May 7 11:34:59 2013 -0600 introduce dangling_cleanup attribute and change source to use it Some functions leak cleanups on purpose. However, these functions aren't "constructors" in the cleanup-checker sense, as they do not return the cleanup. This patch adds an attribute that can be used to mark these functions. This avoids a bunch of false reports from the checker. This patch is really a huge hack. It is basically giving up on cleanly checking the use of cleanups. You can see this most easily by noticing that I elected not to have this property propagate through the call chain. Still, I figured I'd see what people thought of this patch. Without it the checker is harder to use, as you must know which functions are ignorable. Maybe some of these are fixable with a bit more thought. * ada-lang.c (old_renaming_is_invisible): Use DANGLING_CLEANUP. * breakpoint.c (breakpoint_re_set_default): Use DANGLING_CLEANUP. * c-exp.y (operator_stoken): Use DANGLING_CLEANUP. * coffread.c (coff_locate_sections): Use DANGLING_CLEANUP. * contrib/cleanup_check.py (leaks_cleanup): New global. (note_dangling_cleanup, leaves_dangling_cleanup): New functions. (CleanupChecker.compute_master): Add comment. Check leaves_dangling_cleanup. (CleanupChecker.check_cleanups): Don't mention special constructors to the user. (register_attributes): New function. Register it with gcc. * defs.h (DANGLING_CLEANUP): New define. * dwarf2read.c (read_cutu_die_from_dwo, handle_DW_AT_stmt_list) (setup_type_unit_groups, dwarf2_add_field, dwarf2_add_typedef) (dwarf2_add_member_fn, psymtab_include_file_name) (dwarf_decode_lines): Use DANGLING_CLEANUP. * linux-nat.c (linux_child_pid_to_exec_file): Use DANGLING_CLEANUP. * linux-tdep.c (linux_make_corefile_notes): Use DANGLING_CLEANUP. * python/py-prettyprint.c (push_dummy_python_frame): Use DANGLING_CLEANUP. * stabsread.c (read_member_functions, read_struct_fields) (read_baseclasses): Use DANGLING_CLEANUP. * utils.h (gdb_bfd_errmsg): Use DANGLING_CLEANUP. more dangling cleanups commit dfc6c5277fa3dacfe6c9b1f69b00c767d9b2e595 Author: Tom Tromey Date: Tue May 7 10:55:56 2013 -0600 fix mi-cmd-var.c This is a stylistic change in mi-cmd-var.c that adds outer cleanups where needed by the checker. * mi/mi-cmd-var.c (varobj_update_one): Add an outer null cleanup. ----------------------------------------------------------------------- Summary of changes: gdb/breakpoint.c | 15 ++++++++------- gdb/defs.h | 4 ++++ gdb/infrun.c | 11 +++++------ gdb/linux-tdep.c | 1 + gdb/mi/mi-cmd-var.c | 13 +++++++------ gdb/solib-som.c | 4 +++- 6 files changed, 28 insertions(+), 20 deletions(-) First 500 lines of diff: diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 47539f1..4c34a5c 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -6370,15 +6370,16 @@ breakpoint_1 (char *args, int allflag, } } - bkpttbl_chain = make_cleanup (null_cleanup, NULL); if (opts.addressprint) - make_cleanup_ui_out_table_begin_end (uiout, 6, - nr_printable_breakpoints, - "BreakpointTable"); + bkpttbl_chain + = make_cleanup_ui_out_table_begin_end (uiout, 6, + nr_printable_breakpoints, + "BreakpointTable"); else - make_cleanup_ui_out_table_begin_end (uiout, 5, - nr_printable_breakpoints, - "BreakpointTable"); + bkpttbl_chain + = make_cleanup_ui_out_table_begin_end (uiout, 5, + nr_printable_breakpoints, + "BreakpointTable"); if (nr_printable_breakpoints > 0) annotate_breakpoints_headers (); diff --git a/gdb/defs.h b/gdb/defs.h index f82fc17..fbf6edc 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -98,6 +98,10 @@ #include "libiberty.h" #include "hashtab.h" +/* The cleanup checker (see contrib/cleanup_check.py) defines + WITH_ATTRIBUTE_DANGLING_CLEANUP. If this is defined then we can + use the 'dangling_cleanup' attribute to mark functions which are + known to leak a cleanup. */ #ifdef WITH_ATTRIBUTE_DANGLING_CLEANUP #define DANGLING_CLEANUP __attribute__((dangling_cleanup)) #else diff --git a/gdb/infrun.c b/gdb/infrun.c index 4e7091e..b768ffd 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -665,7 +665,7 @@ handle_vfork_child_exec_or_exit (int exec) if (inf->vfork_parent->pending_detach) { struct thread_info *tp; - struct cleanup *old_chain = make_cleanup (null_cleanup, NULL); + struct cleanup *old_chain; struct program_space *pspace; struct address_space *aspace; @@ -677,12 +677,12 @@ handle_vfork_child_exec_or_exit (int exec) { /* If we're handling a child exit, then inferior_ptid points at the inferior's pid, not to a thread. */ - save_inferior_ptid (); + old_chain = save_inferior_ptid (); save_current_program_space (); save_current_inferior (); } else - save_current_space_and_thread (); + old_chain = save_current_space_and_thread (); /* We're letting loose of the parent. */ tp = any_live_thread_of_process (inf->vfork_parent->pid); @@ -2803,11 +2803,10 @@ fetch_inferior_event (void *client_data) /* If an error happens while handling the event, propagate GDB's knowledge of the executing state to the frontend/user running state. */ - ts_old_chain = make_cleanup (null_cleanup, NULL); if (!non_stop) - make_cleanup (finish_thread_state_cleanup, &minus_one_ptid); + ts_old_chain = make_cleanup (finish_thread_state_cleanup, &minus_one_ptid); else - make_cleanup (finish_thread_state_cleanup, &ecs->ptid); + ts_old_chain = make_cleanup (finish_thread_state_cleanup, &ecs->ptid); /* Get executed before make_cleanup_restore_current_thread above to apply still for the thread which has thrown the exception. */ diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c index bfb6404..b98401d 100644 --- a/gdb/linux-tdep.c +++ b/gdb/linux-tdep.c @@ -1362,6 +1362,7 @@ linux_fill_prpsinfo (struct elf_internal_linux_prpsinfo *p) /* Fills the "to_make_corefile_note" target vector. Builds the note section for a corefile, and returns it in a malloc buffer. */ +DANGLING_CLEANUP char * linux_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size, linux_collect_thread_registers_ftype collect) diff --git a/gdb/mi/mi-cmd-var.c b/gdb/mi/mi-cmd-var.c index c2e8b7a..a069346 100644 --- a/gdb/mi/mi-cmd-var.c +++ b/gdb/mi/mi-cmd-var.c @@ -441,12 +441,14 @@ mi_cmd_var_list_children (char *command, char **argv, int argc) if (from < to) { - struct cleanup *cleanup_children = make_cleanup (null_cleanup, NULL); + struct cleanup *cleanup_children; if (mi_version (uiout) == 1) - make_cleanup_ui_out_tuple_begin_end (uiout, "children"); + cleanup_children + = make_cleanup_ui_out_tuple_begin_end (uiout, "children"); else - make_cleanup_ui_out_list_begin_end (uiout, "children"); + cleanup_children + = make_cleanup_ui_out_list_begin_end (uiout, "children"); for (ix = from; ix < to && VEC_iterate (varobj_p, children, ix, child); ++ix) @@ -700,11 +702,10 @@ mi_cmd_var_update (char *command, char **argv, int argc) else print_values = PRINT_NO_VALUES; - cleanup = make_cleanup (null_cleanup, NULL); if (mi_version (uiout) <= 1) - make_cleanup_ui_out_tuple_begin_end (uiout, "changelist"); + cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, "changelist"); else - make_cleanup_ui_out_list_begin_end (uiout, "changelist"); + cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changelist"); /* Check if the parameter is a "*", which means that we want to update all variables. */ diff --git a/gdb/solib-som.c b/gdb/solib-som.c index f88b539..457e464 100644 --- a/gdb/solib-som.c +++ b/gdb/solib-som.c @@ -698,6 +698,7 @@ som_open_symbol_file_object (void *from_ttyp) int errcode; int from_tty = *(int *)from_ttyp; gdb_byte buf[4]; + struct cleanup *cleanup; if (symfile_objfile) if (!query (_("Attempt to reload symbols from process? "))) @@ -727,10 +728,11 @@ som_open_symbol_file_object (void *from_ttyp) return 0; } - make_cleanup (xfree, filename); + cleanup = make_cleanup (xfree, filename); /* Have a pathname: read the symbol file. */ symbol_file_add_main (filename, from_tty); + do_cleanups (cleanup); return 1; } hooks/post-receive -- Repository for Project Archer.