| /* symtab.h | 
 |  | 
 |    Copyright (C) 2000-2024 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 3 of the License, or | 
 |    (at your option) any later version. | 
 |  | 
 |    This program is distributed in the hope that it will be useful, | 
 |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 |    GNU General Public License for more details. | 
 |  | 
 |    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., 51 Franklin Street - Fifth Floor, Boston, | 
 |    MA 02110-1301, USA.  */ | 
 |  | 
 | #ifndef symtab_h | 
 | #define symtab_h | 
 |  | 
 | /* For a profile to be intelligible to a human user, it is necessary | 
 |    to map code-addresses into source-code information.  Source-code | 
 |    information can be any combination of: (i) function-name, (ii) | 
 |    source file-name, and (iii) source line number. | 
 |  | 
 |    The symbol table is used to map addresses into source-code | 
 |    information.  */ | 
 |  | 
 | #define NBBS 10 | 
 |  | 
 | /* Symbol-entry.  For each external in the specified file we gather | 
 |    its address, the number of calls and compute its share of cpu time.  */ | 
 | typedef struct sym | 
 |   { | 
 |     /* Common information: | 
 |  | 
 |        In the symbol-table, fields ADDR and FUNC_NAME are guaranteed | 
 |        to contain valid information.  FILE may be 0, if unknown and | 
 |        LINE_NUM maybe 0 if unknown.  */ | 
 |  | 
 |     bfd_vma addr;		/* Address of entry point.  */ | 
 |     bfd_vma end_addr;		/* End-address.  */ | 
 |     const char *name;		/* Name of function this sym is from.  */ | 
 |     Source_File *file;		/* Source file symbol comes from.  */ | 
 |     int line_num;		/* Source line number.  */ | 
 |     unsigned int		/* Boolean fields:  */ | 
 |       is_func:1,		/*  Is this a function entry point?  */ | 
 |       is_static:1,		/*  Is this a local (static) symbol?  */ | 
 |       is_bb_head:1,		/*  Is this the head of a basic-blk?  */ | 
 |       mapped:1,			/*  This symbol was mapped to another name.  */ | 
 |       has_been_placed:1;	/*  Have we placed this symbol?  */ | 
 |     unsigned long ncalls;	/* How many times executed  */ | 
 |     int nuses;			/* How many times this symbol appears in | 
 | 				   a particular context.  */ | 
 |     bfd_vma bb_addr[NBBS];	/* Address of basic-block start.  */ | 
 |     unsigned long bb_calls[NBBS];/* How many times basic-block was called.  */ | 
 |     struct sym *next;		/* For building chains of syms.  */ | 
 |     struct sym *prev;		/* For building chains of syms.  */ | 
 |  | 
 |     /* Profile specific information:  */ | 
 |  | 
 |     /* Histogram specific information:  */ | 
 |     struct | 
 |       { | 
 | 	double time;		/* (Weighted) ticks in this routine.  */ | 
 | 	bfd_vma scaled_addr;	/* Scaled entry point.  */ | 
 |       } | 
 |     hist; | 
 |  | 
 |     /* Call-graph specific information:  */ | 
 |     struct | 
 |       { | 
 | 	unsigned long self_calls; /* How many calls to self.  */ | 
 | 	double child_time;	/* Cumulative ticks in children.  */ | 
 | 	int index;		/* Index in the graph list.  */ | 
 | 	int top_order;		/* Graph call chain top-sort order.  */ | 
 | 	bool print_flag;	/* Should this be printed?  */ | 
 | 	struct | 
 | 	  { | 
 | 	    double fract;	/* What % of time propagates.  */ | 
 | 	    double self;	/* How much self time propagates.  */ | 
 | 	    double child;	/* How much child time propagates.  */ | 
 | 	  } | 
 | 	prop; | 
 | 	struct | 
 | 	  { | 
 | 	    int num;		/* Internal number of cycle on.  */ | 
 | 	    struct sym *head;	/* Head of cycle.  */ | 
 | 	    struct sym *next;	/* Next member of cycle.  */ | 
 | 	  } | 
 | 	cyc; | 
 | 	struct arc *parents;	/* List of caller arcs.  */ | 
 | 	struct arc *children;	/* List of callee arcs.  */ | 
 |       } | 
 |     cg; | 
 |   } | 
 | Sym; | 
 |  | 
 | /* Symbol-tables are always assumed to be sorted | 
 |    in increasing order of addresses.  */ | 
 | typedef struct | 
 |   { | 
 |     unsigned int len;		/* # of symbols in this table.  */ | 
 |     Sym *base;			/* First element in symbol table.  */ | 
 |     Sym *limit;			/* Limit = base + len.  */ | 
 |   } | 
 | Sym_Table; | 
 |  | 
 | extern Sym_Table symtab;	/* The symbol table.  */ | 
 |  | 
 | extern void sym_init        (Sym *); | 
 | extern void symtab_finalize (Sym_Table *); | 
 | #ifdef DEBUG | 
 | extern Sym *dbg_sym_lookup  (Sym_Table *, bfd_vma); | 
 | #endif | 
 | extern Sym *sym_lookup      (Sym_Table *, bfd_vma); | 
 | extern void find_call       (Sym *, bfd_vma, bfd_vma); | 
 |  | 
 | #endif /* symtab_h */ |