/* 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 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 *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 *dependencies; long index; }; #endif /* _BASEMETRIC_H */