|  | /* symtab.h | 
|  |  | 
|  | Copyright (C) 2000-2023 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 */ |