X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fsymtab.c;h=791ce11a7372c11583eec384b5d44bf13d4366ea;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=4e9f91056b8889383b38aca8807fccc4e6ed6706;hpb=70bc38f51381698804566504e25d197e8e731d2d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/symtab.c b/gdb/symtab.c index 4e9f91056b..791ce11a73 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -595,7 +595,7 @@ gdb_mangle_name (struct type *type, int method_id, int signature_id) struct fn_field *method = &f[signature_id]; const char *field_name = TYPE_FN_FIELDLIST_NAME (type, method_id); const char *physname = TYPE_FN_FIELD_PHYSNAME (f, signature_id); - const char *newname = TYPE_NAME (type); + const char *newname = type->name (); /* Does the form of physname indicate that it is the full mangled name of a constructor (not just the args)? */ @@ -667,44 +667,27 @@ gdb_mangle_name (struct type *type, int method_id, int signature_id) return (mangled_name); } -/* Set the demangled name of GSYMBOL to NAME. NAME must be already - correctly allocated. */ +/* See symtab.h. */ void -symbol_set_demangled_name (struct general_symbol_info *gsymbol, - const char *name, - struct obstack *obstack) +general_symbol_info::set_demangled_name (const char *name, + struct obstack *obstack) { - if (gsymbol->language () == language_ada) + if (language () == language_ada) { if (name == NULL) { - gsymbol->ada_mangled = 0; - gsymbol->language_specific.obstack = obstack; + ada_mangled = 0; + language_specific.obstack = obstack; } else { - gsymbol->ada_mangled = 1; - gsymbol->language_specific.demangled_name = name; + ada_mangled = 1; + language_specific.demangled_name = name; } } else - gsymbol->language_specific.demangled_name = name; -} - -/* Return the demangled name of GSYMBOL. */ - -const char * -symbol_get_demangled_name (const struct general_symbol_info *gsymbol) -{ - if (gsymbol->language () == language_ada) - { - if (!gsymbol->ada_mangled) - return NULL; - /* Fall through. */ - } - - return gsymbol->language_specific.demangled_name; + language_specific.demangled_name = name; } @@ -722,7 +705,7 @@ general_symbol_info::set_language (enum language language, || language == language_objc || language == language_fortran) { - symbol_set_demangled_name (this, NULL, obstack); + set_demangled_name (NULL, obstack); } else if (language == language_ada) { @@ -824,7 +807,7 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol, { const struct language_defn *lang = language_def (gsymbol->language ()); - language_sniff_from_mangled_name (lang, mangled, &demangled); + lang->sniff_from_mangled_name (mangled, &demangled); return demangled; } @@ -833,7 +816,7 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol, enum language l = (enum language) i; const struct language_defn *lang = language_def (l); - if (language_sniff_from_mangled_name (lang, mangled, &demangled)) + if (lang->sniff_from_mangled_name (mangled, &demangled)) { gsymbol->m_language = l; return demangled; @@ -872,7 +855,7 @@ general_symbol_info::compute_and_set_names (gdb::string_view linkage_name, m_name = obstack_strndup (&per_bfd->storage_obstack, linkage_name.data (), linkage_name.length ()); - symbol_set_demangled_name (this, NULL, &per_bfd->storage_obstack); + set_demangled_name (NULL, &per_bfd->storage_obstack); return; } @@ -962,8 +945,7 @@ general_symbol_info::compute_and_set_names (gdb::string_view linkage_name, m_language = (*slot)->language; m_name = (*slot)->mangled.data (); - symbol_set_demangled_name (this, (*slot)->demangled.get (), - &per_bfd->storage_obstack); + set_demangled_name ((*slot)->demangled.get (), &per_bfd->storage_obstack); } /* See symtab.h. */ @@ -978,8 +960,9 @@ general_symbol_info::natural_name () const case language_go: case language_objc: case language_fortran: - if (symbol_get_demangled_name (this) != NULL) - return symbol_get_demangled_name (this); + case language_rust: + if (language_specific.demangled_name != nullptr) + return language_specific.demangled_name; break; case language_ada: return ada_decode_symbol (this); @@ -1003,7 +986,8 @@ general_symbol_info::demangled_name () const case language_go: case language_objc: case language_fortran: - dem_name = symbol_get_demangled_name (this); + case language_rust: + dem_name = language_specific.demangled_name; break; case language_ada: dem_name = ada_decode_symbol (this); @@ -1292,9 +1276,7 @@ get_symbol_cache (struct program_space *pspace) static void set_symbol_cache_size (unsigned int new_size) { - struct program_space *pspace; - - ALL_PSPACES (pspace) + for (struct program_space *pspace : program_spaces) { struct symbol_cache *cache = symbol_cache_key.get (pspace); @@ -1542,9 +1524,7 @@ symbol_cache_dump (const struct symbol_cache *cache) static void maintenance_print_symbol_cache (const char *args, int from_tty) { - struct program_space *pspace; - - ALL_PSPACES (pspace) + for (struct program_space *pspace : program_spaces) { struct symbol_cache *cache; @@ -1568,9 +1548,7 @@ maintenance_print_symbol_cache (const char *args, int from_tty) static void maintenance_flush_symbol_cache (const char *args, int from_tty) { - struct program_space *pspace; - - ALL_PSPACES (pspace) + for (struct program_space *pspace : program_spaces) { symbol_cache_flush (pspace); } @@ -1613,9 +1591,7 @@ symbol_cache_stats (struct symbol_cache *cache) static void maintenance_print_symbol_cache_statistics (const char *args, int from_tty) { - struct program_space *pspace; - - ALL_PSPACES (pspace) + for (struct program_space *pspace : program_spaces) { struct symbol_cache *cache; @@ -1854,9 +1830,9 @@ demangle_for_lookup (const char *name, enum language lang, /* If we were given a non-mangled name, canonicalize it according to the language (so far only for C++). */ - std::string canon = cp_canonicalize_string (name); - if (!canon.empty ()) - return storage.swap_string (canon); + gdb::unique_xmalloc_ptr canon = cp_canonicalize_string (name); + if (canon != nullptr) + return storage.set_malloc_ptr (std::move (canon)); } else if (lang == language_d) { @@ -1879,7 +1855,7 @@ demangle_for_lookup (const char *name, enum language lang, unsigned int search_name_hash (enum language language, const char *search_name) { - return language_def (language)->la_search_name_hash (search_name); + return language_def (language)->search_name_hash (search_name); } /* See symtab.h. @@ -1941,7 +1917,7 @@ lookup_language_this (const struct language_defn *lang, if (symbol_lookup_debug > 1) { - struct objfile *objfile = lookup_objfile_from_block (block); + struct objfile *objfile = block_objfile (block); fprintf_unfiltered (gdb_stdlog, "lookup_language_this (%s, %s (objfile %s))", @@ -1990,14 +1966,14 @@ check_field (struct type *type, const char *name, /* The type may be a stub. */ type = check_typedef (type); - for (i = TYPE_NFIELDS (type) - 1; i >= TYPE_N_BASECLASSES (type); i--) + for (i = type->num_fields () - 1; i >= TYPE_N_BASECLASSES (type); i--) { const char *t_field_name = TYPE_FIELD_NAME (type, i); if (t_field_name && (strcmp_iw (t_field_name, name) == 0)) { is_a_field_of_this->type = type; - is_a_field_of_this->field = &TYPE_FIELD (type, i); + is_a_field_of_this->field = &type->field (i); return 1; } } @@ -2036,7 +2012,8 @@ lookup_symbol_aux (const char *name, symbol_name_match_type match_type, if (symbol_lookup_debug) { - struct objfile *objfile = lookup_objfile_from_block (block); + struct objfile *objfile = (block == nullptr + ? nullptr : block_objfile (block)); fprintf_unfiltered (gdb_stdlog, "lookup_symbol_aux (%s, %s (objfile %s), %s, %s)\n", @@ -2086,11 +2063,11 @@ lookup_symbol_aux (const char *name, symbol_name_match_type match_type, /* I'm not really sure that type of this can ever be typedefed; just be safe. */ t = check_typedef (t); - if (TYPE_CODE (t) == TYPE_CODE_PTR || TYPE_IS_REFERENCE (t)) + if (t->code () == TYPE_CODE_PTR || TYPE_IS_REFERENCE (t)) t = TYPE_TARGET_TYPE (t); - if (TYPE_CODE (t) != TYPE_CODE_STRUCT - && TYPE_CODE (t) != TYPE_CODE_UNION) + if (t->code () != TYPE_CODE_STRUCT + && t->code () != TYPE_CODE_UNION) error (_("Internal error: `%s' is not an aggregate"), langdef->la_name_of_this); @@ -2181,32 +2158,6 @@ lookup_local_symbol (const char *name, /* See symtab.h. */ -struct objfile * -lookup_objfile_from_block (const struct block *block) -{ - if (block == NULL) - return NULL; - - block = block_global_block (block); - /* Look through all blockvectors. */ - for (objfile *obj : current_program_space->objfiles ()) - { - for (compunit_symtab *cust : obj->compunits ()) - if (block == BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), - GLOBAL_BLOCK)) - { - if (obj->separate_debug_objfile_backlink) - obj = obj->separate_debug_objfile_backlink; - - return obj; - } - } - - return NULL; -} - -/* See symtab.h. */ - struct symbol * lookup_symbol_in_block (const char *name, symbol_name_match_type match_type, const struct block *block, @@ -2216,7 +2167,8 @@ lookup_symbol_in_block (const char *name, symbol_name_match_type match_type, if (symbol_lookup_debug > 1) { - struct objfile *objfile = lookup_objfile_from_block (block); + struct objfile *objfile = (block == nullptr + ? nullptr : block_objfile (block)); fprintf_unfiltered (gdb_stdlog, "lookup_symbol_in_block (%s, %s (objfile %s), %s)", @@ -2506,7 +2458,8 @@ lookup_symbol_in_static_block (const char *name, if (symbol_lookup_debug) { - struct objfile *objfile = lookup_objfile_from_block (static_block); + struct objfile *objfile = (block == nullptr + ? nullptr : block_objfile (block)); fprintf_unfiltered (gdb_stdlog, "lookup_symbol_in_static_block (%s, %s (objfile %s)," @@ -2728,7 +2681,14 @@ lookup_global_symbol (const char *name, return { sym, global_block }; } - struct objfile *objfile = lookup_objfile_from_block (block); + struct objfile *objfile = nullptr; + if (block != nullptr) + { + objfile = block_objfile (block); + if (objfile->separate_debug_objfile_backlink != nullptr) + objfile = objfile->separate_debug_objfile_backlink; + } + block_symbol bs = lookup_global_or_static_symbol (name, GLOBAL_BLOCK, objfile, domain); if (better_symbol (sym, bs.symbol, domain) == sym) @@ -2762,7 +2722,7 @@ symbol_matches_domain (enum language symbol_language, struct type * lookup_transparent_type (const char *name) { - return current_language->la_lookup_transparent_type (name); + return current_language->lookup_transparent_type (name); } /* A helper for basic_lookup_transparent_type that interfaces with the @@ -4676,7 +4636,7 @@ global_symbol_searcher::add_matching_symbols members. We only want to skip enums here. */ && !(SYMBOL_CLASS (sym) == LOC_CONST - && (TYPE_CODE (SYMBOL_TYPE (sym)) + && (SYMBOL_TYPE (sym)->code () == TYPE_CODE_ENUM)) && (!treg.has_value () || treg_matches_sym_type_name (*treg, sym))) @@ -4882,7 +4842,7 @@ symbol_to_info_string (struct symbol *sym, int block, For the struct printing case below, things are worse, we force printing of the ";" in this function, which is going to be wrong for languages that don't require a ";" between statements. */ - if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_TYPEDEF) + if (SYMBOL_TYPE (sym)->code () == TYPE_CODE_TYPEDEF) typedef_print (SYMBOL_TYPE (sym), sym, &tmp_stream); else type_print (SYMBOL_TYPE (sym), "", &tmp_stream, -1); @@ -5300,7 +5260,7 @@ compare_symbol_name (const char *symbol_name, language symbol_language, /* See symtab.h. */ -void +bool completion_list_add_name (completion_tracker &tracker, language symbol_language, const char *symname, @@ -5312,7 +5272,7 @@ completion_list_add_name (completion_tracker &tracker, /* Clip symbols that cannot match. */ if (!compare_symbol_name (symname, symbol_language, lookup_name, match_res)) - return; + return false; /* Refresh SYMNAME from the match string. It's potentially different depending on language. (E.g., on Ada, the match may be @@ -5336,6 +5296,8 @@ completion_list_add_name (completion_tracker &tracker, tracker.add_completion (std::move (completion), &match_res.match_for_lcd, text, word); } + + return true; } /* completion_list_add_name wrapper for struct symbol. */ @@ -5346,9 +5308,10 @@ completion_list_add_symbol (completion_tracker &tracker, const lookup_name_info &lookup_name, const char *text, const char *word) { - completion_list_add_name (tracker, sym->language (), - sym->natural_name (), - lookup_name, text, word); + if (!completion_list_add_name (tracker, sym->language (), + sym->natural_name (), + lookup_name, text, word)) + return; /* C++ function symbols include the parameters within both the msymbol name and the symbol name. The problem is that the msymbol name will @@ -5365,10 +5328,10 @@ completion_list_add_symbol (completion_tracker &tracker, /* The call to canonicalize returns the empty string if the input string is already in canonical form, thanks to this we don't remove the symbol we just added above. */ - std::string str + gdb::unique_xmalloc_ptr str = cp_canonicalize_string_no_typedefs (sym->natural_name ()); - if (!str.empty ()) - tracker.remove_completion (str.c_str ()); + if (str != nullptr) + tracker.remove_completion (str.get ()); } } @@ -5508,11 +5471,11 @@ completion_list_add_fields (completion_tracker &tracker, if (SYMBOL_CLASS (sym) == LOC_TYPEDEF) { struct type *t = SYMBOL_TYPE (sym); - enum type_code c = TYPE_CODE (t); + enum type_code c = t->code (); int j; if (c == TYPE_CODE_UNION || c == TYPE_CODE_STRUCT) - for (j = TYPE_N_BASECLASSES (t); j < TYPE_NFIELDS (t); j++) + for (j = TYPE_N_BASECLASSES (t); j < t->num_fields (); j++) if (TYPE_FIELD_NAME (t, j)) completion_list_add_name (tracker, sym->language (), TYPE_FIELD_NAME (t, j), @@ -5525,7 +5488,7 @@ completion_list_add_fields (completion_tracker &tracker, bool symbol_is_function_or_method (symbol *sym) { - switch (TYPE_CODE (SYMBOL_TYPE (sym))) + switch (SYMBOL_TYPE (sym)->code ()) { case TYPE_CODE_FUNC: case TYPE_CODE_METHOD: @@ -5625,7 +5588,7 @@ add_symtab_completions (struct compunit_symtab *cust, if (code == TYPE_CODE_UNDEF || (SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN - && TYPE_CODE (SYMBOL_TYPE (sym)) == code)) + && SYMBOL_TYPE (sym)->code () == code)) completion_list_add_symbol (tracker, sym, lookup_name, text, word); @@ -5776,7 +5739,7 @@ default_collect_symbol_completion_matches_break_on sym_text, word); } else if (SYMBOL_DOMAIN (sym) == STRUCT_DOMAIN - && TYPE_CODE (SYMBOL_TYPE (sym)) == code) + && SYMBOL_TYPE (sym)->code () == code) completion_list_add_symbol (tracker, sym, lookup_name, sym_text, word); } @@ -6379,42 +6342,6 @@ initialize_ordinary_address_classes (void) -/* Initialize the symbol SYM, and mark it as being owned by an objfile. */ - -void -initialize_objfile_symbol (struct symbol *sym) -{ - SYMBOL_OBJFILE_OWNED (sym) = 1; - SYMBOL_SECTION (sym) = -1; -} - -/* Allocate and initialize a new 'struct symbol' on OBJFILE's - obstack. */ - -struct symbol * -allocate_symbol (struct objfile *objfile) -{ - struct symbol *result = new (&objfile->objfile_obstack) symbol (); - - initialize_objfile_symbol (result); - - return result; -} - -/* Allocate and initialize a new 'struct template_symbol' on OBJFILE's - obstack. */ - -struct template_symbol * -allocate_template_symbol (struct objfile *objfile) -{ - struct template_symbol *result; - - result = new (&objfile->objfile_obstack) template_symbol (); - initialize_objfile_symbol (result); - - return result; -} - /* See symtab.h. */ struct objfile *