]> Git Repo - binutils.git/blob - gprofng/src/Hist_data.h
Automatic date update in version.in
[binutils.git] / gprofng / src / Hist_data.h
1 /* Copyright (C) 2021 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 */
This page took 0.041806 seconds and 4 git commands to generate.