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