/* symtab.h

   Copyright (C) 2000-2021 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 */
