From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26759 invoked by alias); 8 Sep 2008 11:49:22 -0000 Received: (qmail 26749 invoked by uid 22791); 8 Sep 2008 11:49:21 -0000 X-Spam-Check-By: sourceware.org Received: from mtagate5.de.ibm.com (HELO mtagate5.de.ibm.com) (195.212.29.154) by sourceware.org (qpsmtpd/0.31) with ESMTP; Mon, 08 Sep 2008 11:48:38 +0000 Received: from d12nrmr1607.megacenter.de.ibm.com (d12nrmr1607.megacenter.de.ibm.com [9.149.167.49]) by mtagate5.de.ibm.com (8.13.8/8.13.8) with ESMTP id m88BkpJ5366354 for ; Mon, 8 Sep 2008 11:46:51 GMT Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1607.megacenter.de.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id m88BkpuN2703374 for ; Mon, 8 Sep 2008 13:46:51 +0200 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m88BkmQh001183 for ; Mon, 8 Sep 2008 13:46:48 +0200 Received: from tuxmaker.boeblingen.de.ibm.com (tuxmaker.boeblingen.de.ibm.com [9.152.85.9]) by d12av02.megacenter.de.ibm.com (8.12.11.20060308/8.12.11) with SMTP id m88Bkm7a000891; Mon, 8 Sep 2008 13:46:48 +0200 Message-Id: <200809081146.m88Bkm7a000891@d12av02.megacenter.de.ibm.com> Received: by tuxmaker.boeblingen.de.ibm.com (sSMTP sendmail emulation); Mon, 8 Sep 2008 13:46:35 +0200 Subject: Re: [rfc] [16/18] Cell multi-arch: Add "set spu stop-on-load" command To: eliz@gnu.org Date: Mon, 08 Sep 2008 11:49:00 -0000 From: "Ulrich Weigand" Cc: gdb-patches@sourceware.org In-Reply-To: from "Eli Zaretskii" at Sep 08, 2008 06:13:31 AM X-Mailer: ELM [version 2.5 PL2] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit 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: 2008-09/txt/msg00163.txt.bz2 Eli Zaretskii wrote: > > Date: Sun, 7 Sep 2008 23:16:38 +0200 (CEST) > > From: "Ulrich Weigand" > > > > +Use \"on\" to give control to the user when a new SPE threads enters its \"main\" function.\n\ > ^^^^^^^ > "a new SPE thread" (singular) or delete the "a". Also, please break > this sentence to avoid overflowing the margin of a standard 80-column > line. OK, fixed. > > +When @value{GDBN} is debugging a combined PowerPC/SPU application > > +on the Cell Broadband Engine, it provides in addition the following > > +special commands: > > Please add a cindex entry here for "cell broadband engine". There is already a cindex for "Cell Broadband Engine" on this section. Should I add another one, or move the existing cindex statement? > > +@item set spu stop-on-load @var{arg} > > +@kindex set spu > > +Set whether to stop for new SPE threads. When set to @code{on}, @value{GDBN} > > +will give control to the user when a new SPE threads enters its @code{main} > > +function. > > Please state the default for this setting. Done. See updated patch below. Thanks, Ulrich ChangeLog: * spu-tdep.c: Include "block.h". (setspucmdlist, showspucmdlist): New static variables. (spu_stop_on_load_p): Likewise. (spu_catch_start): New function. (show_spu_command, set_spu_command): New functions. (show_spu_stop_on_load): Likewise. (_initialize_spu_tdep): Attach spu_catch_start to new_objfile observer. Install "set spu" / "show spu" prefix command handler. Install "set spu stop-on-load" / "show spu stop-on-load" command. doc/ChangeLog: * gdb.texinfo (Cell Broadband Engine SPU architecture): Document the "set spu stop-on-load" and "show spu stop-on-load" commands. Index: src/gdb/spu-tdep.c =================================================================== --- src.orig/gdb/spu-tdep.c +++ src/gdb/spu-tdep.c @@ -40,11 +40,20 @@ #include "regcache.h" #include "reggroups.h" #include "floatformat.h" +#include "block.h" #include "observer.h" #include "spu-tdep.h" +/* The list of available "set spu " and "show spu " commands. */ +static struct cmd_list_element *setspucmdlist = NULL; +static struct cmd_list_element *showspucmdlist = NULL; + +/* Whether to stop for new SPE contexts. */ +static int spu_stop_on_load_p = 0; + + /* The tdep structure. */ struct gdbarch_tdep { @@ -1669,6 +1678,61 @@ spu_overlay_new_objfile (struct objfile } +/* Insert temporary breakpoint on "main" function of newly loaded + SPE context OBJFILE. */ +static void +spu_catch_start (struct objfile *objfile) +{ + struct minimal_symbol *minsym; + struct symtab *symtab; + CORE_ADDR pc; + char buf[32]; + + /* Do this only if requested by "set spu stop-on-load on". */ + if (!spu_stop_on_load_p) + return; + + /* Consider only SPU objfiles. */ + if (!objfile || bfd_get_arch (objfile->obfd) != bfd_arch_spu) + return; + + /* The main objfile is handled differently. */ + if (objfile == symfile_objfile) + return; + + /* There can be multiple symbols named "main". Search for the + "main" in *this* objfile. */ + minsym = lookup_minimal_symbol ("main", NULL, objfile); + if (!minsym) + return; + + /* If we have debugging information, try to use it -- this + will allow us to properly skip the prologue. */ + pc = SYMBOL_VALUE_ADDRESS (minsym); + symtab = find_pc_sect_symtab (pc, SYMBOL_OBJ_SECTION (minsym)); + if (symtab != NULL) + { + struct blockvector *bv = BLOCKVECTOR (symtab); + struct block *block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); + struct symbol *sym; + struct symtab_and_line sal; + + sym = lookup_block_symbol (block, "main", NULL, VAR_DOMAIN); + if (sym) + { + fixup_symbol_section (sym, objfile); + sal = find_function_start_sal (sym, 1); + pc = sal.pc; + } + } + + /* Use a numerical address for the tbreak command to avoid having + the breakpoint re-set incorrectly. */ + xsnprintf (buf, sizeof buf, "*%s", core_addr_to_string (pc)); + tbreak_command (buf, 0); +} + + /* "info spu" commands. */ static void @@ -2218,6 +2282,29 @@ info_spu_command (char *args, int from_t } +/* Root of all "set spu "/"show spu " commands. */ + +static void +show_spu_command (char *args, int from_tty) +{ + help_list (showspucmdlist, "show spu ", all_commands, gdb_stdout); +} + +static void +set_spu_command (char *args, int from_tty) +{ + help_list (setspucmdlist, "set spu ", all_commands, gdb_stdout); +} + +static void +show_spu_stop_on_load (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + fprintf_filtered (file, _("Stopping for new SPE threads is %s.\n"), + value); +} + + /* Set up gdbarch struct. */ static struct gdbarch * @@ -2328,6 +2415,32 @@ _initialize_spu_tdep (void) observer_attach_new_objfile (spu_overlay_new_objfile); spu_overlay_data = register_objfile_data (); + /* Install spu stop-on-load handler. */ + observer_attach_new_objfile (spu_catch_start); + + /* Add root prefix command for all "set spu"/"show spu" commands. */ + add_prefix_cmd ("spu", no_class, set_spu_command, + _("Various SPU specific commands."), + &setspucmdlist, "set spu ", 0, &setlist); + add_prefix_cmd ("spu", no_class, show_spu_command, + _("Various SPU specific commands."), + &showspucmdlist, "show spu ", 0, &showlist); + + /* Toggle whether or not to add a temporary breakpoint at the "main" + function of new SPE contexts. */ + add_setshow_boolean_cmd ("stop-on-load", class_support, + &spu_stop_on_load_p, _("\ +Set whether to stop for new SPE threads."), + _("\ +Show whether to stop for new SPE threads."), + _("\ +Use \"on\" to give control to the user when a new SPE thread \ +enters its \"main\" function.\n\ +Use \"off\" to disable stopping for new SPE threads."), + NULL, + show_spu_stop_on_load, + &setspucmdlist, &showspucmdlist); + /* Add root prefix command for all "info spu" commands. */ add_prefix_cmd ("spu", class_info, info_spu_command, _("Various SPU specific commands."), Index: src/gdb/doc/gdb.texinfo =================================================================== --- src.orig/gdb/doc/gdb.texinfo +++ src/gdb/doc/gdb.texinfo @@ -16431,6 +16431,23 @@ and local store addresses and transfer s @end table +When @value{GDBN} is debugging a combined PowerPC/SPU application +on the Cell Broadband Engine, it provides in addition the following +special commands: + +@table @code +@item set spu stop-on-load @var{arg} +@kindex set spu +Set whether to stop for new SPE threads. When set to @code{on}, @value{GDBN} +will give control to the user when a new SPE thread enters its @code{main} +function. The default is @code{off}. + +@item show spu stop-on-load +@kindex show spu +Show whether to stop for new SPE threads. + +@end table + @node PowerPC @subsection PowerPC @cindex PowerPC architecture -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE Ulrich.Weigand@de.ibm.com