1*c42dbd0eSchristos /* Copyright (C) 2021 Free Software Foundation, Inc. 2*c42dbd0eSchristos Contributed by Oracle. 3*c42dbd0eSchristos 4*c42dbd0eSchristos This file is part of GNU Binutils. 5*c42dbd0eSchristos 6*c42dbd0eSchristos This program is free software; you can redistribute it and/or modify 7*c42dbd0eSchristos it under the terms of the GNU General Public License as published by 8*c42dbd0eSchristos the Free Software Foundation; either version 3, or (at your option) 9*c42dbd0eSchristos any later version. 10*c42dbd0eSchristos 11*c42dbd0eSchristos This program is distributed in the hope that it will be useful, 12*c42dbd0eSchristos but WITHOUT ANY WARRANTY; without even the implied warranty of 13*c42dbd0eSchristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*c42dbd0eSchristos GNU General Public License for more details. 15*c42dbd0eSchristos 16*c42dbd0eSchristos You should have received a copy of the GNU General Public License 17*c42dbd0eSchristos along with this program; if not, write to the Free Software 18*c42dbd0eSchristos Foundation, 51 Franklin Street - Fifth Floor, Boston, 19*c42dbd0eSchristos MA 02110-1301, USA. */ 20*c42dbd0eSchristos 21*c42dbd0eSchristos #ifndef _METRICLIST_H 22*c42dbd0eSchristos #define _METRICLIST_H 23*c42dbd0eSchristos 24*c42dbd0eSchristos #include "dbe_structs.h" 25*c42dbd0eSchristos #include "vec.h" 26*c42dbd0eSchristos #include "enums.h" 27*c42dbd0eSchristos #include "Metric.h" 28*c42dbd0eSchristos #include "DerivedMetrics.h" 29*c42dbd0eSchristos #include <stdio.h> 30*c42dbd0eSchristos 31*c42dbd0eSchristos // 32*c42dbd0eSchristos // The MetricList class is used to manage a list of metrics 33*c42dbd0eSchristos 34*c42dbd0eSchristos class MetricList 35*c42dbd0eSchristos { 36*c42dbd0eSchristos public: 37*c42dbd0eSchristos 38*c42dbd0eSchristos MetricList (Vector<BaseMetric*> *base_metrics, MetricType type); 39*c42dbd0eSchristos MetricList (MetricList *old); 40*c42dbd0eSchristos MetricList (MetricType _mtype); 41*c42dbd0eSchristos ~MetricList (); 42*c42dbd0eSchristos 43*c42dbd0eSchristos // Methods concerning a list of metrics 44*c42dbd0eSchristos // set metrics -- text, caller-callee, data, and index flavors 45*c42dbd0eSchristos // flavor depends on mtype in the list 46*c42dbd0eSchristos // returns NULL if OK, or an error string if not 47*c42dbd0eSchristos // always returns NULL if fromRcFile is TRUE 48*c42dbd0eSchristos char *set_metrics (const char *metric_cmd, bool fromRcFile, DerivedMetrics *derived_metrics); 49*c42dbd0eSchristos 50*c42dbd0eSchristos // update the caller-callee or dataspace metrics to match normal metrics 51*c42dbd0eSchristos // It is assumed that this->mtype is MET_CALL, MET_DATA, or MET_INDX and 52*c42dbd0eSchristos // that metrics_list->mtype is MET_NORMAL 53*c42dbd0eSchristos void set_metrics (MetricList *metrics_list); 54*c42dbd0eSchristos 55*c42dbd0eSchristos // produce a string for the metrics from a vector 56*c42dbd0eSchristos char *get_metrics (); 57*c42dbd0eSchristos 58*c42dbd0eSchristos // set the sort metric for a list from a metric string 59*c42dbd0eSchristos // returns NULL if OK, or an error string if not 60*c42dbd0eSchristos char *set_sort (const char *metric_cmd, bool fromRcFile); 61*c42dbd0eSchristos 62*c42dbd0eSchristos // set the sort metric for a list from the first visible index 63*c42dbd0eSchristos void set_fallback_sort (); 64*c42dbd0eSchristos 65*c42dbd0eSchristos // set the sort metric for a list from a visible index 66*c42dbd0eSchristos void set_sort (int visindex, bool reverse); 67*c42dbd0eSchristos 68*c42dbd0eSchristos char *get_sort_name (); // get the name of the sort metric from a vector 69*c42dbd0eSchristos 70*c42dbd0eSchristos bool get_sort_rev()71*c42dbd0eSchristos get_sort_rev () // get the boolean reverse for the sort metric 72*c42dbd0eSchristos { 73*c42dbd0eSchristos return sort_reverse; 74*c42dbd0eSchristos } 75*c42dbd0eSchristos 76*c42dbd0eSchristos void set_sort_rev(bool v)77*c42dbd0eSchristos set_sort_rev (bool v) 78*c42dbd0eSchristos { 79*c42dbd0eSchristos sort_reverse = v; 80*c42dbd0eSchristos } 81*c42dbd0eSchristos 82*c42dbd0eSchristos int get_sort_ref_index()83*c42dbd0eSchristos get_sort_ref_index () 84*c42dbd0eSchristos { 85*c42dbd0eSchristos return sort_ref_index; 86*c42dbd0eSchristos } 87*c42dbd0eSchristos 88*c42dbd0eSchristos void set_sort_ref_index(int ind)89*c42dbd0eSchristos set_sort_ref_index (int ind) 90*c42dbd0eSchristos { 91*c42dbd0eSchristos sort_ref_index = ind; 92*c42dbd0eSchristos } 93*c42dbd0eSchristos 94*c42dbd0eSchristos bool set_sort_metric (char *metric_cmd, BaseMetric::SubType mst, bool reverse); 95*c42dbd0eSchristos Metric *find_metric (char *cmd, BaseMetric::SubType st); 96*c42dbd0eSchristos Metric *find_metric_by_name (char *cmd); 97*c42dbd0eSchristos int get_listorder (char *cmd, BaseMetric::SubType st, const char *expr = NULL); 98*c42dbd0eSchristos int get_listorder (Metric *mtr); 99*c42dbd0eSchristos Metric *get_sort_metric (); // get the sort metric from a vector 100*c42dbd0eSchristos char *get_sort_cmd (); // get the command name of the sort metric 101*c42dbd0eSchristos 102*c42dbd0eSchristos MetricType get_type()103*c42dbd0eSchristos get_type () 104*c42dbd0eSchristos { 105*c42dbd0eSchristos return mtype; 106*c42dbd0eSchristos } 107*c42dbd0eSchristos 108*c42dbd0eSchristos Vector<Metric*> * get_items()109*c42dbd0eSchristos get_items () // get the vector of metrics from the list 110*c42dbd0eSchristos { 111*c42dbd0eSchristos return items; 112*c42dbd0eSchristos } 113*c42dbd0eSchristos 114*c42dbd0eSchristos Metric * get(long i)115*c42dbd0eSchristos get (long i) 116*c42dbd0eSchristos { 117*c42dbd0eSchristos return items->get (i); 118*c42dbd0eSchristos } 119*c42dbd0eSchristos 120*c42dbd0eSchristos void put(long i,Metric * m)121*c42dbd0eSchristos put (long i, Metric *m) 122*c42dbd0eSchristos { 123*c42dbd0eSchristos items->put (i, m); 124*c42dbd0eSchristos } 125*c42dbd0eSchristos 126*c42dbd0eSchristos void append(Metric * m)127*c42dbd0eSchristos append (Metric *m) 128*c42dbd0eSchristos { 129*c42dbd0eSchristos items->append (m); 130*c42dbd0eSchristos } 131*c42dbd0eSchristos 132*c42dbd0eSchristos long size()133*c42dbd0eSchristos size () 134*c42dbd0eSchristos { 135*c42dbd0eSchristos return items ? items->size () : 0; 136*c42dbd0eSchristos } 137*c42dbd0eSchristos 138*c42dbd0eSchristos Metric *append (BaseMetric *bm, BaseMetric::SubType st, int visbits); 139*c42dbd0eSchristos 140*c42dbd0eSchristos // produce a list of all metrics from a vector 141*c42dbd0eSchristos void print_metric_list (FILE *dis_file, char *leader, int debug); 142*c42dbd0eSchristos 143*c42dbd0eSchristos // Add any and all matching metrics to the growing list 144*c42dbd0eSchristos // return value is zero for OK, 1 for no match 145*c42dbd0eSchristos int add_matching_dmetrics (Vector<BaseMetric*> *base_items, char *cmd, 146*c42dbd0eSchristos BaseMetric::SubType *subtypes, int nsubtypes, 147*c42dbd0eSchristos int dmetrics_vis, // literal translation of dmetrics +. etc. 148*c42dbd0eSchristos bool fromRcFile); 149*c42dbd0eSchristos 150*c42dbd0eSchristos private: 151*c42dbd0eSchristos // parse a metric specification substring, based on type of list 152*c42dbd0eSchristos char *parse_metric_spec (char *cmd, BaseMetric::SubType *subtypes, 153*c42dbd0eSchristos int *nsubtypes, int *dmetrics_visb, bool *isOK); 154*c42dbd0eSchristos 155*c42dbd0eSchristos Vector<Metric*> *items; 156*c42dbd0eSchristos MetricType mtype; 157*c42dbd0eSchristos 158*c42dbd0eSchristos // the sort reference index 159*c42dbd0eSchristos int sort_ref_index; 160*c42dbd0eSchristos bool sort_reverse; 161*c42dbd0eSchristos }; 162*c42dbd0eSchristos 163*c42dbd0eSchristos #endif /* _METRICLIST_H */ 164