Home | History | Annotate | Line # | Download | only in gprof
      1 /* symtab.h
      2 
      3    Copyright (C) 2000-2025 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 *get_symtab (void);
    114 extern Sym_Table *get_symtab_direct (void);
    115 extern void set_symtab       (Sym_Table *);
    116 
    117 extern void sym_init        (Sym *);
    118 extern void symtab_finalize (Sym_Table *);
    119 #ifdef DEBUG
    120 extern Sym *dbg_sym_lookup  (Sym_Table *, bfd_vma);
    121 #endif
    122 extern Sym *sym_lookup      (Sym_Table *, bfd_vma);
    123 extern void find_call       (Sym *, bfd_vma, bfd_vma);
    124 
    125 #endif /* symtab_h */
    126