/* sym_ids.c
- Copyright 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 1999-2022 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,
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
02110-1301, USA. */
\f
+#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;
+ };
-static struct sym_id
+struct sym_id
{
struct sym_id *next;
char *spec; /* Parsing modifies this. */
Table_Id which_table;
- 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;
+ bool has_right;
+
+ struct match left, right;
+ };
+
+static struct sym_id *id_list;
static void parse_spec
(char *, Sym *);
static void parse_id
(struct sym_id *);
-static bfd_boolean match
+static bool match
(Sym *, Sym *);
static void extend_match
- (struct match *, Sym *, Sym_Table *, bfd_boolean);
+ (struct match *, Sym *, Sym_Table *, bool);
Sym_Table syms[NUM_TABLES];
{
parse_spec (slash + 1, &id->right.sym);
*slash = '\0';
- id->has_right = TRUE;
+ id->has_right = true;
}
parse_spec (id->spec, &id->left.sym);
/* Return TRUE iff PATTERN matches SYM. */
-static bfd_boolean
+static bool
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 (struct match *m, Sym *sym, Sym_Table *tab, bfd_boolean second_pass)
+extend_match (struct match *m, Sym *sym, Sym_Table *tab, bool second_pass)
{
if (m->prev_match != sym - 1)
{
requests---you get what you ask for! */
void
-sym_id_parse ()
+sym_id_parse (void)
{
Sym *sym, *left, *right;
struct sym_id *id;
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);
}
}
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);
}
}
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. */
-bfd_boolean
+bool
sym_id_arc_is_present (Sym_Table *sym_tab, Sym *from, Sym *to)
{
Sym *sym;
{
if (from->addr >= sym->addr && from->addr <= sym->end_addr
&& arc_lookup (sym, to))
- return TRUE;
+ return true;
}
- return FALSE;
+ return false;
}