d12307c199
As Pedro suggested on gdb-patches@ (see https://sourceware.org/ml/gdb-patches/2015-05/msg00714.html), this change makes symbol lookup functions return a structure that includes both the symbol found and the block in which it was found. This makes it possible to get rid of the block_found global variable and thus makes block hunting explicit. gdb/ * ada-exp.y (write_object_renaming): Replace struct ada_symbol_info with struct block_symbol. Update field references accordingly. (block_lookup, select_possible_type_sym): Likewise. (find_primitive_type): Likewise. Also update call to ada_lookup_symbol to extract the symbol itself. (write_var_or_type, write_name_assoc): Likewise. * ada-lang.h (struct ada_symbol_info): Remove. (ada_lookup_symbol_list): Replace struct ada_symbol_info with struct block_symbol. (ada_lookup_encoded_symbol, user_select_syms): Likewise. (ada_lookup_symbol): Return struct block_symbol instead of a mere symbol. * ada-lang.c (defns_collected): Replace struct ada_symbol_info with struct block_symbol. (resolve_subexp, ada_resolve_function, sort_choices, user_select_syms, is_nonfunction, add_defn_to_vec, num_defns_collected, defns_collected, symbols_are_identical_enums, remove_extra_symbols, remove_irrelevant_renamings, add_lookup_symbol_list_worker, ada_lookup_symbol_list, ada_iterate_over_symbols, ada_lookup_encoded_symbol, get_var_value): Likewise. (ada_lookup_symbol): Return a block_symbol instead of a mere symbol. Replace struct ada_symbol_info with struct block_symbol. (ada_lookup_symbol_nonlocal): Likewise. (standard_lookup): Make block passing explicit through lookup_symbol_in_language. * ada-tasks.c (get_tcb_types_info): Update the calls to lookup_symbol_in_language to extract the mere symbol out of the returned value. (ada_tasks_inferior_data_sniffer): Likewise. * ax-gdb.c (gen_static_field): Likewise for the call to lookup_symbol. (gen_maybe_namespace_elt): Deal with struct symbol_in_block from lookup functions. (gen_expr): Likewise. * c-exp.y: Likewise. Remove uses of block_found. (lex_one_token, classify_inner_name, c_print_token): Likewise. (classify_name): Likewise. Rename the "sym" local variable to "bsym". * c-valprint.c (print_unpacked_pointer): Likewise. * compile/compile-c-symbols.c (convert_symbol_sym): Promote the "sym" parameter from struct symbol * to struct block_symbol. Use it to remove uses of block_found. Deal with struct symbol_in_block from lookup functions. (gcc_convert_symbol): Likewise. Update the call to convert_symbol_sym. * compile/compile-object-load.c (compile_object_load): Deal with struct symbol_in_block from lookup functions. * cp-namespace.c (cp_lookup_nested_symbol_1, cp_lookup_nested_symbol, cp_lookup_bare_symbol, cp_search_static_and_baseclasses, cp_lookup_symbol_in_namespace, cp_lookup_symbol_via_imports, cp_lookup_symbol_imports_or_template, cp_lookup_symbol_via_all_imports, cp_lookup_symbol_namespace, lookup_namespace_scope, cp_lookup_nonlocal, find_symbol_in_baseclass): Return struct symbol_in_block instead of mere symbols and deal with struct symbol_in_block from lookup functions. * cp-support.c (inspect_type, replace_typedefs, cp_lookup_rtti_type): Deal with struct symbol_in_block from lookup functions. * cp-support.h (cp_lookup_symbol_nonlocal, cp_lookup_symbol_from_namespace, cp_lookup_symbol_imports_or_template, cp_lookup_nested_symbol): Return struct symbol_in_block instead of mere symbols. * d-exp.y (d_type_from_name, d_module_from_name, push_variable, push_module_name): Deal with struct symbol_in_block from lookup functions. Remove uses of block_found. * eval.c (evaluate_subexp_standard): Update call to cp_lookup_symbol_namespace. * f-exp.y: Deal with struct symbol_in_block from lookup functions. Remove uses of block_found. (yylex): Likewise. * gdbtypes.c (lookup_typename, lookup_struct, lookup_union, lookup_enum, lookup_template_type, check_typedef): Deal with struct symbol_in_block from lookup functions. * guile/scm-frame.c (gdbscm_frame_read_var): Likewise. * guile/scm-symbol.c (gdbscm_lookup_symbol): Likewise. (gdbscm_lookup_global_symbol): Likewise. * gnu-v3-abi.c (gnuv3_get_typeid_type): Likewise. * go-exp.y: Likewise. Remove uses of block_found. (package_name_p, classify_packaged_name, classify_name): Likewise. * infrun.c (insert_exception_resume_breakpoint): Likewise. * jv-exp.y (push_variable): Likewise. * jv-lang.c (java_lookup_class, get_java_object_type): Likewise. * language.c (language_bool_type): Likewise. * language.h (struct language_defn): Update la_lookup_symbol_nonlocal to return a struct symbol_in_block rather than a mere symbol. * linespec.c (find_label_symbols): Deal with struct symbol_in_block from lookup functions. * m2-exp.y: Likewise. Remove uses of block_found. (yylex): Likewise. * mi/mi-cmd-stack.c (list_args_or_locals): Likewise. * objc-lang.c (lookup_struct_typedef, find_imps): Likewise. * p-exp.y: Likewise. Remove uses of block_found. (yylex): Likewise. * p-valprint.c (pascal_val_print): Likewise. * parse.c (write_dollar_variable): Likewise. Remove uses of block_found. * parser-defs.h (struct symtoken): Turn the SYM field into a struct symbol_in_block. * printcmd.c (address_info): Deal with struct symbol_in_block from lookup functions. * python/py-frame.c (frapy_read_var): Likewise. * python/py-symbol.c (gdbpy_lookup_symbol, gdbpy_lookup_global_symbol): Likewise. * skip.c (skip_function_command): Likewise. * solib-darwin.c (darwin_lookup_lib_symbol): Return a struct symbol_in_block instead of a mere symbol. * solib-spu.c (spu_lookup_lib_symbol): Likewise. * solib-svr4.c (elf_lookup_lib_symbol): Likewise. * solib.c (solib_global_lookup): Likewise. * solist.h (solib_global_lookup): Likewise. (struct target_so_ops): Update lookup_lib_global_symbol to return a struct symbol_in_block rather than a mere symbol. * source.c (select_source_symtab): Deal with struct symbol_in_block from lookup functions. * stack.c (print_frame_args, iterate_over_block_arg_vars): Likewise. * symfile.c (set_initial_language): Likewise. * symtab.c (SYMBOL_LOOKUP_FAILED): Turn into a struct symbol_in_block. (SYMBOL_LOOKUP_FAILED_P): New predicate as a macro. (struct symbol_cache_slot): Turn the FOUND field into a struct symbol_in_block. (block_found): Remove. (eq_symbol_entry): Update to deal with struct symbol_in_block in cache slots. (symbol_cache_lookup): Return a struct symbol_in_block rather than a mere symbol. (symbol_cache_mark_found): Add a BLOCK parameter to fill appropriately the cache slots. Update callers. (symbol_cache_dump): Update cache slots handling to the type change. (lookup_symbol_in_language, lookup_symbol, lookup_language_this, lookup_symbol_aux, lookup_local_symbol, lookup_symbol_in_objfile, lookup_global_symbol_from_objfile, lookup_symbol_in_objfile_symtabs, lookup_symbol_in_objfile_from_linkage_name, lookup_symbol_via_quick_fns, basic_lookup_symbol_nonlocal, lookup_symbol_in_static_block, lookup_static_symbol, lookup_global_symbol): Return a struct symbol_in_block rather than a mere symbol. Deal with struct symbol_in_block from other lookup functions. Remove uses of block_found. (lookup_symbol_in_block): Remove uses of block_found. (struct global_sym_lookup_data): Turn the RESULT field into a struct symbol_in_block. (lookup_symbol_global_iterator_cb): Update references to the RESULT field. (search_symbols): Deal with struct symbol_in_block from lookup functions. * symtab.h (struct symbol_in_block): New structure. (block_found): Remove. (lookup_symbol_in_language, lookup_symbol, basic_lookup_symbol_nonlocal, lookup_symbol_in_static_block, looku_static_symbol, lookup_global_symbol, lookup_symbol_in_block, lookup_language_this, lookup_global_symbol_from_objfile): Return a struct symbol_in_block rather than just a mere symbol. Update comments to remove mentions of block_found. * valops.c (find_function_in_inferior, value_struct_elt_for_reference, value_maybe_namespace_elt, value_of_this): Deal with struct symbol_in_block from lookup functions. * value.c (value_static_field, value_fn_field): Likewise.
251 lines
7.7 KiB
C++
251 lines
7.7 KiB
C++
/* Helper routines for C++ support in GDB.
|
|
Copyright (C) 2002-2015 Free Software Foundation, Inc.
|
|
|
|
Contributed by MontaVista Software.
|
|
Namespace support contributed by David Carlton.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef CP_SUPPORT_H
|
|
#define CP_SUPPORT_H
|
|
|
|
/* We need this for 'domain_enum', alas... */
|
|
|
|
#include "symtab.h"
|
|
#include "vec.h"
|
|
#include "gdb_vecs.h"
|
|
#include "gdb_obstack.h"
|
|
|
|
/* Opaque declarations. */
|
|
|
|
struct symbol;
|
|
struct block;
|
|
struct objfile;
|
|
struct type;
|
|
struct demangle_component;
|
|
|
|
/* A string representing the name of the anonymous namespace used in GDB. */
|
|
|
|
#define CP_ANONYMOUS_NAMESPACE_STR "(anonymous namespace)"
|
|
|
|
/* The length of the string representing the anonymous namespace. */
|
|
|
|
#define CP_ANONYMOUS_NAMESPACE_LEN 21
|
|
|
|
/* The result of parsing a name. */
|
|
|
|
struct demangle_parse_info
|
|
{
|
|
/* The memory used during the parse. */
|
|
struct demangle_info *info;
|
|
|
|
/* The result of the parse. */
|
|
struct demangle_component *tree;
|
|
|
|
/* Any temporary memory used during typedef replacement. */
|
|
struct obstack obstack;
|
|
};
|
|
|
|
/* This struct is designed to store data from using directives. It
|
|
says that names from namespace IMPORT_SRC should be visible within
|
|
namespace IMPORT_DEST. These form a linked list; NEXT is the next
|
|
element of the list. If the imported namespace or declaration has
|
|
been aliased within the IMPORT_DEST namespace, ALIAS is set to a
|
|
string representing the alias. Otherwise, ALIAS is NULL.
|
|
DECLARATION is the name of the imported declaration, if this import
|
|
statement represents one. Otherwise DECLARATION is NULL and this
|
|
import statement represents a namespace.
|
|
|
|
C++: using namespace A;
|
|
Fortran: use A
|
|
import_src = "A"
|
|
import_dest = local scope of the import statement even such as ""
|
|
alias = NULL
|
|
declaration = NULL
|
|
excludes = NULL
|
|
|
|
C++: using A::x;
|
|
Fortran: use A, only: x
|
|
import_src = "A"
|
|
import_dest = local scope of the import statement even such as ""
|
|
alias = NULL
|
|
declaration = "x"
|
|
excludes = NULL
|
|
The declaration will get imported as import_dest::x.
|
|
|
|
C++ has no way to import all names except those listed ones.
|
|
Fortran: use A, localname => x
|
|
import_src = "A"
|
|
import_dest = local scope of the import statement even such as ""
|
|
alias = "localname"
|
|
declaration = "x"
|
|
excludes = NULL
|
|
+
|
|
import_src = "A"
|
|
import_dest = local scope of the import statement even such as ""
|
|
alias = NULL
|
|
declaration = NULL
|
|
excludes = ["x"]
|
|
All the entries of A get imported except of "x". "x" gets imported as
|
|
"localname". "x" is not defined as a local name by this statement.
|
|
|
|
C++: namespace LOCALNS = A;
|
|
Fortran has no way to address non-local namespace/module.
|
|
import_src = "A"
|
|
import_dest = local scope of the import statement even such as ""
|
|
alias = "LOCALNS"
|
|
declaration = NULL
|
|
excludes = NULL
|
|
The namespace will get imported as the import_dest::LOCALNS
|
|
namespace.
|
|
|
|
C++ cannot express it, it would be something like: using localname
|
|
= A::x;
|
|
Fortran: use A, only localname => x
|
|
import_src = "A"
|
|
import_dest = local scope of the import statement even such as ""
|
|
alias = "localname"
|
|
declaration = "x"
|
|
excludes = NULL
|
|
The declaration will get imported as localname or
|
|
`import_dest`localname. */
|
|
|
|
struct using_direct
|
|
{
|
|
const char *import_src;
|
|
const char *import_dest;
|
|
|
|
const char *alias;
|
|
const char *declaration;
|
|
|
|
struct using_direct *next;
|
|
|
|
/* Used during import search to temporarily mark this node as
|
|
searched. */
|
|
int searched;
|
|
|
|
/* USING_DIRECT has variable allocation size according to the number of
|
|
EXCLUDES entries, the last entry is NULL. */
|
|
const char *excludes[1];
|
|
};
|
|
|
|
|
|
/* Functions from cp-support.c. */
|
|
|
|
extern char *cp_canonicalize_string (const char *string);
|
|
|
|
extern char *cp_canonicalize_string_no_typedefs (const char *string);
|
|
|
|
typedef const char *(canonicalization_ftype) (struct type *, void *);
|
|
|
|
extern char *cp_canonicalize_string_full (const char *string,
|
|
canonicalization_ftype *finder,
|
|
void *data);
|
|
|
|
extern char *cp_class_name_from_physname (const char *physname);
|
|
|
|
extern char *method_name_from_physname (const char *physname);
|
|
|
|
extern unsigned int cp_find_first_component (const char *name);
|
|
|
|
extern unsigned int cp_entire_prefix_len (const char *name);
|
|
|
|
extern char *cp_func_name (const char *full_name);
|
|
|
|
extern char *cp_remove_params (const char *demangled_name);
|
|
|
|
extern struct symbol **make_symbol_overload_list (const char *,
|
|
const char *);
|
|
|
|
extern struct symbol **make_symbol_overload_list_adl (struct type **arg_types,
|
|
int nargs,
|
|
const char *func_name);
|
|
|
|
extern struct type *cp_lookup_rtti_type (const char *name,
|
|
struct block *block);
|
|
|
|
/* Functions/variables from cp-namespace.c. */
|
|
|
|
extern int cp_is_in_anonymous (const char *symbol_name);
|
|
|
|
extern void cp_add_using_directive (const char *dest,
|
|
const char *src,
|
|
const char *alias,
|
|
const char *declaration,
|
|
VEC (const_char_ptr) *excludes,
|
|
int copy_names,
|
|
struct obstack *obstack);
|
|
|
|
extern void cp_scan_for_anonymous_namespaces (const struct symbol *symbol,
|
|
struct objfile *objfile);
|
|
|
|
extern struct block_symbol cp_lookup_symbol_nonlocal
|
|
(const struct language_defn *langdef,
|
|
const char *name,
|
|
const struct block *block,
|
|
const domain_enum domain);
|
|
|
|
extern struct block_symbol
|
|
cp_lookup_symbol_namespace (const char *the_namespace,
|
|
const char *name,
|
|
const struct block *block,
|
|
const domain_enum domain);
|
|
|
|
extern struct block_symbol cp_lookup_symbol_imports_or_template
|
|
(const char *scope,
|
|
const char *name,
|
|
const struct block *block,
|
|
const domain_enum domain);
|
|
|
|
extern struct block_symbol
|
|
cp_lookup_nested_symbol (struct type *parent_type,
|
|
const char *nested_name,
|
|
const struct block *block,
|
|
const domain_enum domain);
|
|
|
|
struct type *cp_lookup_transparent_type (const char *name);
|
|
|
|
/* See description in cp-namespace.c. */
|
|
|
|
struct type *cp_find_type_baseclass_by_name (struct type *parent_type,
|
|
const char *name);
|
|
|
|
/* Functions from cp-name-parser.y. */
|
|
|
|
extern struct demangle_parse_info *cp_demangled_name_to_comp
|
|
(const char *demangled_name, const char **errmsg);
|
|
|
|
extern char *cp_comp_to_string (struct demangle_component *result,
|
|
int estimated_len);
|
|
|
|
extern void cp_demangled_name_parse_free (struct demangle_parse_info *);
|
|
extern struct cleanup *make_cleanup_cp_demangled_name_parse_free
|
|
(struct demangle_parse_info *);
|
|
extern void cp_merge_demangle_parse_infos (struct demangle_parse_info *,
|
|
struct demangle_component *,
|
|
struct demangle_parse_info *);
|
|
|
|
extern struct demangle_parse_info *cp_new_demangle_parse_info (void);
|
|
|
|
/* The list of "maint cplus" commands. */
|
|
|
|
extern struct cmd_list_element *maint_cplus_cmd_list;
|
|
|
|
/* A wrapper for bfd_demangle. */
|
|
|
|
char *gdb_demangle (const char *name, int options);
|
|
|
|
#endif /* CP_SUPPORT_H */
|