1/* symtab.h
2
3   Copyright (C) 2000-2017 Free Software Foundation, Inc.
4
5   This file is part of GNU Binutils.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20   MA 02110-1301, USA.  */
21
22#ifndef symtab_h
23#define symtab_h
24
25/* For a profile to be intelligible to a human user, it is necessary
26   to map code-addresses into source-code information.  Source-code
27   information can be any combination of: (i) function-name, (ii)
28   source file-name, and (iii) source line number.
29
30   The symbol table is used to map addresses into source-code
31   information.  */
32
33#define NBBS 10
34
35/* Symbol-entry.  For each external in the specified file we gather
36   its address, the number of calls and compute its share of cpu time.  */
37typedef struct sym
38  {
39    /* Common information:
40
41       In the symbol-table, fields ADDR and FUNC_NAME are guaranteed
42       to contain valid information.  FILE may be 0, if unknown and
43       LINE_NUM maybe 0 if unknown.  */
44
45    bfd_vma addr;		/* Address of entry point.  */
46    bfd_vma end_addr;		/* End-address.  */
47    const char *name;		/* Name of function this sym is from.  */
48    Source_File *file;		/* Source file symbol comes from.  */
49    int line_num;		/* Source line number.  */
50    unsigned int		/* Boolean fields:  */
51      is_func:1,		/*  Is this a function entry point?  */
52      is_static:1,		/*  Is this a local (static) symbol?  */
53      is_bb_head:1,		/*  Is this the head of a basic-blk?  */
54      mapped:1,			/*  This symbol was mapped to another name.  */
55      has_been_placed:1;	/*  Have we placed this symbol?  */
56    unsigned long ncalls;	/* How many times executed  */
57    int nuses;			/* How many times this symbol appears in
58				   a particular context.  */
59    bfd_vma bb_addr[NBBS];	/* Address of basic-block start.  */
60    unsigned long bb_calls[NBBS];/* How many times basic-block was called.  */
61    struct sym *next;		/* For building chains of syms.  */
62    struct sym *prev;		/* For building chains of syms.  */
63
64    /* Profile specific information:  */
65
66    /* Histogram specific information:  */
67    struct
68      {
69	double time;		/* (Weighted) ticks in this routine.  */
70	bfd_vma scaled_addr;	/* Scaled entry point.  */
71      }
72    hist;
73
74    /* Call-graph specific information:  */
75    struct
76      {
77	unsigned long self_calls; /* How many calls to self.  */
78	double child_time;	/* Cumulative ticks in children.  */
79	int index;		/* Index in the graph list.  */
80	int top_order;		/* Graph call chain top-sort order.  */
81	bfd_boolean print_flag;	/* Should this be printed?  */
82	struct
83	  {
84	    double fract;	/* What % of time propagates.  */
85	    double self;	/* How much self time propagates.  */
86	    double child;	/* How much child time propagates.  */
87	  }
88	prop;
89	struct
90	  {
91	    int num;		/* Internal number of cycle on.  */
92	    struct sym *head;	/* Head of cycle.  */
93	    struct sym *next;	/* Next member of cycle.  */
94	  }
95	cyc;
96	struct arc *parents;	/* List of caller arcs.  */
97	struct arc *children;	/* List of callee arcs.  */
98      }
99    cg;
100  }
101Sym;
102
103/* Symbol-tables are always assumed to be sorted
104   in increasing order of addresses.  */
105typedef struct
106  {
107    unsigned int len;		/* # of symbols in this table.  */
108    Sym *base;			/* First element in symbol table.  */
109    Sym *limit;			/* Limit = base + len.  */
110  }
111Sym_Table;
112
113extern Sym_Table symtab;	/* The symbol table.  */
114
115extern void sym_init        (Sym *);
116extern void symtab_finalize (Sym_Table *);
117#ifdef DEBUG
118extern Sym *dbg_sym_lookup  (Sym_Table *, bfd_vma);
119#endif
120extern Sym *sym_lookup      (Sym_Table *, bfd_vma);
121extern void find_call       (Sym *, bfd_vma, bfd_vma);
122
123#endif /* symtab_h */
124