From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 29387 invoked by alias); 11 Dec 2013 18:47:13 -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 29376 invoked by uid 89); 11 Dec 2013 18:47:12 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-la0-f41.google.com Received: from mail-la0-f41.google.com (HELO mail-la0-f41.google.com) (209.85.215.41) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Wed, 11 Dec 2013 18:47:10 +0000 Received: by mail-la0-f41.google.com with SMTP id eo20so4180811lab.28 for ; Wed, 11 Dec 2013 10:47:07 -0800 (PST) X-Received: by 10.152.87.211 with SMTP id ba19mr1679669lab.13.1386787626804; Wed, 11 Dec 2013 10:47:06 -0800 (PST) Received: from localhost ([188.134.22.24]) by mx.google.com with ESMTPSA id c8sm29954131lag.3.2013.12.11.10.47.05 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 11 Dec 2013 10:47:05 -0800 (PST) From: Azat Khuzhin To: gdb-patches@sourceware.org Cc: tromey@redhat.com, eliz@gnu.org, brobecker@adacore.com, palves@redhat.com, Azat Khuzhin Subject: [PATCH v8] gdb: set filename-display shortpath support Date: Wed, 11 Dec 2013 18:47:00 -0000 Message-Id: <1386787611-2952-1-git-send-email-a3at.mail@gmail.com> X-SW-Source: 2013-12/txt/msg00444.txt.bz2 Display only non-common part of filename and compilation directory This will be useful for projects that use separate build directory inside project (like build/cmake and others). gdb/ * source.h (symtab_to_shortpath): Add it. * source.c (filename_display): Add shortpath display. (symtab_to_filename_for_display): Use symtab_to_shortpath. * NEWS (set filename-display shortpath): New entry. gdb/doc/ * gdb.texinfo (Backtrace): Added description of 'filename-display shortpath' in 'set/show backtrace' section. --- V2: fixed coding style issues (thanks to Joel) V3: fixed typo in initial condition for symtab_to_shortpath V4: add changelog into message (lost because of --annotate) V5: use helpers from filenames.h instead of strncmp and SLASH_STRING. (Thanks to Eli, who pointed me out to this.) V6: conding style fixed in changelog and header file (thanks to Tom) V7: add NEWS and doc. V8: add example into doc and fix a typo in symtab_to_shortpath() (searching of path must start from prev_slash_* not from slash_*, found when I was wrote an example, thanks to Eli, who suggested to write it.) gdb/NEWS | 5 +++++ gdb/doc/gdb.texinfo | 21 +++++++++++++++++++++ gdb/source.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++--- gdb/source.h | 3 +++ 4 files changed, 80 insertions(+), 3 deletions(-) diff --git a/gdb/NEWS b/gdb/NEWS index ae84e00..76d8f29 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -3,6 +3,11 @@ *** Changes since GDB 7.6 +* New options + +set filename-display shortpath + Display only non-common part of filenames and compilation directory. + * GDB now supports Fission DWP file format version 2. http://gcc.gnu.org/wiki/DebugFission diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 87d5145..af349ab 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -6852,6 +6852,27 @@ Display an absolute filename. @item show filename-display Show the current way to display filenames. + +@item set filename-display shortpath +Display only non-common part of filenames and compilation directory. + +Example: + +@smallexample +(gdb) set filename-display absolute +(gdb) bt +#0 main (argc=1, argv=0x7fffffffdff8) at /usr/src/foo/bar/main.c:23 +(gdb) set filename-display shortpath +(gdb) bt +#0 main (argc=1, argv=0x7fffffffdfd8) at bar/main.c:23 +(gdb) info source +Current source file is /usr/src/foo/bar/main.c +Compilation directory is /usr/src/foo/.cmake/bar +Located in /usr/src/foo/bar/main.c +... +@end smallexample + + @end table @node Frame Filter Management diff --git a/gdb/source.c b/gdb/source.c index 6234bfc..8f0981f 100644 --- a/gdb/source.c +++ b/gdb/source.c @@ -111,11 +111,13 @@ show_lines_to_list (struct ui_file *file, int from_tty, static const char filename_display_basename[] = "basename"; static const char filename_display_relative[] = "relative"; static const char filename_display_absolute[] = "absolute"; +static const char filename_display_shortpath[] = "shortpath"; static const char *const filename_display_kind_names[] = { filename_display_basename, filename_display_relative, filename_display_absolute, + filename_display_shortpath, NULL }; @@ -1137,6 +1139,48 @@ symtab_to_fullname (struct symtab *s) /* See commentary in source.h. */ const char * +symtab_to_shortpath (struct symtab *symtab) +{ + const char *prev_slash_name = symtab->filename; + const char *prev_slash_dir = symtab->dirname; + const char *slash_name = symtab->filename; + const char *slash_dir = symtab->dirname; + const char *shortpath = slash_name; + + if (slash_dir == NULL) + return shortpath; + + for (; *slash_name && *slash_dir; slash_name++, slash_dir++) + { + size_t min_part_len; + + if (IS_DIR_SEPARATOR (*slash_name) != IS_DIR_SEPARATOR (*slash_dir)) + break; + if (!IS_DIR_SEPARATOR (*slash_name)) + continue; + + ++slash_name; + ++slash_dir; + if (!*slash_name || !*slash_dir) + break; + + min_part_len = min (slash_name - prev_slash_name, + slash_dir - prev_slash_dir); + if (filename_ncmp (prev_slash_name, prev_slash_dir, min_part_len)) + break; + + shortpath = slash_name; + + prev_slash_name = slash_name; + prev_slash_dir = slash_dir; + } + + return shortpath; +} + +/* See commentary in source.h. */ + +const char * symtab_to_filename_for_display (struct symtab *symtab) { if (filename_display_string == filename_display_basename) @@ -1145,6 +1189,8 @@ symtab_to_filename_for_display (struct symtab *symtab) return symtab_to_fullname (symtab); else if (filename_display_string == filename_display_relative) return symtab->filename; + else if (filename_display_string == filename_display_shortpath) + return symtab_to_shortpath (symtab); else internal_error (__FILE__, __LINE__, _("invalid filename_display_string")); } @@ -2093,9 +2139,11 @@ is not specified, print all substitution rules."), Set how to display filenames."), _("\ Show how to display filenames."), _("\ filename-display can be:\n\ - basename - display only basename of a filename\n\ - relative - display a filename relative to the compilation directory\n\ - absolute - display an absolute filename\n\ + basename - display only basename of a filename\n\ + relative - display a filename relative to the compilation directory\n\ + absolute - display an absolute filename\n\ + shortpath - display only non-common part of filenames and compilation \ +directory\n\ By default, relative filenames are displayed."), NULL, show_filename_display_string, diff --git a/gdb/source.h b/gdb/source.h index 33cad09..b94c88f 100644 --- a/gdb/source.h +++ b/gdb/source.h @@ -52,6 +52,9 @@ extern char *rewrite_source_path (const char *path); extern const char *symtab_to_fullname (struct symtab *s); +/* Returns only non-common part of filename and compilation directory. */ +extern const char *symtab_to_shortpath (struct symtab *symtab); + /* Returns filename without the compile directory part, basename or absolute filename. It depends on 'set filename-display' value. */ extern const char *symtab_to_filename_for_display (struct symtab *symtab); -- 1.8.4.3