summaryrefslogtreecommitdiff
path: root/gprofng/src/Hist_data.h
diff options
context:
space:
mode:
Diffstat (limited to 'gprofng/src/Hist_data.h')
-rw-r--r--gprofng/src/Hist_data.h292
1 files changed, 292 insertions, 0 deletions
diff --git a/gprofng/src/Hist_data.h b/gprofng/src/Hist_data.h
new file mode 100644
index 00000000000..c5f7281abbf
--- /dev/null
+++ b/gprofng/src/Hist_data.h
@@ -0,0 +1,292 @@
+/* Copyright (C) 2021 Free Software Foundation, Inc.
+ Contributed by Oracle.
+
+ 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, 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, 51 Franklin Street - Fifth Floor, Boston,
+ MA 02110-1301, USA. */
+
+#ifndef _HIST_DATA_H
+#define _HIST_DATA_H
+
+// A Hist_data object is used to obtain data used for constructing
+// a histogram display.
+
+#include <sys/types.h>
+
+#include <vec.h>
+#include <Map.h>
+#include <HashMap.h>
+
+#include "dbe_structs.h"
+#include "Histable.h"
+#include "DerivedMetrics.h"
+
+class DbeLine;
+class MetricList;
+
+class Hist_data
+{
+public:
+ friend class DbeView;
+ friend class er_print_histogram;
+ friend class PathTree;
+ friend class DataSpace;
+ friend class MemorySpace;
+ friend class IOActivity;
+ friend class HeapActivity;
+
+ // HistItem contains all the data about a single histogram item.
+ struct HistItem
+ {
+ HistItem (long n);
+ ~HistItem ();
+ Histable *obj; // info on the object
+ int type; // annotated src/dis: type
+ TValue *value; // numeric values
+ long size;
+ };
+
+ enum Hist_status
+ {
+ SUCCESS = 0,
+ NO_DATA
+ };
+
+ enum Mode
+ {
+ ALL,
+ CALLERS,
+ CALLEES,
+ SELF,
+ MODL,
+ LAYOUT,
+ DETAIL
+ };
+
+ enum Sort_order
+ {
+ ASCEND,
+ DESCEND
+ };
+
+ enum Sort_type
+ {
+ ALPHA,
+ VALUE,
+ AUX
+ };
+
+ Hist_data (MetricList *, Histable::Type, Mode, bool _viewowned = false);
+
+ virtual ~Hist_data ();
+ void dump (char *msg, FILE *f);
+
+ Hist_status
+ get_status (void)
+ {
+ return status;
+ }
+
+ // Return the view ownership flag
+ bool
+ isViewOwned (void)
+ {
+ return viewowned;
+ }
+
+ // Return the total number of items
+ long size (void);
+
+ // Append a new HistItem for the specified Histable
+ HistItem *append_hist_item (Histable *obj);
+ void append_hist_item (HistItem *hi);
+ TValue *get_real_value (TValue *res, int met_index, int row);
+ TValue *get_value (TValue *res, int met_index, int row);
+ TValue *get_value (TValue *res, int met_index, HistItem *hi);
+ void print_row (StringBuilder *sb, int row, Metric::HistMetric *hist_metric, char *mark);
+ void print_content (FILE *out_file, Metric::HistMetric *hist_metric, int limit);
+ int print_label (FILE *out_file, Metric::HistMetric *hist_metric, int space);
+ void update_total (Hist_data::HistItem *new_total);
+ void update_max (Metric::HistMetric *hm_tmp);
+ void update_legend_width (Metric::HistMetric *hm_tmp);
+
+ // Find an existing HistItem
+ HistItem *find_hist_item (Histable *obj);
+
+ // sort the data
+ void sort (long ind, bool reverse);
+
+ // resort the data, if metric sort or direction has changed
+ void resort (MetricList *mlist);
+
+ // compute minima and maxima
+ void compute_minmax (void);
+
+ // fetch() takes a hist item index and returns a ptr to the item
+ HistItem *fetch (long index);
+
+ HistItem *
+ get_maximums (void)
+ {
+ return maximum;
+ }
+
+ HistItem *
+ get_maximums_inc (void)
+ {
+ return maximum_inc;
+ }
+
+ HistItem *
+ get_minimums (void)
+ {
+ return minimum;
+ }
+
+ HistItem *
+ get_totals (void)
+ {
+ return total;
+ }
+
+ Vector<HistItem*> *
+ get_hist_items (void)
+ {
+ return hist_items;
+ }
+
+ void
+ set_status (Hist_status st)
+ {
+ status = st;
+ }
+
+ MetricList *
+ get_metric_list (void)
+ {
+ return metrics;
+ }
+
+ Map<Histable*, int> *
+ get_callsite_mark ()
+ {
+ return callsite_mark;
+ }
+
+ Metric::HistMetric *get_histmetrics ();
+ void set_threshold (double proportion);
+ bool above_threshold (HistItem *hi);
+ double get_percentage (double value, int mindex);
+ size_t value_maxlen (int mindex); // Return the drawing length
+ size_t time_len (TValue *value, int clock);
+ size_t time_maxlen (int mindex, int clock);
+ size_t name_len (HistItem *item);
+ size_t name_maxlen ();
+ HistItem *new_hist_item (Histable *obj, int itype, TValue *value);
+ HistItem *update_hist_item (HistItem *hi, TValue *value);
+ Vector<uint64_t> *get_object_indices (Vector<int> *selections);
+
+private:
+
+ Metric::HistMetric *hist_metrics;
+ Vector<HistItem*> *hist_items; // Actual histogram values
+ HashMap<Histable*, HistItem*>*hi_map; // map: Histable -> HistItem
+ Map<Histable*, int>*callsite_mark;
+ Hist_status status;
+ int nmetrics; // number of metrics
+ MetricList *metrics;
+ Histable::Type type;
+ Sort_order sort_order;
+ Sort_type sort_type;
+ int sort_ind;
+ bool rev_sort; // true if sort is reversed
+
+ Mode mode;
+ HistItem *gprof_item; // used for gprof-style info
+ Histable *spontaneous;
+
+ // Private state variables
+ HistItem *maximum;
+ HistItem *minimum;
+ HistItem *maximum_inc;
+ HistItem *total;
+ HistItem *threshold;
+
+ // Perform the sort operation with this function
+ static int sort_compare_all (const void *a, const void *b, const void *arg);
+ static int sort_compare_dlayout (const void *a, const void *b, const void *arg);
+ static int sort_compare (HistItem *hi_1, HistItem *hi_2, Sort_type stype,
+ long ind, Hist_data *hdata);
+
+ // Allocate a new structure of dynamic size
+ HistItem *new_hist_item (Histable *obj);
+
+ // Flag indicating whether or not the Hist_data structure
+ // is owned by a DbeView, which has responsibility for
+ // deleting it, or not, in which case the last user deletes it.
+ // XXX this is very ugly, and arises from the inconsistent handling
+ // XXX of the Hist_data structure in various bits of code.
+ bool viewowned;
+};
+
+// This structure is destined to merge with Hist_data.
+// We currently use it to present callstack data such as
+// leak and allocation lists.
+
+class DbeInstr;
+
+struct CStack_data
+{
+
+ struct CStack_item
+ {
+ CStack_item (long n);
+ ~CStack_item ();
+ long count;
+ int64_t val;
+ Vector<DbeInstr*> *stack;
+ TValue *value; // numeric values
+ };
+
+ Vector<CStack_item*> *cstack_items;
+ CStack_item *total;
+
+ CStack_item *new_cstack_item ();
+ CStack_data (MetricList *);
+
+ long
+ size ()
+ {
+ return cstack_items->size ();
+ }
+
+ CStack_item *
+ fetch (long i)
+ {
+ return cstack_items->fetch (i);
+ }
+
+ ~CStack_data ()
+ {
+ cstack_items->destroy ();
+ delete cstack_items;
+ delete total;
+ }
+
+ MetricList *metrics;
+};
+
+#endif /* _HIST_DATA_H */