diff options
author | Pedro Alves <palves@redhat.com> | 2017-11-08 15:07:56 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2017-11-08 16:02:24 +0000 |
commit | 5ffa0793690b42b2a0c1c21dbb5e64634e58fa00 (patch) | |
tree | 08f6c4540b28cefd8f8ae67386c9af8ed455c0a0 /gdb/dbxread.c | |
parent | 2a1dde5da23779fd0d269c3e51c7814aba9001dd (diff) | |
download | gdb-5ffa0793690b42b2a0c1c21dbb5e64634e58fa00.zip gdb-5ffa0793690b42b2a0c1c21dbb5e64634e58fa00.tar.gz gdb-5ffa0793690b42b2a0c1c21dbb5e64634e58fa00.tar.bz2 |
Per-language symbol name hashing algorithm
Currently, we have a mess of symbol name hashing/comparison routines.
There's msymbol_hash for mangled names, and dict_hash and
msymbol_hash_iw for demangled names. Then there's strcmp_iw,
strcmp_iw_ordered and Ada's full_match/wild_match, which all have to
agree with the hashing routines. That's why dict_hash is really about
Ada names. From the inconsistency department, minimal symbol hashing
doesn't go via dict_hash, so Ada's wild matching can't ever work with
minimal symbols.
This patch starts fixing this, by doing two things:
#1 - adds a language vector method to let each language decide how to
compute a symbol name hash.
#2 - makes dictionaries know the language of the symbols they hold,
and then use the dictionaries language to decide which hashing
method to use.
For now, this is just scaffolding, since all languages install the
default method. The series will make C++ install its own hashing
method later on, and will add per-language symbol name comparison
routines too.
This patch was originally based on a patch that Keith wrote for the
libcc1/C++ WIP support.
gdb/ChangeLog:
2017-11-08 Keith Seitz <keiths@redhat.com>
Pedro Alves <palves@redhat.com>
* ada-lang.c (ada_language_defn): Install
default_search_name_hash.
* buildsym.c (struct buildsym_compunit): <language>: New field.
(finish_block_internal): Pass language when creating dictionaries.
(start_buildsym_compunit, start_symtab): New language parameters.
Use them.
(restart_symtab): Pass down compilation unit's language.
* buildsym.h (enum language): Forward declare.
(start_symtab): New 'language' parameter.
* c-lang.c (c_language_defn, cplus_language_defn)
(asm_language_defn, minimal_language_defn): Install
default_search_name_hash.
* coffread.c (coff_start_symtab): Adjust.
* d-lang.c (d_language_defn): Install default_search_name_hash.
* dbxread.c (struct symloc): Add 'pst_language' field.
(PST_LANGUAGE): Define.
(start_psymtab, read_ofile_symtab): Use it.
(process_one_symbol): New 'language' parameter. Pass it down.
* dictionary.c (struct dictionary) <language>: New field.
(DICT_LANGUAGE): Define.
(dict_create_hashed, dict_create_hashed_expandable)
(dict_create_linear, dict_create_linear_expandable): New parameter
'language'. Set the dictionary's language.
(iter_match_first_hashed): Adjust to rename.
(insert_symbol_hashed): Assert we don't see mismatching
languages. Adjust to rename.
(dict_hash): Rename to ...
(default_search_name_hash): ... this and make extern.
* dictionary.h (struct language_defn): Forward declare.
(dict_create_hashed): New parameter 'language'.
* dwarf2read.c (dwarf2_start_symtab): Pass down language.
* f-lang.c (f_language_defn): Install default_search_name_hash.
* go-lang.c (go_language_defn): Install default_search_name_hash.
* jit.c (finalize_symtab): Pass compunit's language to dictionary
creation.
* language.c (unknown_language_defn, auto_language_defn):
* language.h (language_defn::la_search_name_hash): New field.
(default_search_name_hash): Declare.
* m2-lang.c (m2_language_defn): Install default_search_name_hash.
* mdebugread.c (new_block): New parameter 'language'.
* mdebugread.c (parse_symbol): Pass symbol language to block
allocation.
(psymtab_to_symtab_1): Pass down language.
(new_symtab): Pass compunit's language to block allocation.
* objc-lang.c (objc_language_defn): Install
default_search_name_hash.
* opencl-lang.c (opencl_language_defn):
* p-lang.c (pascal_language_defn): Install
default_search_name_hash.
* rust-lang.c (rust_language_defn): Install
default_search_name_hash.
* stabsread.h (enum language): Forward declare.
(process_one_symbol): Add 'language' parameter.
* symtab.c (search_name_hash): New function.
* symtab.h (search_name_hash): Declare.
* xcoffread.c (read_xcoff_symtab): Pass language to start_symtab.
Diffstat (limited to 'gdb/dbxread.c')
-rw-r--r-- | gdb/dbxread.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 1618a56..697aa6e 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -54,7 +54,6 @@ #include "cp-support.h" #include "psympriv.h" #include "block.h" - #include "aout/aout64.h" #include "aout/stab_gnu.h" /* We always use GNU stabs, not native, now. */ @@ -92,6 +91,7 @@ struct symloc int symbol_offset; int string_offset; int file_string_offset; + enum language pst_language; }; #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff) @@ -101,6 +101,7 @@ struct symloc #define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset) #define STRING_OFFSET(p) (SYMLOC(p)->string_offset) #define FILE_STRING_OFFSET(p) (SYMLOC(p)->file_string_offset) +#define PST_LANGUAGE(p) (SYMLOC(p)->pst_language) /* The objfile we are currently reading. */ @@ -2013,6 +2014,7 @@ start_psymtab (struct objfile *objfile, const char *filename, CORE_ADDR textlow, /* Deduce the source language from the filename for this psymtab. */ psymtab_language = deduce_language_from_filename (filename); + PST_LANGUAGE (result) = psymtab_language; return result; } @@ -2396,7 +2398,8 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst) positive offsets. */ nlist.n_value = (nlist.n_value ^ 0x80000000) - 0x80000000; process_one_symbol (type, nlist.n_desc, nlist.n_value, - namestring, section_offsets, objfile); + namestring, section_offsets, objfile, + PST_LANGUAGE (pst)); } /* We skip checking for a new .o or -l file; that should never happen in this routine. */ @@ -2491,12 +2494,14 @@ cp_set_block_scope (const struct symbol *symbol, the pst->section_offsets. All symbols that refer to memory locations need to be offset by these amounts. OBJFILE is the object file from which we are reading symbols. It - is used in end_symtab. */ + is used in end_symtab. + LANGUAGE is the language of the symtab. +*/ void process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name, const struct section_offsets *section_offsets, - struct objfile *objfile) + struct objfile *objfile, enum language language) { struct gdbarch *gdbarch = get_objfile_arch (objfile); struct context_stack *newobj; @@ -2710,7 +2715,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name, function_start_offset = 0; start_stabs (); - start_symtab (objfile, name, NULL, valu); + start_symtab (objfile, name, NULL, valu, language); record_debugformat ("stabs"); break; |