From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 75768 invoked by alias); 24 Jan 2017 16:00:06 -0000 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 Received: (qmail 75564 invoked by uid 89); 24 Jan 2017 16:00:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.8 required=5.0 tests=AWL,BAYES_50,RCVD_IN_DNSWL_LOW,SPF_PASS,UNSUBSCRIBE_BODY autolearn=no version=3.3.2 spammy=1700, 3340, 4700, 5100 X-HELO: mx0a-001b2d01.pphosted.com Received: from mx0a-001b2d01.pphosted.com (HELO mx0a-001b2d01.pphosted.com) (148.163.156.1) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 24 Jan 2017 15:59:29 +0000 Received: from pps.filterd (m0098399.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v0OFrrbc005485 for ; Tue, 24 Jan 2017 10:59:27 -0500 Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.151]) by mx0a-001b2d01.pphosted.com with ESMTP id 285jtvhsdp-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Tue, 24 Jan 2017 10:59:24 -0500 Received: from localhost by e33.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 24 Jan 2017 08:59:23 -0700 Received: from d03dlp03.boulder.ibm.com (9.17.202.179) by e33.co.us.ibm.com (192.168.1.133) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 24 Jan 2017 08:59:21 -0700 Received: from b01cxnp23032.gho.pok.ibm.com (b01cxnp23032.gho.pok.ibm.com [9.57.198.27]) by d03dlp03.boulder.ibm.com (Postfix) with ESMTP id 63B9C19D803F; Tue, 24 Jan 2017 08:58:35 -0700 (MST) Received: from b01ledav03.gho.pok.ibm.com (b01ledav003.gho.pok.ibm.com [9.57.199.108]) by b01cxnp23032.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v0OFxJD615991218; Tue, 24 Jan 2017 15:59:19 GMT Received: from b01ledav03.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 80712B204E; Tue, 24 Jan 2017 10:59:19 -0500 (EST) Received: from otta.rchland.ibm.com (unknown [9.10.86.64]) by b01ledav03.gho.pok.ibm.com (Postfix) with ESMTP id 81768B2054; Tue, 24 Jan 2017 10:59:18 -0500 (EST) Subject: Re: [PATCH 1/2] Add support for setting disassembler-options in GDB for POWER, ARM and S390 To: Alan Modra References: <83eg28dcjk.fsf@gnu.org> <019eaf5d-9ace-539e-8501-feb3cb0eed6c@vnet.ibm.com> <20170124015651.GH28669@bubble.grove.modra.org> <20170124033625.GI28669@bubble.grove.modra.org> <6962ef25-9722-f0f0-d0a2-209b10761311@vnet.ibm.com> Cc: Pedro Alves , Eli Zaretskii , nickc@redhat.com, gdb-patches@sourceware.org, uweigand@de.ibm.com, binutils@sourceware.org, Peter Bergner From: Peter Bergner Date: Tue, 24 Jan 2017 16:00:00 -0000 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 In-Reply-To: <6962ef25-9722-f0f0-d0a2-209b10761311@vnet.ibm.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 17012415-0008-0000-0000-000007028E65 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00006490; HX=3.00000240; KW=3.00000007; PH=3.00000004; SC=3.00000200; SDB=6.00812064; UDB=6.00395994; IPR=6.00589481; BA=6.00005084; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00014028; XFM=3.00000011; UTC=2017-01-24 15:59:22 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17012415-0009-0000-0000-00003F460573 Message-Id: X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-01-24_12:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=2 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1612050000 definitions=main-1701240107 X-IsSubscribed: yes X-SW-Source: 2017-01/txt/msg00497.txt.bz2 On 1/23/17 10:32 PM, Peter Bergner wrote: > On 1/23/17 9:36 PM, Alan Modra wrote: >>>> This appears to have lost translation of the help strings. > [snip] >> Yes, I meant the support for language translation. > > Ok, I see now. How about the following changes to to add _(...) > around the option descriptions for s390 and arm (ppc doesn't have any)? For completeness, here is the full updated patch that keeps the language translation. Peter include/ * dis-asm.h (parse_arm_disassembler_option): Remove prototype. (set_arm_regname_option): Likewise. (disassemble_init_s390): New prototype. (disassembler_options_names_powerpc): Likewise. (disassembler_options_names_arm): Likewise. (disassembler_options_desc_arm): Likewise. (disassembler_options_names_s390): Likewise. (disassembler_options_desc_s390): Likewise. opcodes/ * disassemble.c (disassemble_init_for_target): Handle s390 init. * ppc-dis.c: Include "libiberty.h". (ppc_opts): Add "32" and "64" entries. (parse_ppc_dis_option): New function. (disassembler_options_names_powerpc): Likewise. (powerpc_init_dialect): Use parse_ppc_dis_option(). Add break to switch statement. (print_ppc_disassembler_options): Remove printing of "32" and "64". * arm-dis.c: Include "libiberty.h". (struct arm_regname): Add 'long_name' field. (regnames): Initialize it. (set_arm_regname_option): Remove function. (parse_arm_disassembler_option): Make static. (disassembler_options_names_arm): New function. (disassembler_options_desc_arm): Likewise. * s390-dis.c: Include "libiberty.h". (struct options_t): New structure type. (options): New structure. (init_disasm): Rename from this... (disassemble_init_s390): ...to this. Add initializations for current_arch_mask and option_use_insn_len_bits_p. Remove init_flag. (disassembler_options_names_s390): New function. (disassembler_options_desc_s390): Likewise. (print_s390_disassembler_options): Print using information from struct 'options'. gdb/ * NEWS: Mention new set/show disassembler-options commands. * doc/gdb.texinfo: Document new set/show disassembler-options commands. * gdbarch.sh (gdbarch_disassembler_options): New variable. (gdbarch_disassembler_options_names): Likewise. (gdbarch_disassembler_options_descriptions): Likewise. * gdbarch.c: Regenerate. * gdbarch.h: Likewise. * disasm.c: Include "arch-utils.h", "gdbcmd.h", "gdbcmd.h" and "safe-ctype.h". (gdb_disassemble_info): Initilize di.disassembler_options. (gdb_buffered_insn_length_init_dis): Initilize di->application_data and di->disassembler_options. (cleanup_disassembler_options): New function. (parse_disassembler_options): Likewise. (set_disassembler_options): Likewise. (show_disassembler_options): Likewise. (disassembler_options_completer): Likewise. (_initialize_disasm): Likewise. * disasm.h (set_disassembler_options): New prototype. (show_disassembler_options): Likewise. * rs6000-tdep.c (rs6000_gdbarch_init): Call set_gdbarch_disassembler_options_names. * arm-tdep.c: Include "disasm.h" and "cli/cli-decode.h". (disassembly_style): Delete static variable. (set_disassembly_style): Delete function and prototype. (show_disassembly_style_sfunc): New function. (set_disassembly_style_sfunc): Call set_disassembler_options. (arm_gdbarch_init): Call set_gdbarch_disassembler_options, set_gdbarch_disassembler_options_names and set_gdbarch_disassembler_options_descriptions. (_initialize_arm_tdep): New static variable 'disassembly_style'; Remove calls to parse_arm_disassembler_option & set_arm_regname_option. Pass show_disassembly_style_sfunc to the "disassembler" setshow command. * s390-tdep.c (s390_gdbarch_init): Call functions set_gdbarch_disassembler_options_names and set_gdbarch_disassembler_options_descriptions. gdb/testsuite/ * gdb.disasm/disassembler-options.exp: New test. * gdb.arch/powerpc-altivec.exp: Likewise. * gdb.arch/powerpc-altivec.s: Likewise. * gdb.arch/powerpc-altivec2.exp: Likewise. * gdb.arch/powerpc-altivec2.s: Likewise. * gdb.arch/powerpc-altivec3.exp: Likewise. * gdb.arch/powerpc-altivec3.s: Likewise. * gdb.arch/powerpc-power7.exp: Likewise. * gdb.arch/powerpc-power7.s: Likewise. * gdb.arch/powerpc-power8.exp: Likewise. * gdb.arch/powerpc-power8.s: Likewise. * gdb.arch/powerpc-power9.exp: Likewise. * gdb.arch/powerpc-power9.s: Likewise. * gdb.arch/powerpc-vsx.exp: Likewise. * gdb.arch/powerpc-vsx.s: Likewise. * gdb.arch/powerpc-vsx2.exp: Likewise. * gdb.arch/powerpc-vsx2.s: Likewise. * gdb.arch/powerpc-vsx3.exp: Likewise. * gdb.arch/powerpc-vsx3.s: Likewise. * gdb.arch/powerpc-power.exp: Delete test. * gdb.arch/powerpc-power.s: Likewise. diff --git a/gdb/NEWS b/gdb/NEWS index 21e8cd3..cac639e 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -68,6 +68,16 @@ flash-erase Erases all the flash memory regions reported by the target. This is equivalent to the CLI command flash-erase. +* New commands + +set disassembler-options +show disassembler-options + Controls the passing of target specific information to the disassembler. + If it is necessary to specify more than one disassembler option then + multiple options can be placed together into a comma separated list. + Default is ''. Currently, the only supported targets are ARM, PowerPC + and S/390. + *** Changes in GDB 7.12 * GDB and GDBserver now build with a C++ compiler by default. diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 2bdfa57..bd6fa72 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -27,6 +27,8 @@ #include "gdbcmd.h" #include "gdbcore.h" #include "dis-asm.h" /* For register styles. */ +#include "disasm.h" +#include "cli/cli-decode.h" #include "regcache.h" #include "reggroups.h" #include "doublest.h" @@ -210,14 +212,13 @@ static const char *const arm_register_names[] = /* Valid register name styles. */ static const char **valid_disassembly_styles; -/* Disassembly style to use. Default to "std" register names. */ -static const char *disassembly_style; - /* This is used to keep the bfd arch_info in sync with the disassembly style. */ static void set_disassembly_style_sfunc(char *, int, struct cmd_list_element *); -static void set_disassembly_style (void); +static void show_disassembly_style_sfunc (struct ui_file *, int, + struct cmd_list_element *, + const char *); static void convert_from_extended (const struct floatformat *, const void *, void *, int); @@ -8536,9 +8537,27 @@ arm_show_force_mode (struct ui_file *file, int from_tty, static void set_disassembly_style_sfunc (char *args, int from_tty, - struct cmd_list_element *c) + struct cmd_list_element *c) +{ + /* Convert the short style name into the long style name (eg, reg-names-*) + before calling the generic set_disassembler_options() function. */ + char long_name[256], *style = long_name; + snprintf (style, 256, "reg-names-%s", *(char **)c->var); + c->var = &style; + set_disassembler_options (args, from_tty, c); +} + +static void +show_disassembly_style_sfunc (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) { - set_disassembly_style (); + struct gdbarch *gdbarch = get_current_arch (); + const char *style = gdbarch_disassembler_options (gdbarch); + if (style == NULL) + style = "default"; + else if (CONST_STRNEQ (style, "reg-names-")) + style += strlen ("reg-names-"); + fprintf_unfiltered (file, "The disassembly style is \"%s\".\n", style); } /* Return the ARM register name corresponding to register I. */ @@ -8579,21 +8598,6 @@ arm_register_name (struct gdbarch *gdbarch, int i) return arm_register_names[i]; } -static void -set_disassembly_style (void) -{ - int current; - - /* Find the style that the user wants. */ - for (current = 0; current < num_disassembly_options; current++) - if (disassembly_style == valid_disassembly_styles[current]) - break; - gdb_assert (current < num_disassembly_options); - - /* Synchronize the disassembler. */ - set_arm_regname_option (current); -} - /* Test whether the coff symbol specific value corresponds to a Thumb function. */ @@ -9553,6 +9557,12 @@ arm_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) user_reg_add (gdbarch, arm_register_aliases[i].name, value_of_arm_user_reg, &arm_register_aliases[i].regnum); + set_gdbarch_disassembler_options (gdbarch, xstrdup ("reg-names-std")); + set_gdbarch_disassembler_options_names (gdbarch, + disassembler_options_names_arm ()); + set_gdbarch_disassembler_options_descriptions + (gdbarch, disassembler_options_desc_arm ()); + return gdbarch; } @@ -9573,6 +9583,9 @@ extern initialize_file_ftype _initialize_arm_tdep; /* -Wmissing-prototypes */ void _initialize_arm_tdep (void) { + /* Disassembly style to use. Default to "std" register names. */ + static const char *disassembly_style; + struct ui_file *stb; long length; const char *setname; @@ -9619,9 +9632,6 @@ _initialize_arm_tdep (void) _("Various ARM-specific commands."), &showarmcmdlist, "show arm ", 0, &showlist); - /* Sync the opcode insn printer with our register viewer. */ - parse_arm_disassembler_option ("reg-names-std"); - /* Initialize the array that will be passed to add_setshow_enum_cmd(). */ valid_disassembly_styles = XNEWVEC (const char *, @@ -9633,13 +9643,6 @@ _initialize_arm_tdep (void) length = snprintf (rdptr, rest, "%s - %s\n", setname, setdesc); rdptr += length; rest -= length; - /* When we find the default names, tell the disassembler to use - them. */ - if (!strcmp (setname, "std")) - { - disassembly_style = setname; - set_arm_regname_option (i); - } } /* Mark the end of valid options. */ valid_disassembly_styles[num_disassembly_options] = NULL; @@ -9659,8 +9662,7 @@ _initialize_arm_tdep (void) _("Show the disassembly style."), helptext.c_str (), set_disassembly_style_sfunc, - NULL, /* FIXME: i18n: The disassembly style is - \"%s\". */ + show_disassembly_style_sfunc, &setarmcmdlist, &showarmcmdlist); add_setshow_boolean_cmd ("apcs32", no_class, &arm_apcs_32, diff --git a/gdb/disasm.c b/gdb/disasm.c index f419501..a6355aa 100644 --- a/gdb/disasm.c +++ b/gdb/disasm.c @@ -18,13 +18,17 @@ along with this program. If not, see . */ #include "defs.h" +#include "arch-utils.h" #include "target.h" #include "value.h" #include "ui-out.h" #include "disasm.h" #include "gdbcore.h" +#include "gdbcmd.h" #include "dis-asm.h" +#include "cli/cli-decode.h" #include "source.h" +#include "safe-ctype.h" #include /* Disassemble functions. @@ -778,6 +782,7 @@ gdb_disassemble_info (struct gdbarch *gdbarch, struct ui_file *file) di.endian = gdbarch_byte_order (gdbarch); di.endian_code = gdbarch_byte_order_for_code (gdbarch); di.application_data = gdbarch; + di.disassembler_options = gdbarch_disassembler_options (gdbarch); disassemble_init_for_target (&di); return di; } @@ -894,6 +899,8 @@ gdb_buffered_insn_length_init_dis (struct gdbarch *gdbarch, di->endian = gdbarch_byte_order (gdbarch); di->endian_code = gdbarch_byte_order_for_code (gdbarch); + di->application_data = gdbarch; + di->disassembler_options = gdbarch_disassembler_options (gdbarch); disassemble_init_for_target (di); } @@ -910,3 +917,226 @@ gdb_buffered_insn_length (struct gdbarch *gdbarch, return gdbarch_print_insn (gdbarch, addr, &di); } + +/* Remove whitespace and consecutive commas from OPTIONS. */ + +char * +cleanup_disassembler_options (char *options) +{ + char *str; + size_t i, len; + + if (options == NULL) + return NULL; + + /* Strip off all trailing whitespace and commas. */ + for (len = strlen (options); len > 0; len--) + { + if (!ISSPACE (options[len - 1]) && options[len - 1] != ',') + break; + options[len - 1] = '\0'; + } + + /* Convert all remaining whitespace to commas. */ + for (i = 0; options[i] != '\0'; i++) + if (ISSPACE (options[i])) + options[i] = ','; + + /* Remove consecutive commas. */ + for (str = options; *str != '\0'; str++) + if (*str == ',' && *(str + 1) == ',') + { + char *next = str++; + while (*next == ',') + next++; + len = strlen (next); + memmove (str, next, len); + next[len - (size_t)(next - str)] = '\0'; + } + return (strlen (options) != 0) ? options : NULL; +} + +/* Parse OPTIONS looking for ',' seperated disassembler options and + verify each option is valid. Return NULL if all options are valid. + Otherwise, return a pointer to the first invalid disassembler option. */ + +static char * +parse_disassembler_options (const char *options, const char **valid_names) +{ + static char opt[256]; + size_t i; + + if (options == NULL) + return NULL; + + while (*options) + { + /* Copy the current disassembler option into OPT. */ + const char *separator = strchr (options, ','); + if (separator != NULL) + { + strncpy (opt, options, (size_t) (separator - options)); + opt[(size_t) (separator - options)] = 0; + options = separator; + /* Skip to the next disassembler option. */ + while (*options == ',') + options++; + } + else + options = stpcpy (opt, options); + + /* Verify OPT is a valid disassembler option. */ + for (i = 0; valid_names[i] != NULL; i++) + if (strcmp (opt, valid_names[i]) == 0) + break; + if (valid_names[i] == NULL) + return opt; + } + + return NULL; +} + +void +set_disassembler_options (char *args, int from_tty, struct cmd_list_element *c) +{ + struct gdbarch *gdbarch = get_current_arch (); + char *options = cleanup_disassembler_options (*(char **)c->var); + + if (options == NULL) + { + free (gdbarch_disassembler_options (gdbarch)); + set_gdbarch_disassembler_options (gdbarch, NULL); + return; + } + + const char **valid_names = gdbarch_disassembler_options_names (gdbarch); + if (valid_names == NULL) + { + fprintf_filtered (gdb_stdlog, _("\ +'set disassembler-options ...' is not supported on this architecture.\n")); + return; + } + + char *opt = parse_disassembler_options (options, valid_names); + if (opt != NULL) + { + fprintf_filtered (gdb_stdlog, + _("Invalid disassembler option value: '%s'.\n"), opt); + return; + } + + free (gdbarch_disassembler_options (gdbarch)); + set_gdbarch_disassembler_options (gdbarch, xstrdup (options)); +} + +void +show_disassembler_options (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + struct gdbarch *gdbarch = get_current_arch (); + + const char *options = gdbarch_disassembler_options (gdbarch); + if (options == NULL) + options = ""; + + fprintf_filtered (file, _("The current disassembler options are '%s'\n"), + options); + + const char **names = gdbarch_disassembler_options_names (gdbarch); + const char **desc = gdbarch_disassembler_options_descriptions (gdbarch); + + if (names == NULL) + return; + + fprintf_filtered (file, _("\n\ +The following disassembler options are supported for use with\n\ +the 'set disassembler-options