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 _BASEMETRIC_H
22 #define _BASEMETRIC_H
23 
24 #include "dbe_structs.h"
25 #include "hwcentry.h"
26 #include "Table.h"
27 
28 // METRIC_*_PRECISION determine the least threshold value
29 // for time measured metrics. Any event that counts for less
30 // than 1sec/METRIC_PRECISION is discarded.
31 #define METRIC_SIG_PRECISION    MICROSEC
32 #define METRIC_HR_PRECISION     MICROSEC
33 
34 class Expression;
35 class Definition;
36 class Histable;
37 template <class ITEM> class Vector;
38 
39 class BaseMetric
40 {
41 public:
42   // sync enum changes with AnMetric.java
43   enum Type
44   { // Subtype==STATIC metrics:
45     ONAME = 1,  //ONAME must be 1
46     SIZES,
47     ADDRESS,
48     // Clock Profiling, Derived Metrics:
49     CP_TOTAL,
50     CP_TOTAL_CPU,
51     // Clock profiling, Solaris Microstates (LMS_* defines)
52     CP_LMS_USER,
53     CP_LMS_SYSTEM,
54     CP_LMS_TRAP,
55     CP_LMS_TFAULT,
56     CP_LMS_DFAULT,
57     CP_LMS_KFAULT,
58     CP_LMS_USER_LOCK,
59     CP_LMS_SLEEP,
60     CP_LMS_WAIT_CPU,
61     CP_LMS_STOPPED,
62     // Kernel clock profiling
63     CP_KERNEL_CPU,
64     // Sync Tracing
65     SYNC_WAIT_TIME,
66     SYNC_WAIT_COUNT,
67     // HWC
68     HWCNTR,
69     // Heap Tracing:
70     HEAP_ALLOC_CNT,
71     HEAP_ALLOC_BYTES,
72     HEAP_LEAK_CNT,
73     HEAP_LEAK_BYTES,
74     // I/O Tracing:
75     IO_READ_BYTES,
76     IO_READ_CNT,
77     IO_READ_TIME,
78     IO_WRITE_BYTES,
79     IO_WRITE_CNT,
80     IO_WRITE_TIME,
81     IO_OTHER_CNT,
82     IO_OTHER_TIME,
83     IO_ERROR_CNT,
84     IO_ERROR_TIME,
85     // MPI Tracing:
86     MPI_TIME,
87     MPI_SEND,
88     MPI_BYTES_SENT,
89     MPI_RCV,
90     MPI_BYTES_RCVD,
91     MPI_OTHER,
92     // OMP states:
93     OMP_NONE,
94     OMP_OVHD,
95     OMP_WORK,
96     OMP_IBAR,
97     OMP_EBAR,
98     OMP_WAIT,
99     OMP_SERL,
100     OMP_RDUC,
101     OMP_LKWT,
102     OMP_CTWT,
103     OMP_ODWT,
104     OMP_MSTR,
105     OMP_SNGL,
106     OMP_ORDD,
107     OMP_MASTER_THREAD,
108     // MPI states:
109     MPI_WORK,
110     MPI_WAIT,
111     // Races and Deadlocks
112     RACCESS,
113     DEADLOCKS,
114     // Derived Metrics
115     DERIVED
116   };
117 
118   // sync enum changes with AnMetric.java
119   enum SubType
120   {
121     STATIC      = 1, // Type==SIZES, ADDRESS, ONAME
122     EXCLUSIVE   = 2,
123     INCLUSIVE   = 4,
124     ATTRIBUTED  = 8,
125     DATASPACE   = 16 // Can be accessed in dataspace views
126   };
127 
128   BaseMetric (Type t);
129   BaseMetric (Hwcentry *ctr, const char* _aux, const char* _cmdname,
130 	      const char* _username, int v_styles); // depended bm
131   BaseMetric (Hwcentry *ctr, const char* _aux, const char* _username,
132 	      int v_styles, BaseMetric* _depended_bm = NULL); // master bm
133   BaseMetric (const char *_cmd, const char *_username, Definition *def); // derived metrics
134   BaseMetric (const BaseMetric& m);
135   virtual ~BaseMetric ();
136 
get_id()137   int get_id ()                     { return id; }
get_type()138   Type get_type ()                  { return type; }
get_hw_ctr()139   Hwcentry *get_hw_ctr ()           { return hw_ctr; }
get_aux()140   char *get_aux ()                  { return aux; }
get_username()141   char *get_username ()             { return username; }
get_cmd()142   char *get_cmd ()                  { return cmd; }
get_flavors()143   int get_flavors ()                { return flavors; }
get_clock_unit()144   int get_clock_unit ()             { return clock_unit; }
get_precision()145   long long get_precision ()        { return precision; }
get_vtype()146   ValueTag get_vtype ()             { return valtype; }
get_value_styles()147   int get_value_styles ()           { return value_styles; }
is_zeroThreshold()148   bool is_zeroThreshold ()          { return zeroThreshold; }
get_packet_type()149   ProfData_type get_packet_type ()  { return packet_type; }
get_cond()150   Expression *get_cond ()           { return cond; }
get_val()151   Expression *get_val ()            { return val; }
get_expr()152   Expression *get_expr ()           { return expr; }
get_expr_spec()153   char *get_expr_spec ()            { return expr_spec; }
get_definition()154   Definition *get_definition ()     { return definition; };
get_dependent_bm()155   BaseMetric *get_dependent_bm ()   { return dependent_bm; };
156 
157   bool
comparable()158   comparable ()
159   {
160     return val_spec != NULL || type == DERIVED || type == SIZES || type == ADDRESS;
161   }
162 
163   // setters..
164   void set_default_visbits (SubType subtype, int _visbits);
set_id(int _id)165   void set_id (int _id)         { id = _id; }   //TBR, if possible
166   // For comparison, set which packets to eval:
167   void set_expr_spec (char *_expr_spec);
168   void set_cond_spec (char *_cond_spec);
169   int get_default_visbits (SubType subtype);
170   char *dump ();
171   Histable *get_comparable_obj (Histable *obj);
172   bool is_internal ();          // Invisible for users
173 
174   char *legend;                 // for comparison: add'l column text
175 
176 private:
177   BaseMetric *dependent_bm;     // for HWCs only: a link to the timecvt metric
178   Expression *cond;             // determines which packets to evaluate
179   char *cond_spec;              // used to generate "cond"
180   Expression *val;              // determines the numeric value for packet
181   char *val_spec;               // used to generate "val"
182   Expression *expr; // for comparison: an additional expression to determine
183 		    // which packets to eval. Should be NULL otherwise.
184   char *expr_spec;                  // used to generate "expr"
185   int id;                           // unique id (assigned to last_id @ "new")
186   Type type;                        // e.g. HWCNTR
187   char *aux;                        // for HWCs only: Hwcentry ctr->name
188   char *cmd;                        // the .rc metric command, e.g. "total"
189   char *username;                   // e.g. "GTXT("Total Wait Time")"
190   int flavors;                      // bitmask of SubType capabilities
191   int value_styles;                 // bitmask of ValueType capabilities
192   static const int NSUBTYPES = 2;   // STATIC/EXCLUSIVE, INCLUSIVE
193   int default_visbits[NSUBTYPES];   // ValueType, e.g. VAL_VALUE|VAL_TIMEVAL
194   ValueTag valtype;                 // e.g. VT_LLONG
195   long long precision;              // e.g. METRIC_SIG_PRECISION, 1, etc.
196   Hwcentry *hw_ctr;                 // HWC definition
197   ProfData_type packet_type;        // e.g. DATA_HWC, or -1 for N/A
198   bool zeroThreshold;               // deadlock stuff
199   Presentation_clock_unit clock_unit;
200 
201   static int last_id;           // incremented by 1 w/ every "new". Not MT-safe
202   Definition *definition;
203 
204   void hwc_init (Hwcentry *ctr, const char* _aux, const char* _cmdname, const char* _username, int v_styles);
205   void init (Type t);
206   char *get_basetype_name ();
207   void specify ();
208   void specify_metric (char *_cond_spec, char *_val_spec);
209   void set_val_spec (char *_val_spec);
210   void specify_mstate_metric (int st);
211   void specify_ompstate_metric (int st);
212   void specify_prof_metric (char *_cond_spec);
213 };
214 
215 class Definition
216 {
217 public:
218 
219   enum opType
220   {
221     opNULL,
222     opPrimitive,
223     opDivide
224   };
225 
226   Definition (opType _op);
227   ~Definition ();
228   static Definition *add_definition (char *_def);
229   Vector<BaseMetric *> *get_dependencies ();
230   long *get_map ();
231   double eval (long *indexes, TValue *values);
232 
233   opType op;
234   Definition *arg1;
235   Definition *arg2;
236   char *def;
237 
238 private:
239   BaseMetric *bm;
240   long *map;
241   Vector<BaseMetric *> *dependencies;
242   long index;
243 };
244 
245 #endif  /* _BASEMETRIC_H */
246 
247