blob: 5f0ca21c6c57a633b63d84ffafd0b7e411ff9709 [file] [log] [blame]
/* Copyright (C) 2021-2023 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 _BASEMETRICTREENODE_H
#define _BASEMETRICTREENODE_H
#include "BaseMetric.h"
// Unit values
#define UNIT_SECONDS "SECONDS"
#define UNIT_SECONDS_UNAME GTXT("secs.")
#define UNIT_BYTES "BYTES"
#define UNIT_BYTES_UNAME GTXT("bytes")
// Name values for intermediate parent nodes that aren't defined elsewhere
#define L1_DURATION "PROFDATA_TYPE_DURATION"
#define L1_DURATION_UNAME GTXT("Experiment Duration")
#define L1_GCDURATION "PROFDATA_TYPE_GCDURATION"
#define L1_GCDURATION_UNAME GTXT("Java Garbage Collection Duration")
#define L2_HWC_DSPACE "PROFDATA_TYPE_HWC_DSPACE"
#define L2_HWC_DSPACE_UNAME GTXT("Memoryspace Hardware Counters")
#define L2_HWC_GENERAL "PROFDATA_TYPE_HWC_GENERAL"
#define L2_HWC_GENERAL_UNAME GTXT("General Hardware Counters")
#define L1_MPI_STATES "PROFDATA_TYPE_MPI_STATES"
#define L1_MPI_STATES_UNAME GTXT("MPI States")
#define L1_OTHER "PROFDATA_TYPE_OTHER"
#define L1_OTHER_UNAME GTXT("Derived and Other Metrics")
#define L1_STATIC "PROFDATA_TYPE_STATIC"
#define L1_STATIC_UNAME GTXT("Static")
#define L_CP_TOTAL "L_CP_TOTAL"
#define L_CP_TOTAL_CPU "L_CP_TOTAL_CPU"
class BaseMetricTreeNode
{
public:
BaseMetricTreeNode (); // builds basic metric tree (not including HWCs)
virtual ~BaseMetricTreeNode ();
BaseMetricTreeNode *register_metric (BaseMetric *item);
BaseMetricTreeNode *find (const char *name);
void get_nearest_registered_descendents (Vector<BaseMetricTreeNode*> *new_vec);
void get_all_registered_descendents (Vector<BaseMetricTreeNode*> *new_vec);
char *get_description();
char *dump();
BaseMetricTreeNode *get_root () { return root; }
BaseMetricTreeNode *get_parent () { return parent; }
Vector<BaseMetricTreeNode*> *get_children () { return children; }
bool is_registered () { return registered; }
int get_num_registered_descendents () { return num_registered_descendents; }
bool is_composite_metric () { return isCompositeMetric; }
BaseMetric *get_BaseMetric () { return bm; }
char *get_name () { return name; }
char *get_user_name () { return uname; }
char *get_unit () { return unit; }
char *get_unit_uname () { return unit_uname; }
private:
BaseMetricTreeNode (BaseMetric *item);
BaseMetricTreeNode (const char *name, const char *uname,
const char *_unit, const char *_unit_uname);
void init_vars ();
void build_basic_tree ();
BaseMetricTreeNode *add_child (BaseMetric *item);
BaseMetricTreeNode *add_child (const char *name, const char *uname,
const char *unit = NULL, const char *unit_uname = NULL);
BaseMetricTreeNode *add_child (BaseMetricTreeNode *new_node);
void register_node (BaseMetricTreeNode *);
BaseMetricTreeNode *root; // root of tree
BaseMetricTreeNode *parent; // my parent
bool aggregation; // value is based on children's values
char *name; // bm->get_cmd() for metrics, unique string otherwise
char *uname; // user-visible text
char *unit; // see UNIT_* defines
char *unit_uname; // see UNIT_*_UNAME defines
Vector<BaseMetricTreeNode*> *children; // my children
bool isCompositeMetric; // value is sum of children
BaseMetric *bm; // metric for this node, or null
bool registered; // metric has been officially registered
int num_registered_descendents; // does not include self
};
#endif /* _BASEMETRICTREENODE_H */