From 5ffa0793690b42b2a0c1c21dbb5e64634e58fa00 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 8 Nov 2017 15:07:56 +0000 Subject: 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 Pedro Alves * ada-lang.c (ada_language_defn): Install default_search_name_hash. * buildsym.c (struct buildsym_compunit): : 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) : 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. --- gdb/dictionary.h | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) (limited to 'gdb/dictionary.h') diff --git a/gdb/dictionary.h b/gdb/dictionary.h index 4f4f160..e4a9315 100644 --- a/gdb/dictionary.h +++ b/gdb/dictionary.h @@ -35,42 +35,46 @@ struct dictionary; struct symbol; struct obstack; struct pending; - +struct language_defn; /* The creation functions for various implementations of dictionaries. */ -/* Create a dictionary implemented via a fixed-size hashtable. All - memory it uses is allocated on OBSTACK; the environment is - initialized from SYMBOL_LIST. */ +/* Create a dictionary of symbols of language LANGUAGE implemented via + a fixed-size hashtable. All memory it uses is allocated on + OBSTACK; the environment is initialized from SYMBOL_LIST. */ extern struct dictionary *dict_create_hashed (struct obstack *obstack, + enum language language, const struct pending *symbol_list); -/* Create a dictionary implemented via a hashtable that grows as - necessary. The dictionary is initially empty; to add symbols to - it, call dict_add_symbol(). Call dict_free() when you're done with - it. */ +/* Create a dictionary of symbols of language LANGUAGE, implemented + via a hashtable that grows as necessary. The dictionary is + initially empty; to add symbols to it, call dict_add_symbol(). + Call dict_free() when you're done with it. */ -extern struct dictionary *dict_create_hashed_expandable (void); +extern struct dictionary * + dict_create_hashed_expandable (enum language language); -/* Create a dictionary implemented via a fixed-size array. All memory - it uses is allocated on OBSTACK; the environment is initialized - from the SYMBOL_LIST. The symbols are ordered in the same order - that they're found in SYMBOL_LIST. */ +/* Create a dictionary of symbols of language LANGUAGE, implemented + via a fixed-size array. All memory it uses is allocated on + OBSTACK; the environment is initialized from the SYMBOL_LIST. The + symbols are ordered in the same order that they're found in + SYMBOL_LIST. */ extern struct dictionary *dict_create_linear (struct obstack *obstack, + enum language language, const struct pending *symbol_list); -/* Create a dictionary implemented via an array that grows as - necessary. The dictionary is initially empty; to add symbols to - it, call dict_add_symbol(). Call dict_free() when you're done with - it. */ - -extern struct dictionary *dict_create_linear_expandable (void); +/* Create a dictionary of symbols of language LANGUAGE, implemented + via an array that grows as necessary. The dictionary is initially + empty; to add symbols to it, call dict_add_symbol(). Call + dict_free() when you're done with it. */ +extern struct dictionary * + dict_create_linear_expandable (enum language language); /* The functions providing the interface to dictionaries. Note that the most common parts of the interface, namely symbol lookup, are -- cgit v1.1