1 /* symtab.h
2 
3    Copyright (C) 2000-2024 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.  */
37 typedef 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           bool 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   }
101 Sym;
102 
103 /* Symbol-tables are always assumed to be sorted
104    in increasing order of addresses.  */
105 typedef 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   }
111 Sym_Table;
112 
113 extern Sym_Table symtab;      /* The symbol table.  */
114 
115 extern void sym_init        (Sym *);
116 extern void symtab_finalize (Sym_Table *);
117 #ifdef DEBUG
118 extern Sym *dbg_sym_lookup  (Sym_Table *, bfd_vma);
119 #endif
120 extern Sym *sym_lookup      (Sym_Table *, bfd_vma);
121 extern void find_call       (Sym *, bfd_vma, bfd_vma);
122 
123 #endif /* symtab_h */
124