| /* 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 _BASEMETRIC_H | |
| #define _BASEMETRIC_H | |
| #include "dbe_structs.h" | |
| #include "hwcentry.h" | |
| #include "Table.h" | |
| // METRIC_*_PRECISION determine the least threshold value | |
| // for time measured metrics. Any event that counts for less | |
| // than 1sec/METRIC_PRECISION is discarded. | |
| #define METRIC_SIG_PRECISION MICROSEC | |
| #define METRIC_HR_PRECISION MICROSEC | |
| class Expression; | |
| class Definition; | |
| class Histable; | |
| template <class ITEM> class Vector; | |
| class BaseMetric | |
| { | |
| public: | |
| // sync enum changes with AnMetric.java | |
| enum Type | |
| { // Subtype==STATIC metrics: | |
| ONAME = 1, //ONAME must be 1 | |
| SIZES, | |
| ADDRESS, | |
| // Clock Profiling, Derived Metrics: | |
| CP_TOTAL, | |
| CP_TOTAL_CPU, | |
| // Clock profiling, Solaris Microstates (LMS_* defines) | |
| CP_LMS_USER, | |
| CP_LMS_SYSTEM, | |
| CP_LMS_TRAP, | |
| CP_LMS_TFAULT, | |
| CP_LMS_DFAULT, | |
| CP_LMS_KFAULT, | |
| CP_LMS_USER_LOCK, | |
| CP_LMS_SLEEP, | |
| CP_LMS_WAIT_CPU, | |
| CP_LMS_STOPPED, | |
| // Kernel clock profiling | |
| CP_KERNEL_CPU, | |
| // Sync Tracing | |
| SYNC_WAIT_TIME, | |
| SYNC_WAIT_COUNT, | |
| // HWC | |
| HWCNTR, | |
| // Heap Tracing: | |
| HEAP_ALLOC_CNT, | |
| HEAP_ALLOC_BYTES, | |
| HEAP_LEAK_CNT, | |
| HEAP_LEAK_BYTES, | |
| // I/O Tracing: | |
| IO_READ_BYTES, | |
| IO_READ_CNT, | |
| IO_READ_TIME, | |
| IO_WRITE_BYTES, | |
| IO_WRITE_CNT, | |
| IO_WRITE_TIME, | |
| IO_OTHER_CNT, | |
| IO_OTHER_TIME, | |
| IO_ERROR_CNT, | |
| IO_ERROR_TIME, | |
| // MPI Tracing: | |
| MPI_TIME, | |
| MPI_SEND, | |
| MPI_BYTES_SENT, | |
| MPI_RCV, | |
| MPI_BYTES_RCVD, | |
| MPI_OTHER, | |
| // OMP states: | |
| OMP_NONE, | |
| OMP_OVHD, | |
| OMP_WORK, | |
| OMP_IBAR, | |
| OMP_EBAR, | |
| OMP_WAIT, | |
| OMP_SERL, | |
| OMP_RDUC, | |
| OMP_LKWT, | |
| OMP_CTWT, | |
| OMP_ODWT, | |
| OMP_MSTR, | |
| OMP_SNGL, | |
| OMP_ORDD, | |
| OMP_MASTER_THREAD, | |
| // MPI states: | |
| MPI_WORK, | |
| MPI_WAIT, | |
| // Races and Deadlocks | |
| RACCESS, | |
| DEADLOCKS, | |
| // Derived Metrics | |
| DERIVED | |
| }; | |
| // sync enum changes with AnMetric.java | |
| enum SubType | |
| { | |
| STATIC = 1, // Type==SIZES, ADDRESS, ONAME | |
| EXCLUSIVE = 2, | |
| INCLUSIVE = 4, | |
| ATTRIBUTED = 8, | |
| DATASPACE = 16 // Can be accessed in dataspace views | |
| }; | |
| BaseMetric (Type t); | |
| BaseMetric (Hwcentry *ctr, const char* _aux, const char* _cmdname, | |
| const char* _username, int v_styles); // depended bm | |
| BaseMetric (Hwcentry *ctr, const char* _aux, const char* _username, | |
| int v_styles, BaseMetric* _depended_bm = NULL); // master bm | |
| BaseMetric (const char *_cmd, const char *_username, Definition *def); // derived metrics | |
| BaseMetric (const BaseMetric& m); | |
| virtual ~BaseMetric (); | |
| int get_id () { return id; } | |
| Type get_type () { return type; } | |
| Hwcentry *get_hw_ctr () { return hw_ctr; } | |
| char *get_aux () { return aux; } | |
| char *get_username () { return username; } | |
| char *get_cmd () { return cmd; } | |
| int get_flavors () { return flavors; } | |
| int get_clock_unit () { return clock_unit; } | |
| long long get_precision () { return precision; } | |
| ValueTag get_vtype () { return valtype; } | |
| int get_value_styles () { return value_styles; } | |
| bool is_zeroThreshold () { return zeroThreshold; } | |
| ProfData_type get_packet_type () { return packet_type; } | |
| Expression *get_cond () { return cond; } | |
| Expression *get_val () { return val; } | |
| Expression *get_expr () { return expr; } | |
| char *get_expr_spec () { return expr_spec; } | |
| Definition *get_definition () { return definition; }; | |
| BaseMetric *get_dependent_bm () { return dependent_bm; }; | |
| bool | |
| comparable () | |
| { | |
| return val_spec != NULL || type == DERIVED || type == SIZES || type == ADDRESS; | |
| } | |
| // setters.. | |
| void set_default_visbits (SubType subtype, int _visbits); | |
| void set_id (int _id) { id = _id; } //TBR, if possible | |
| // For comparison, set which packets to eval: | |
| void set_expr_spec (char *_expr_spec); | |
| void set_cond_spec (char *_cond_spec); | |
| int get_default_visbits (SubType subtype); | |
| char *dump (); | |
| Histable *get_comparable_obj (Histable *obj); | |
| bool is_internal (); // Invisible for users | |
| char *legend; // for comparison: add'l column text | |
| private: | |
| BaseMetric *dependent_bm; // for HWCs only: a link to the timecvt metric | |
| Expression *cond; // determines which packets to evaluate | |
| char *cond_spec; // used to generate "cond" | |
| Expression *val; // determines the numeric value for packet | |
| char *val_spec; // used to generate "val" | |
| Expression *expr; // for comparison: an additional expression to determine | |
| // which packets to eval. Should be NULL otherwise. | |
| char *expr_spec; // used to generate "expr" | |
| int id; // unique id (assigned to last_id @ "new") | |
| Type type; // e.g. HWCNTR | |
| char *aux; // for HWCs only: Hwcentry ctr->name | |
| char *cmd; // the .rc metric command, e.g. "total" | |
| char *username; // e.g. "GTXT("Total Wait Time")" | |
| int flavors; // bitmask of SubType capabilities | |
| int value_styles; // bitmask of ValueType capabilities | |
| static const int NSUBTYPES = 2; // STATIC/EXCLUSIVE, INCLUSIVE | |
| int default_visbits[NSUBTYPES]; // ValueType, e.g. VAL_VALUE|VAL_TIMEVAL | |
| ValueTag valtype; // e.g. VT_LLONG | |
| long long precision; // e.g. METRIC_SIG_PRECISION, 1, etc. | |
| Hwcentry *hw_ctr; // HWC definition | |
| ProfData_type packet_type; // e.g. DATA_HWC, or -1 for N/A | |
| bool zeroThreshold; // deadlock stuff | |
| Presentation_clock_unit clock_unit; | |
| static int last_id; // incremented by 1 w/ every "new". Not MT-safe | |
| Definition *definition; | |
| void hwc_init (Hwcentry *ctr, const char* _aux, const char* _cmdname, const char* _username, int v_styles); | |
| void init (Type t); | |
| char *get_basetype_name (); | |
| void specify (); | |
| void specify_metric (char *_cond_spec, char *_val_spec); | |
| void set_val_spec (char *_val_spec); | |
| void specify_mstate_metric (int st); | |
| void specify_ompstate_metric (int st); | |
| void specify_prof_metric (char *_cond_spec); | |
| }; | |
| class Definition | |
| { | |
| public: | |
| enum opType | |
| { | |
| opNULL, | |
| opPrimitive, | |
| opDivide | |
| }; | |
| Definition (opType _op); | |
| ~Definition (); | |
| static Definition *add_definition (char *_def); | |
| Vector<BaseMetric *> *get_dependencies (); | |
| long *get_map (); | |
| double eval (long *indexes, TValue *values); | |
| opType op; | |
| Definition *arg1; | |
| Definition *arg2; | |
| char *def; | |
| private: | |
| BaseMetric *bm; | |
| long *map; | |
| Vector<BaseMetric *> *dependencies; | |
| long index; | |
| }; | |
| #endif /* _BASEMETRIC_H */ | |