Skip to content
  • Pedro Alves's avatar
    Per-language symbol name hashing algorithm · 5ffa0793
    Pedro Alves authored
    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.
    5ffa0793