X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gprof%2Fsym_ids.c;h=c214f14314dbe49a17b0522b2e7be0ec1dbc3bbf;hb=02eba61aa6cad683e96cf13f483adc04982c0c2b;hp=66ee0f6fcb4c1d4b8d4ea1cf312e94d0d5755d7a;hpb=2ee563b53258d390d7446e90a67f465d504ae44c;p=deliverable%2Fbinutils-gdb.git diff --git a/gprof/sym_ids.c b/gprof/sym_ids.c index 66ee0f6fcb..c214f14314 100644 --- a/gprof/sym_ids.c +++ b/gprof/sym_ids.c @@ -1,12 +1,12 @@ /* sym_ids.c - Copyright 2000, 2001, 2002 Free Software Foundation, Inc. + Copyright (C) 1999-2020 Free Software Foundation, Inc. This file is part of GNU Binutils. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,46 +16,53 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ +#include "gprof.h" #include "libiberty.h" #include "safe-ctype.h" -#include "gprof.h" #include "search_list.h" #include "source.h" #include "symtab.h" #include "cg_arcs.h" #include "sym_ids.h" +#include "corefile.h" + +struct match + { + int prev_index; /* Index of prev match. */ + Sym *prev_match; /* Previous match. */ + Sym *first_match; /* Chain of all matches. */ + Sym sym; + }; struct sym_id { struct sym_id *next; char *spec; /* Parsing modifies this. */ Table_Id which_table; - boolean has_right; + bfd_boolean has_right; - struct match - { - int prev_index; /* Index of prev match. */ - Sym *prev_match; /* Previous match. */ - Sym *first_match; /* Chain of all matches. */ - Sym sym; - } - left, right; - } - *id_list; + struct match left, right; + }; -static void parse_spec PARAMS ((char *, Sym *)); -static void parse_id PARAMS ((struct sym_id *)); -static boolean match PARAMS ((Sym *, Sym *)); -static void extend_match PARAMS ((struct match *, Sym *, Sym_Table *, boolean)); +static struct sym_id *id_list; + +static void parse_spec + (char *, Sym *); +static void parse_id + (struct sym_id *); +static bfd_boolean match + (Sym *, Sym *); +static void extend_match + (struct match *, Sym *, Sym_Table *, bfd_boolean); Sym_Table syms[NUM_TABLES]; #ifdef DEBUG -const char *table_name[] = +static const char *table_name[] = { "INCL_GRAPH", "EXCL_GRAPH", "INCL_ARCS", "EXCL_ARCS", @@ -80,9 +87,7 @@ static Source_File non_existent_file = void -sym_id_add (spec, which_table) - const char *spec; - Table_Id which_table; +sym_id_add (const char *spec, Table_Id which_table) { struct sym_id *id; int len = strlen (spec); @@ -110,9 +115,7 @@ sym_id_add (spec, which_table) FILENAME not containing a dot can be specified by FILENAME. */ static void -parse_spec (spec, sym) - char *spec; - Sym *sym; +parse_spec (char *spec, Sym *sym) { char *colon; @@ -167,8 +170,7 @@ parse_spec (spec, sym) by parse_spec(). */ static void -parse_id (id) - struct sym_id *id; +parse_id (struct sym_id *id) { char *slash; @@ -179,7 +181,7 @@ parse_id (id) { parse_spec (slash + 1, &id->right.sym); *slash = '\0'; - id->has_right = true; + id->has_right = TRUE; } parse_spec (id->spec, &id->left.sym); @@ -216,26 +218,27 @@ parse_id (id) /* Return TRUE iff PATTERN matches SYM. */ -static boolean -match (pattern, sym) - Sym *pattern; - Sym *sym; +static bfd_boolean +match (Sym *pattern, Sym *sym) { - return (pattern->file ? pattern->file == sym->file : true) - && (pattern->line_num ? pattern->line_num == sym->line_num : true) - && (pattern->name - ? strcmp (pattern->name, - sym->name+(discard_underscores && sym->name[0] == '_')) == 0 - : true); + if (pattern->file && pattern->file != sym->file) + return FALSE; + if (pattern->line_num && pattern->line_num != sym->line_num) + return FALSE; + if (pattern->name) + { + const char *sym_name = sym->name; + if (*sym_name && bfd_get_symbol_leading_char (core_bfd) == *sym_name) + sym_name++; + if (strcmp (pattern->name, sym_name) != 0) + return FALSE; + } + return TRUE; } static void -extend_match (m, sym, tab, second_pass) - struct match *m; - Sym *sym; - Sym_Table *tab; - boolean second_pass; +extend_match (struct match *m, Sym *sym, Sym_Table *tab, bfd_boolean second_pass) { if (m->prev_match != sym - 1) { @@ -270,7 +273,7 @@ extend_match (m, sym, tab, second_pass) requests---you get what you ask for! */ void -sym_id_parse () +sym_id_parse (void) { Sym *sym, *left, *right; struct sym_id *id; @@ -286,10 +289,10 @@ sym_id_parse () for (id = id_list; id; id = id->next) { if (match (&id->left.sym, sym)) - extend_match (&id->left, sym, &syms[id->which_table], false); + extend_match (&id->left, sym, &syms[id->which_table], FALSE); if (id->has_right && match (&id->right.sym, sym)) - extend_match (&id->right, sym, &right_ids, false); + extend_match (&id->right, sym, &right_ids, FALSE); } } @@ -317,10 +320,10 @@ sym_id_parse () for (id = id_list; id; id = id->next) { if (match (&id->left.sym, sym)) - extend_match (&id->left, sym, &syms[id->which_table], true); + extend_match (&id->left, sym, &syms[id->which_table], TRUE); if (id->has_right && match (&id->right.sym, sym)) - extend_match (&id->right, sym, &right_ids, true); + extend_match (&id->right, sym, &right_ids, TRUE); } } @@ -368,11 +371,8 @@ sym_id_parse () time requesting -k a/b. Fortunately, those symbol tables don't get very big (the user has to type them!), so a linear search is probably tolerable. */ -boolean -sym_id_arc_is_present (sym_tab, from, to) - Sym_Table *sym_tab; - Sym *from; - Sym *to; +bfd_boolean +sym_id_arc_is_present (Sym_Table *sym_tab, Sym *from, Sym *to) { Sym *sym; @@ -380,8 +380,8 @@ sym_id_arc_is_present (sym_tab, from, to) { if (from->addr >= sym->addr && from->addr <= sym->end_addr && arc_lookup (sym, to)) - return true; + return TRUE; } - return false; + return FALSE; }