From 9439a077bef75279f4881cabc3adbe61cf057504 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 10 May 2012 19:54:45 +0000 Subject: * psymtab.c (partial_map_expand_apply): Add assertion. (partial_map_symtabs_matching_filename): Skip included psymtabs. (psymtab_to_symtab): Find unshared psymtab. (dump_psymtab): Print including psymtabs. (recursively_search_psymtabs): New function. (expand_symtabs_matching_via_partial): Use it. * psympriv.h (struct partial_symtab) : New fields. (enum psymtab_search_status): New. --- gdb/psympriv.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'gdb/psympriv.h') diff --git a/gdb/psympriv.h b/gdb/psympriv.h index df7b874..370ce86 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -54,6 +54,17 @@ struct partial_symbol #define PSYMBOL_DOMAIN(psymbol) (psymbol)->domain #define PSYMBOL_CLASS(psymbol) (psymbol)->aclass +/* A convenience enum to give names to some constants used when + searching psymtabs. This is internal to psymtab and should not be + used elsewhere. */ + +enum psymtab_search_status + { + PST_NOT_SEARCHED, + PST_SEARCHED_AND_FOUND, + PST_SEARCHED_AND_NOT_FOUND + }; + /* Each source file that has not been fully read in is represented by a partial_symtab. This contains the information on where in the executable the debugging symbols for a specific file are, and a @@ -111,6 +122,35 @@ struct partial_symtab int number_of_dependencies; + /* If NULL, this is an ordinary partial symbol table. + + If non-NULL, this holds a single includer of this partial symbol + table, and this partial symbol table is a shared one. + + A shared psymtab is one that is referenced by multiple other + psymtabs, and which conceptually has its contents directly + included in those. + + Shared psymtabs have special semantics. When a search finds a + symbol in a shared table, we instead return one of the non-shared + tables that include this one. + + A shared psymtabs can be referred to by other shared ones. + + The psymtabs that refer to a shared psymtab will list the shared + psymtab in their 'dependencies' array. + + In DWARF terms, a shared psymtab is a DW_TAG_partial_unit; but + of course using a name based on that would be too confusing, so + "shared" was chosen instead. + + Only a single user is needed because, when expanding a shared + psymtab, we only need to expand its "canonical" non-shared user. + The choice of which one should be canonical is left to the + debuginfo reader; it can be arbitrary. */ + + struct partial_symtab *user; + /* Global symbol list. This list will be sorted after readin to improve access. Binary search will be the usual method of finding a symbol within it. globals_offset is an integer offset @@ -142,6 +182,10 @@ struct partial_symtab unsigned char psymtabs_addrmap_supported; + /* A flag that is temporarily used when searching psymtabs. */ + + ENUM_BITFIELD (psymtab_search_status) searched_flag : 2; + /* Pointer to symtab eventually allocated for this source file, 0 if !readin or if we haven't looked for the symtab after it was readin. */ -- cgit v1.1