(root)/
binutils-2.41/
gprofng/
src/
Hist_data.h
       1  /* Copyright (C) 2021-2023 Free Software Foundation, Inc.
       2     Contributed by Oracle.
       3  
       4     This file is part of GNU Binutils.
       5  
       6     This program is free software; you can redistribute it and/or modify
       7     it under the terms of the GNU General Public License as published by
       8     the Free Software Foundation; either version 3, or (at your option)
       9     any later version.
      10  
      11     This program is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14     GNU General Public License for more details.
      15  
      16     You should have received a copy of the GNU General Public License
      17     along with this program; if not, write to the Free Software
      18     Foundation, 51 Franklin Street - Fifth Floor, Boston,
      19     MA 02110-1301, USA.  */
      20  
      21  #ifndef _HIST_DATA_H
      22  #define _HIST_DATA_H
      23  
      24  // A Hist_data object is used to obtain data used for constructing
      25  // a histogram display.
      26  
      27  #include <sys/types.h>
      28  
      29  #include <vec.h>
      30  #include <Map.h>
      31  #include <HashMap.h>
      32  
      33  #include "dbe_structs.h"
      34  #include "Histable.h"
      35  #include "DerivedMetrics.h"
      36  
      37  class DbeLine;
      38  class MetricList;
      39  
      40  class Hist_data
      41  {
      42  public:
      43    friend class DbeView;
      44    friend class er_print_histogram;
      45    friend class PathTree;
      46    friend class DataSpace;
      47    friend class MemorySpace;
      48    friend class IOActivity;
      49    friend class HeapActivity;
      50  
      51    // HistItem contains all the data about a single histogram item.
      52    struct HistItem
      53    {
      54      HistItem (long n);
      55      ~HistItem ();
      56      Histable *obj;  // info on the object
      57      int type;       // annotated src/dis: type
      58      TValue *value;  // numeric values
      59      long size;
      60    };
      61  
      62    enum Hist_status
      63    {
      64      SUCCESS = 0,
      65      NO_DATA
      66    };
      67  
      68    enum Mode
      69    {
      70      ALL,
      71      CALLERS,
      72      CALLEES,
      73      SELF,
      74      MODL,
      75      LAYOUT,
      76      DETAIL
      77    };
      78  
      79    enum Sort_order
      80    {
      81      ASCEND,
      82      DESCEND
      83    };
      84  
      85    enum Sort_type
      86    {
      87      ALPHA,
      88      VALUE,
      89      AUX
      90    };
      91  
      92    Hist_data (MetricList *, Histable::Type, Mode, bool _viewowned = false);
      93  
      94    virtual ~Hist_data ();
      95    void dump (char *msg, FILE *f);
      96  
      97    Hist_status
      98    get_status (void)
      99    {
     100      return status;
     101    }
     102  
     103    // Return the view ownership flag
     104    bool
     105    isViewOwned (void)
     106    {
     107      return viewowned;
     108    }
     109  
     110    // Return the total number of items
     111    long size (void);
     112  
     113    // Append a new HistItem for the specified Histable
     114    HistItem *append_hist_item (Histable *obj);
     115    void append_hist_item (HistItem *hi);
     116    TValue *get_real_value (TValue *res, int met_index, int row);
     117    TValue *get_value (TValue *res, int met_index, int row);
     118    TValue *get_value (TValue *res, int met_index, HistItem *hi);
     119    void print_row(StringBuilder *sb, int row, Metric::HistMetric *hist_metric,
     120  		 const char *mark);
     121    void print_content (FILE *out_file, Metric::HistMetric *hist_metric, int limit);
     122    int print_label (FILE *out_file, Metric::HistMetric *hist_metric, int space);
     123    void update_total (Hist_data::HistItem *new_total);
     124    void update_max (Metric::HistMetric *hm_tmp);
     125    void update_legend_width (Metric::HistMetric *hm_tmp);
     126  
     127    // Find an existing HistItem
     128    HistItem *find_hist_item (Histable *obj);
     129  
     130    // sort the data
     131    void sort (long ind, bool reverse);
     132  
     133    // resort the data, if metric sort or direction has changed
     134    void resort (MetricList *mlist);
     135  
     136    // compute minima and maxima
     137    void compute_minmax (void);
     138  
     139    // fetch() takes a hist item index and returns a ptr to the item
     140    HistItem *fetch (long index);
     141  
     142    HistItem *
     143    get_maximums (void)
     144    {
     145      return maximum;
     146    }
     147  
     148    HistItem *
     149    get_maximums_inc (void)
     150    {
     151      return maximum_inc;
     152    }
     153  
     154    HistItem *
     155    get_minimums (void)
     156    {
     157      return minimum;
     158    }
     159  
     160    HistItem *
     161    get_totals (void)
     162    {
     163      return total;
     164    }
     165  
     166    Vector<HistItem*> *
     167    get_hist_items (void)
     168    {
     169      return hist_items;
     170    }
     171  
     172    void
     173    set_status (Hist_status st)
     174    {
     175      status = st;
     176    }
     177  
     178    MetricList *
     179    get_metric_list (void)
     180    {
     181      return metrics;
     182    }
     183  
     184    Map<Histable*, int> *
     185    get_callsite_mark ()
     186    {
     187      return callsite_mark;
     188    }
     189  
     190    Metric::HistMetric *get_histmetrics ();
     191    void set_threshold (double proportion);
     192    bool above_threshold (HistItem *hi);
     193    double get_percentage (double value, int mindex);
     194    size_t value_maxlen (int mindex); // Return the drawing length
     195    size_t time_len (TValue *value, int clock);
     196    size_t time_maxlen (int mindex, int clock);
     197    size_t name_len (HistItem *item);
     198    size_t name_maxlen ();
     199    HistItem *new_hist_item (Histable *obj, int itype, TValue *value);
     200    HistItem *update_hist_item (HistItem *hi, TValue *value);
     201    Vector<uint64_t> *get_object_indices (Vector<int> *selections);
     202  
     203  private:
     204  
     205    Metric::HistMetric *hist_metrics;
     206    Vector<HistItem*> *hist_items;        // Actual histogram values
     207    HashMap<Histable*, HistItem*>*hi_map; // map: Histable -> HistItem
     208    Map<Histable*, int>*callsite_mark;
     209    Hist_status status;
     210    int nmetrics;             // number of metrics
     211    MetricList *metrics;
     212    Histable::Type type;
     213    Sort_order sort_order;
     214    Sort_type sort_type;
     215    int sort_ind;
     216    bool rev_sort;            // true if sort is reversed
     217  
     218    Mode mode;
     219    HistItem *gprof_item;     // used for gprof-style info
     220    Histable *spontaneous;
     221  
     222    // Private state variables
     223    HistItem *maximum;
     224    HistItem *minimum;
     225    HistItem *maximum_inc;
     226    HistItem *total;
     227    HistItem *threshold;
     228  
     229    // Perform the sort operation with this function
     230    static int sort_compare_all (const void *a, const void *b, const void *arg);
     231    static int sort_compare_dlayout (const void *a, const void *b, const void *arg);
     232    static int sort_compare (HistItem *hi_1, HistItem *hi_2, Sort_type stype,
     233  			   long ind, Hist_data *hdata);
     234  
     235    // Allocate a new structure of dynamic size
     236    HistItem *new_hist_item (Histable *obj);
     237  
     238    // Flag indicating whether or not the Hist_data structure
     239    //	is owned by a DbeView, which has responsibility for
     240    //	deleting it, or not, in which case the last user deletes it.
     241    //	XXX this is very ugly, and arises from the inconsistent handling
     242    //	XXX of the Hist_data structure in various bits of code.
     243    bool viewowned;
     244  };
     245  
     246  // This structure is destined to merge with Hist_data.
     247  // We currently use it to present callstack data such as
     248  // leak and allocation lists.
     249  
     250  class DbeInstr;
     251  
     252  struct CStack_data
     253  {
     254  
     255    struct CStack_item
     256    {
     257      CStack_item (long n);
     258      ~CStack_item ();
     259      long count;
     260      int64_t val;
     261      Vector<DbeInstr*> *stack;
     262      TValue *value;      // numeric values
     263    };
     264  
     265    Vector<CStack_item*> *cstack_items;
     266    CStack_item *total;
     267  
     268    CStack_item *new_cstack_item ();
     269    CStack_data (MetricList *);
     270  
     271    long
     272    size ()
     273    {
     274      return cstack_items->size ();
     275    }
     276  
     277    CStack_item *
     278    fetch (long i)
     279    {
     280      return cstack_items->fetch (i);
     281    }
     282  
     283    ~CStack_data ()
     284    {
     285      cstack_items->destroy ();
     286      delete cstack_items;
     287      delete total;
     288    }
     289  
     290    MetricList *metrics;
     291  };
     292  
     293  #endif /* _HIST_DATA_H */