[RFA]: Fix partial symbol lookups
Jim Blandy
jimb@zwingli.cygnus.com
Tue Nov 14 20:07:00 GMT 2000
Let me make sure I've got this straight:
- In the current sources, globals in partial symbol tables are sorted
by demangled name, and lookup_partial_symbol looks up demangled
names only.
- Your patch reverts this to the way it used to be: globals in partial
symbol tables are sorted by mangled name, and lookup_partial_symbol
looks up mangled names only.
- Your patch changes changes lookup_symbol to pass the original name through
to lookup_symbol_aux, which will then use that when it needs to
search the partial symbol tables.
Thus, if lookup_symbol is given a mangled name, we'll search for the
mangled name in the psymtabs, and find it if it's there.
However, if lookup_symbol is given a demangled name, we'll still never
find it in the psymtabs. Is that right?
Daniel Berlin <dberlin@redhat.com> writes:
>
> This patch should fix partial symbol lookups, which are currently
> broken for C++.
>
> Jim, this needs your approval.
>
> --Dan
>
> Changelog entry:
> 2000-11-14 Daniel Berlin <dberlin@redhat.com>
>
> * symfile.c (compare_psymbols): Use SYMBOL_NAME rather than
> SYMBOL_SOURCE_NAME.
>
> * symtab.c (lookup_symbol_aux): Also take mangled name, and
> then pass it as the name to use for lookup for partial symbols.
> (lookup_symbol): Pass mangled name to lookup_symbol_aux.
> (lookup_partial_symbol): No need for SYMBOL_SOURCE_NAME.
> (top level): Change lookup_symbol_aux prototype to take mangled name as
> last argument.
>
> Patch:
> Index: symtab.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/symtab.c,v
> retrieving revision 1.22
> diff -c -3 -p -r1.22 symtab.c
> *** symtab.c 2000/11/10 23:02:56 1.22
> --- symtab.c 2000/11/14 16:55:26
> *************** static struct symbol *lookup_symbol_aux
> *** 81,87 ****
> struct block *block, const
> namespace_enum namespace, int
> *is_a_field_of_this, struct
> ! symtab **symtab);
>
>
> static struct symbol *find_active_alias (struct symbol *sym, CORE_ADDR addr);
> --- 81,87 ----
> struct block *block, const
> namespace_enum namespace, int
> *is_a_field_of_this, struct
> ! symtab **symtab, const char *mangled_name);
>
>
> static struct symbol *find_active_alias (struct symbol *sym, CORE_ADDR addr);
> *************** lookup_symbol (const char *name, const s
> *** 594,600 ****
> }
>
> returnval = lookup_symbol_aux (modified_name, block, namespace,
> ! is_a_field_of_this, symtab);
> if (needtofreename)
> free (modified_name2);
>
> --- 594,600 ----
> }
>
> returnval = lookup_symbol_aux (modified_name, block, namespace,
> ! is_a_field_of_this, symtab, name);
> if (needtofreename)
> free (modified_name2);
>
> *************** lookup_symbol (const char *name, const s
> *** 604,610 ****
> static struct symbol *
> lookup_symbol_aux (const char *name, const struct block *block,
> const namespace_enum namespace, int *is_a_field_of_this,
> ! struct symtab **symtab)
> {
> register struct symbol *sym;
> register struct symtab *s = NULL;
> --- 604,610 ----
> static struct symbol *
> lookup_symbol_aux (const char *name, const struct block *block,
> const namespace_enum namespace, int *is_a_field_of_this,
> ! struct symtab **symtab, const char *mangled_name)
> {
> register struct symbol *sym;
> register struct symtab *s = NULL;
> *************** lookup_symbol_aux (const char *name, con
> *** 785,791 ****
>
> ALL_PSYMTABS (objfile, ps)
> {
> ! if (!ps->readin && lookup_partial_symbol (ps, name, 1, namespace))
> {
> s = PSYMTAB_TO_SYMTAB (ps);
> bv = BLOCKVECTOR (s);
> --- 785,791 ----
>
> ALL_PSYMTABS (objfile, ps)
> {
> ! if (!ps->readin && lookup_partial_symbol (ps, mangled_name, 1, namespace))
> {
> s = PSYMTAB_TO_SYMTAB (ps);
> bv = BLOCKVECTOR (s);
> *************** lookup_symbol_aux (const char *name, con
> *** 835,841 ****
>
> ALL_PSYMTABS (objfile, ps)
> {
> ! if (!ps->readin && lookup_partial_symbol (ps, name, 0, namespace))
> {
> s = PSYMTAB_TO_SYMTAB (ps);
> bv = BLOCKVECTOR (s);
> --- 835,841 ----
>
> ALL_PSYMTABS (objfile, ps)
> {
> ! if (!ps->readin && lookup_partial_symbol (ps, mangled_name, 0, namespace))
> {
> s = PSYMTAB_TO_SYMTAB (ps);
> bv = BLOCKVECTOR (s);
> *************** lookup_symbol_aux (const char *name, con
> *** 964,970 ****
> }
>
> /* Look, in partial_symtab PST, for symbol NAME. Check the global
> ! symbols if GLOBAL, the static symbols if not */
>
> static struct partial_symbol *
> lookup_partial_symbol (struct partial_symtab *pst, const char *name, int global,
> --- 964,975 ----
> }
>
> /* Look, in partial_symtab PST, for symbol NAME. Check the global
> ! symbols if GLOBAL, the static symbols if not.
> !
> ! Be aware that minimal symbols have no demangled names. So we need to lookup
> ! by mangled name. However, this also means we can always binary search them,
> ! since they are a sorted list. If you change the way partial symbols work,
> ! you'll need to change this routine. */
>
> static struct partial_symbol *
> lookup_partial_symbol (struct partial_symtab *pst, const char *name, int global,
> *************** lookup_partial_symbol (struct partial_sy
> *** 1000,1011 ****
> center = bottom + (top - bottom) / 2;
> if (!(center < top))
> abort ();
> ! if (!do_linear_search
> ! && (SYMBOL_LANGUAGE (*center) == language_java))
> ! {
> ! do_linear_search = 1;
> ! }
> ! if (STRCMP (SYMBOL_SOURCE_NAME (*center), name) >= 0)
> {
> top = center;
> }
> --- 1005,1012 ----
> center = bottom + (top - bottom) / 2;
> if (!(center < top))
> abort ();
> !
> ! if (STRCMP (SYMBOL_NAME (*center), name) >= 0)
> {
> top = center;
> }
> Index: symfile.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/symfile.c,v
> retrieving revision 1.20
> diff -c -3 -p -r1.20 symfile.c
> *** symfile.c 2000/10/27 15:02:42 1.20
> --- symfile.c 2000/11/14 16:55:27
> *************** compare_psymbols (const PTR s1p, const P
> *** 245,252 ****
>
> s1 = (struct partial_symbol **) s1p;
> s2 = (struct partial_symbol **) s2p;
> ! st1 = SYMBOL_SOURCE_NAME (*s1);
> ! st2 = SYMBOL_SOURCE_NAME (*s2);
>
>
> if ((st1[0] - st2[0]) || !st1[0])
> --- 245,252 ----
>
> s1 = (struct partial_symbol **) s1p;
> s2 = (struct partial_symbol **) s2p;
> ! st1 = SYMBOL_NAME (*s1);
> ! st2 = SYMBOL_NAME (*s2);
>
>
> if ((st1[0] - st2[0]) || !st1[0])
>
>
More information about the Gdb-patches
mailing list