From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26531 invoked by alias); 27 Nov 2012 15:53:39 -0000 Received: (qmail 26522 invoked by uid 22791); 27 Nov 2012 15:53:38 -0000 X-SWARE-Spam-Status: No, hits=-7.4 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,TW_RG X-Spam-Check-By: sourceware.org Received: from mga03.intel.com (HELO mga03.intel.com) (143.182.124.21) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 27 Nov 2012 15:53:30 +0000 Received: from azsmga002.ch.intel.com ([10.2.17.35]) by azsmga101.ch.intel.com with ESMTP; 27 Nov 2012 07:53:29 -0800 X-ExtLoop1: 1 Received: from swsutil001.isw.intel.com ([10.237.237.11]) by AZSMGA002.ch.intel.com with ESMTP; 27 Nov 2012 07:53:26 -0800 Received: from ulslx001.iul.intel.com (ulslx001.iul.intel.com [172.28.207.63]) by swsutil001.isw.intel.com (8.13.6/8.13.6/MailSET/Hub) with ESMTP id qARFrPC0012892; Tue, 27 Nov 2012 15:53:25 GMT Received: from ulslx001.iul.intel.com (localhost [127.0.0.1]) by ulslx001.iul.intel.com with ESMTP id qARFrPL3020468; Tue, 27 Nov 2012 16:53:25 +0100 Received: (from mgherza1@localhost) by ulslx001.iul.intel.com with id qARFrOGR020464; Tue, 27 Nov 2012 16:53:24 +0100 From: Mircea Gherzan To: gdb-patches@sourceware.org Cc: keven.boell@intel.com, mircea.gherzan@intel.com, marc.khouzam@ericsson.com, tromey@redhat.com, vladimir@codesourcery.com Subject: [PATCH v6 1/3] MI: add the -catch-load and -catch-unload commands Date: Tue, 27 Nov 2012 15:53:00 -0000 Message-Id: <1354031591-20226-1-git-send-email-mircea.gherzan@intel.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-11/txt/msg00747.txt.bz2 They are equivalent to "catch load" and "catch unload" from CLI. Rationale: GUIs might be interested in catching solib load or unload events. 2012-11-16 Mircea Gherzan * Makefile.in (SUBDIR_MI_OBS): Add mi-cmd-catch.o. (SUBDIR_MI_SRCS): Add mi/mi-cmd-catch.c. * breakpoint.c (add_solib_catchpoint): New function based on that can be used by both CLI and MI, factored out from catch_load_or_unload. (catch_load_or_unload): Strip it down and make it use the new add_solib_catchpoint. * breakpoint.h (add_solib_catchpoint): Declare it. * mi/mi-cmd-catch.c: New file. * mi/mi-cmds.c (mi_cmds): Add the handlers for -catch-load and -catch-unload. * mi/mi-cmds.h: Declare the handlers for -catch-load and -catch-unload. Signed-off-by: Mircea Gherzan --- gdb/Makefile.in | 9 ++++- gdb/breakpoint.c | 33 ++++++++++++----- gdb/breakpoint.h | 5 +++ gdb/mi/mi-cmd-catch.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++ gdb/mi/mi-cmds.c | 2 + gdb/mi/mi-cmds.h | 2 + 6 files changed, 132 insertions(+), 12 deletions(-) create mode 100644 gdb/mi/mi-cmd-catch.c diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 3dd7b85..40c7e80 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -203,13 +203,14 @@ SUBDIR_CLI_CFLAGS= # SUBDIR_MI_OBS = \ mi-out.o mi-console.o \ - mi-cmds.o mi-cmd-env.o mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o \ + mi-cmds.o mi-cmd-catch.o mi-cmd-env.o \ + mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o \ mi-cmd-file.o mi-cmd-disas.o mi-symbol-cmds.o mi-cmd-target.o \ mi-cmd-info.o mi-interp.o \ mi-main.o mi-parse.o mi-getopt.o SUBDIR_MI_SRCS = \ mi/mi-out.c mi/mi-console.c \ - mi/mi-cmds.c mi/mi-cmd-env.c \ + mi/mi-cmds.c mi/mi-cmd-catch.c mi/mi-cmd-env.c \ mi/mi-cmd-var.c mi/mi-cmd-break.c mi/mi-cmd-stack.c \ mi/mi-cmd-file.c mi/mi-cmd-disas.c mi/mi-symbol-cmds.c \ mi/mi-cmd-target.c mi/mi-cmd-info.c mi/mi-interp.c \ @@ -1833,6 +1834,10 @@ mi-cmd-break.o: $(srcdir)/mi/mi-cmd-break.c $(COMPILE) $(srcdir)/mi/mi-cmd-break.c $(POSTCOMPILE) +mi-cmd-catch.o: $(srcdir)/mi/mi-cmd-catch.c + $(COMPILE) $(srcdir)/mi/mi-cmd-catch.c + $(POSTCOMPILE) + mi-cmd-disas.o: $(srcdir)/mi/mi-cmd-disas.c $(COMPILE) $(srcdir)/mi/mi-cmd-disas.c $(POSTCOMPILE) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 5749fa7..1c95c04 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -7847,20 +7847,16 @@ print_recreate_catch_solib (struct breakpoint *b, struct ui_file *fp) static struct breakpoint_ops catch_solib_breakpoint_ops; -/* A helper function that does all the work for "catch load" and - "catch unload". */ +/* Shared helper function (MI and CLI) for creating and installing + a shared object event catchpoint. */ -static void -catch_load_or_unload (char *arg, int from_tty, int is_load, - struct cmd_list_element *command) +void +add_solib_catchpoint (char *arg, int is_load, int is_temp, int enabled) { struct solib_catchpoint *c; - struct gdbarch *gdbarch = get_current_arch (); - int tempflag; + struct gdbarch *arch = get_current_arch (); struct cleanup *cleanup; - tempflag = get_cmd_context (command) == CATCH_TEMPORARY; - if (!arg) arg = ""; arg = skip_spaces (arg); @@ -7884,13 +7880,30 @@ catch_load_or_unload (char *arg, int from_tty, int is_load, } c->is_load = is_load; - init_catchpoint (&c->base, gdbarch, tempflag, NULL, + init_catchpoint (&c->base, arch, is_temp, NULL, &catch_solib_breakpoint_ops); + c->base.enable_state = enabled ? bp_enabled : bp_disabled; + discard_cleanups (cleanup); install_breakpoint (0, &c->base, 1); } +/* A helper function that does all the work for "catch load" and + "catch unload". */ + +static void +catch_load_or_unload (char *arg, int from_tty, int is_load, + struct cmd_list_element *command) +{ + int tempflag; + const int enabled = 1; + + tempflag = get_cmd_context (command) == CATCH_TEMPORARY; + + add_solib_catchpoint (arg, is_load, tempflag, enabled); +} + static void catch_load_command_1 (char *arg, int from_tty, struct cmd_list_element *command) diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index 8b1bcb7..11e432c 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -1405,6 +1405,11 @@ extern void disable_breakpoints_in_shlibs (void); /* This function returns TRUE if ep is a catchpoint. */ extern int is_catchpoint (struct breakpoint *); +/* Shared helper function (MI and CLI) for creating and installing + a shared object event catchpoint. */ +extern void add_solib_catchpoint (char *arg, int is_load, int is_temp, + int enabled); + /* Enable breakpoints and delete when hit. Called with ARG == NULL deletes all breakpoints. */ extern void delete_command (char *arg, int from_tty); diff --git a/gdb/mi/mi-cmd-catch.c b/gdb/mi/mi-cmd-catch.c new file mode 100644 index 0000000..42bf035 --- /dev/null +++ b/gdb/mi/mi-cmd-catch.c @@ -0,0 +1,93 @@ +/* MI Command Set - catch commands. + Copyright (C) 2012 Free Software Foundation, Inc. + + Contributed by Intel Corporation. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "defs.h" +#include "arch-utils.h" +#include "breakpoint.h" +#include "libiberty.h" +#include "mi-cmds.h" +#include "mi-getopt.h" + +/* Common path for the -catch-load and -catch-unload. */ + +static void +mi_catch_load_unload (int load, char *argv[], int argc) +{ + char *actual_cmd = load ? "-catch-load" : "-catch-unload"; + int temp = 0; + int enabled = 1; + int oind = 0; + char *oarg; + enum opt + { + OPT_TEMP, + OPT_DISABLED, + }; + static const struct mi_opt opts[] = + { + { "t", OPT_TEMP, 0 }, + { "d", OPT_DISABLED, 0 }, + { 0, 0, 0 } + }; + + for (;;) + { + int opt = mi_getopt (actual_cmd, argc, argv, opts, + &oind, &oarg); + + if (opt < 0) + break; + + switch ((enum opt) opt) + { + case OPT_TEMP: + temp = 1; + break; + case OPT_DISABLED: + enabled = 0; + break; + } + } + + if (oind >= argc) + error (_("-catch-load/unload: Missing ")); + if (oind < argc -1) + error (_("-catch-load/unload: Garbage following the ")); + + add_solib_catchpoint (argv[oind], load, temp, enabled); +} + +/* Handler for the -catch-load. */ + +void +mi_cmd_catch_load (char *cmd, char *argv[], int argc) +{ + mi_catch_load_unload (1, argv, argc); +} + + +/* Handler for the -catch-unload. */ + +void +mi_cmd_catch_unload (char *cmd, char *argv[], int argc) +{ + mi_catch_load_unload (0, argv, argc); +} + diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index 572625f..f8a8285 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -67,6 +67,8 @@ static struct mi_cmd mi_cmds[] = &mi_suppress_notification.breakpoint), DEF_MI_CMD_MI_1 ("break-watch", mi_cmd_break_watch, &mi_suppress_notification.breakpoint), + DEF_MI_CMD_MI ("catch-load", mi_cmd_catch_load), + DEF_MI_CMD_MI ("catch-unload", mi_cmd_catch_unload), DEF_MI_CMD_MI ("data-disassemble", mi_cmd_disassemble), DEF_MI_CMD_MI ("data-evaluate-expression", mi_cmd_data_evaluate_expression), DEF_MI_CMD_MI ("data-list-changed-registers", diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index cf1a5eb..da8df48 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -43,6 +43,8 @@ extern mi_cmd_argv_ftype mi_cmd_break_insert; extern mi_cmd_argv_ftype mi_cmd_break_commands; extern mi_cmd_argv_ftype mi_cmd_break_passcount; extern mi_cmd_argv_ftype mi_cmd_break_watch; +extern mi_cmd_argv_ftype mi_cmd_catch_load; +extern mi_cmd_argv_ftype mi_cmd_catch_unload; extern mi_cmd_argv_ftype mi_cmd_disassemble; extern mi_cmd_argv_ftype mi_cmd_data_evaluate_expression; extern mi_cmd_argv_ftype mi_cmd_data_list_register_names; -- 1.7.1