This is the mail archive of the gdb-cvs@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Use search_domain::FUNCTIONS_DOMAIN when setting breakpoints


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=56d87ef769e6adab27af77fa86ea294ee7c6ee72

commit 56d87ef769e6adab27af77fa86ea294ee7c6ee72
Author: Pedro Alves <palves@redhat.com>
Date:   Wed Nov 8 14:22:34 2017 +0000

    Use search_domain::FUNCTIONS_DOMAIN when setting breakpoints
    
    While working on C++ support for wild matching, I noticed that
    attaching to my system's Firefox (which uses .gdb_index), setting a
    break at main and bailing, like:
    
      $ gdb --batch -q -p `pidof firefox` -ex "b main"
    
    would get substancially slower.  It'd take around 20s when currently
    it takes 3s.
    
    The problem is that gdb would expand more symtabs than currently,
    because Firefox has symbols named like "nsHtml5Atoms::main",
    "nsGkAtoms::main", etc., which given wild matching, match.
    
    However, these are not function symbols, [they're "(nsIAtom *)"], so
    it seems silly that they'd cause expansion in the first place.
    
    The .gdb_index code (dwarf2read.c:dw2_expand_marked_cus) filters out
    symbols matches based on search_domain:
    
      case VARIABLES_DOMAIN:
        if (symbol_kind != GDB_INDEX_SYMBOL_KIND_VARIABLE)
          continue;
        break;
      case FUNCTIONS_DOMAIN:
        if (symbol_kind != GDB_INDEX_SYMBOL_KIND_FUNCTION)
          continue;
        break;
      case TYPES_DOMAIN:
        if (symbol_kind != GDB_INDEX_SYMBOL_KIND_TYPE)
          continue;
        break;
      default:
        break;
    
    however, we're currently passing down search_domain::ALL_DOMAIN when
    we know we're looking for functions, for no good reason.  This patch
    fixes that.
    
    It seems like search_domain is underutilized throughout, but I'll
    leave using it more for another pass.
    
    gdb/ChangeLog:
    2017-11-08  Pedro Alves  <palves@redhat.com>
    
    	* linespec.c (iterate_over_all_matching_symtabs): Add
    	search_domain parameter.  Pass it down to expand_symtabs_matching.
    	(decode_objc): Request FUNCTIONS_DOMAIN symbols only.
    	(lookup_prefix_sym): Adjust by passing ALL_DOMAIN as
    	search_domain.
    	(add_all_symbol_names_from_pspace): Add search_domain parameter.
    	Pass it down.
    	(find_method, find_function_symbols): Request FUNCTIONS_DOMAIN
    	symbols.
    	(add_matching_symbols_to_info): Add search_domain parameter.  Pass
    	it down.

Diff:
---
 gdb/ChangeLog  | 14 ++++++++++++++
 gdb/linespec.c | 32 ++++++++++++++++++++------------
 2 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 3150826..38cfccb 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,19 @@
 2017-11-08  Pedro Alves  <palves@redhat.com>
 
+	* linespec.c (iterate_over_all_matching_symtabs): Add
+	search_domain parameter.  Pass it down to expand_symtabs_matching.
+	(decode_objc): Request FUNCTIONS_DOMAIN symbols only.
+	(lookup_prefix_sym): Adjust by passing ALL_DOMAIN as
+	search_domain.
+	(add_all_symbol_names_from_pspace): Add search_domain parameter.
+	Pass it down.
+	(find_method, find_function_symbols): Request FUNCTIONS_DOMAIN
+	symbols.
+	(add_matching_symbols_to_info): Add search_domain parameter.  Pass
+	it down.
+
+2017-11-08  Pedro Alves  <palves@redhat.com>
+
 	* ada-lang.c (ada_make_symbol_completion_list): Remove text and
 	text_len locals and don't pass them down.
 	* symtab.c (completion_list_add_name): Remove
diff --git a/gdb/linespec.c b/gdb/linespec.c
index 05218bd..3f7f171 100644
--- a/gdb/linespec.c
+++ b/gdb/linespec.c
@@ -371,12 +371,14 @@ static int symbol_to_sal (struct symtab_and_line *result,
 
 static void add_matching_symbols_to_info (const char *name,
 					  symbol_name_match_type name_match_type,
+					  enum search_domain search_domain,
 					  struct collect_info *info,
 					  struct program_space *pspace);
 
 static void add_all_symbol_names_from_pspace (struct collect_info *info,
 					      struct program_space *pspace,
-					      VEC (const_char_ptr) *names);
+					      VEC (const_char_ptr) *names,
+					      enum search_domain search_domain);
 
 static VEC (symtab_ptr) *
   collect_symtabs_from_filename (const char *file,
@@ -1106,6 +1108,7 @@ iterate_over_all_matching_symtabs
   (struct linespec_state *state,
    const lookup_name_info &lookup_name,
    const domain_enum name_domain,
+   enum search_domain search_domain,
    struct program_space *search_pspace, bool include_inline,
    gdb::function_view<symbol_found_callback_ftype> callback)
 {
@@ -1130,7 +1133,7 @@ iterate_over_all_matching_symtabs
 						  NULL,
 						  lookup_name,
 						  NULL, NULL,
-						  ALL_DOMAIN);
+						  search_domain);
 
       ALL_OBJFILE_COMPUNITS (objfile, cu)
 	{
@@ -3454,7 +3457,8 @@ decode_objc (struct linespec_state *self, linespec_p ls, const char *arg)
       return {};
     }
 
-  add_all_symbol_names_from_pspace (&info, NULL, symbol_names);
+  add_all_symbol_names_from_pspace (&info, NULL, symbol_names,
+				    FUNCTIONS_DOMAIN);
 
   std::vector<symtab_and_line> values;
   if (!VEC_empty (symbolp, info.result.symbols)
@@ -3584,11 +3588,11 @@ lookup_prefix_sym (struct linespec_state *state, VEC (symtab_ptr) *file_symtabs,
       if (elt == NULL)
 	{
 	  iterate_over_all_matching_symtabs (state, lookup_name,
-					     STRUCT_DOMAIN, NULL, false,
-					     collector);
+					     STRUCT_DOMAIN, ALL_DOMAIN,
+					     NULL, false, collector);
 	  iterate_over_all_matching_symtabs (state, lookup_name,
-					     VAR_DOMAIN, NULL, false,
-					     collector);
+					     VAR_DOMAIN, ALL_DOMAIN,
+					     NULL, false, collector);
 	}
       else
 	{
@@ -3672,7 +3676,8 @@ compare_msymbols (const void *a, const void *b)
 static void
 add_all_symbol_names_from_pspace (struct collect_info *info,
 				  struct program_space *pspace,
-				  VEC (const_char_ptr) *names)
+				  VEC (const_char_ptr) *names,
+				  enum search_domain search_domain)
 {
   int ix;
   const char *iter;
@@ -3680,7 +3685,7 @@ add_all_symbol_names_from_pspace (struct collect_info *info,
   for (ix = 0; VEC_iterate (const_char_ptr, names, ix, iter); ++ix)
     add_matching_symbols_to_info (iter,
 				  symbol_name_match_type::FULL,
-				  info, pspace);
+				  search_domain, info, pspace);
 }
 
 static void
@@ -3787,7 +3792,8 @@ find_method (struct linespec_state *self, VEC (symtab_ptr) *file_symtabs,
 	  /* We have a list of candidate symbol names, so now we
 	     iterate over the symbol tables looking for all
 	     matches in this pspace.  */
-	  add_all_symbol_names_from_pspace (&info, pspace, result_names);
+	  add_all_symbol_names_from_pspace (&info, pspace, result_names,
+					    FUNCTIONS_DOMAIN);
 
 	  VEC_truncate (typep, superclass_vec, 0);
 	  last_result_len = VEC_length (const_char_ptr, result_names);
@@ -3947,9 +3953,10 @@ find_function_symbols (struct linespec_state *state,
   find_imps (name, &symbol_names);
   if (!VEC_empty (const_char_ptr, symbol_names))
     add_all_symbol_names_from_pspace (&info, state->search_pspace,
-				      symbol_names);
+				      symbol_names, FUNCTIONS_DOMAIN);
   else
     add_matching_symbols_to_info (name, symbol_name_match_type::WILD,
+				  FUNCTIONS_DOMAIN,
 				  &info, state->search_pspace);
 
   do_cleanups (cleanup);
@@ -4560,6 +4567,7 @@ search_minsyms_for_name (struct collect_info *info,
 static void
 add_matching_symbols_to_info (const char *name,
 			      symbol_name_match_type name_match_type,
+			      enum search_domain search_domain,
 			      struct collect_info *info,
 			      struct program_space *pspace)
 {
@@ -4573,7 +4581,7 @@ add_matching_symbols_to_info (const char *name,
       if (elt == NULL)
 	{
 	  iterate_over_all_matching_symtabs (info->state, lookup_name,
-					     VAR_DOMAIN,
+					     VAR_DOMAIN, search_domain,
 					     pspace, true, [&] (symbol *sym)
 	    { return info->add_symbol (sym); });
 	  search_minsyms_for_name (info, lookup_name, pspace, NULL);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]