From 136e1c30782e1a6d7580edf452facbfcb777fec2 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Tue, 17 Jan 2012 20:30:22 +0000 Subject: [PATCH] * linespec.c (decode_line_internal): Don't call symtabs_from_filename if we know we don't have a file name to look for. --- gdb/ChangeLog | 5 +++++ gdb/linespec.c | 50 +++++++++++++++++++++++++++++++------------------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5ee25dd..5108a3c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2012-01-17 Doug Evans + + * linespec.c (decode_line_internal): Don't call symtabs_from_filename + if we know we don't have a file name to look for. + 2012-01-17 Pedro Alves * dwarf2-frame.c (dwarf2_frame_cfa): Throw NOT_AVAILABLE_ERROR, if diff --git a/gdb/linespec.c b/gdb/linespec.c index 55cfec3..0782c54 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -894,32 +894,44 @@ decode_line_internal (struct linespec_state *self, char **argptr) first_half = p = locate_first_half (argptr, &is_quote_enclosed); /* First things first: if ARGPTR starts with a filename, get its - symtab and strip the filename from ARGPTR. */ - TRY_CATCH (file_exception, RETURN_MASK_ERROR) + symtab and strip the filename from ARGPTR. + Avoid calling symtab_from_filename if we know can, + it can be expensive. */ + + if (*p != '\0') { - self->file_symtabs = symtabs_from_filename (argptr, p, is_quote_enclosed, - &self->user_filename); - } + TRY_CATCH (file_exception, RETURN_MASK_ERROR) + { + self->file_symtabs = symtabs_from_filename (argptr, p, + is_quote_enclosed, + &self->user_filename); + } - if (VEC_empty (symtab_p, self->file_symtabs)) + if (file_exception.reason >= 0) + { + /* Check for single quotes on the non-filename part. */ + is_quoted = (**argptr + && strchr (get_gdb_completer_quote_characters (), + **argptr) != NULL); + if (is_quoted) + end_quote = skip_quoted (*argptr); + + /* Locate the next "half" of the linespec. */ + first_half = p = locate_first_half (argptr, &is_quote_enclosed); + } + + if (VEC_empty (symtab_p, self->file_symtabs)) + { + /* A NULL entry means to use GLOBAL_DEFAULT_SYMTAB. */ + VEC_safe_push (symtab_p, self->file_symtabs, NULL); + } + } + else { /* A NULL entry means to use GLOBAL_DEFAULT_SYMTAB. */ VEC_safe_push (symtab_p, self->file_symtabs, NULL); } - if (file_exception.reason >= 0) - { - /* Check for single quotes on the non-filename part. */ - is_quoted = (**argptr - && strchr (get_gdb_completer_quote_characters (), - **argptr) != NULL); - if (is_quoted) - end_quote = skip_quoted (*argptr); - - /* Locate the next "half" of the linespec. */ - first_half = p = locate_first_half (argptr, &is_quote_enclosed); - } - /* Check if this is an Objective-C method (anything that starts with a '+' or '-' and a '['). */ if (is_objc_method_format (p)) -- 2.7.4