1/* Copyright (C) 2021-2024 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 _BASEMETRICTREENODE_H
22#define _BASEMETRICTREENODE_H
23
24#include "BaseMetric.h"
25
26// Unit values
27#define UNIT_SECONDS            "SECONDS"
28#define UNIT_SECONDS_UNAME      GTXT("secs.")
29#define UNIT_BYTES              "BYTES"
30#define UNIT_BYTES_UNAME        GTXT("bytes")
31
32// Name values for intermediate parent nodes that aren't defined elsewhere
33#define L1_DURATION             "PROFDATA_TYPE_DURATION"
34#define L1_DURATION_UNAME       GTXT("Experiment Duration")
35#define L1_GCDURATION           "PROFDATA_TYPE_GCDURATION"
36#define L1_GCDURATION_UNAME     GTXT("Java Garbage Collection Duration")
37#define L2_HWC_DSPACE           "PROFDATA_TYPE_HWC_DSPACE"
38#define L2_HWC_DSPACE_UNAME     GTXT("Memoryspace Hardware Counters")
39#define L2_HWC_GENERAL          "PROFDATA_TYPE_HWC_GENERAL"
40#define L2_HWC_GENERAL_UNAME    GTXT("General Hardware Counters")
41#define L1_MPI_STATES           "PROFDATA_TYPE_MPI_STATES"
42#define L1_MPI_STATES_UNAME     GTXT("MPI States")
43#define L1_OTHER                "PROFDATA_TYPE_OTHER"
44#define L1_OTHER_UNAME          GTXT("Derived and Other Metrics")
45#define L1_STATIC               "PROFDATA_TYPE_STATIC"
46#define L1_STATIC_UNAME         GTXT("Static")
47#define L_CP_TOTAL              "L_CP_TOTAL"
48#define L_CP_TOTAL_CPU          "L_CP_TOTAL_CPU"
49
50class BaseMetricTreeNode
51{
52public:
53  BaseMetricTreeNode (); // builds basic metric tree (not including HWCs)
54  virtual ~BaseMetricTreeNode ();
55  BaseMetricTreeNode *register_metric (BaseMetric *item);
56  BaseMetricTreeNode *find (const char *name);
57  void get_nearest_registered_descendents (Vector<BaseMetricTreeNode*> *new_vec);
58  void get_all_registered_descendents (Vector<BaseMetricTreeNode*> *new_vec);
59  char *get_description();
60  char *dump();
61
62  BaseMetricTreeNode *get_root ()       { return root; }
63  BaseMetricTreeNode *get_parent ()     { return parent; }
64  Vector<BaseMetricTreeNode*> *get_children () { return children; }
65  bool is_registered ()                 { return registered; }
66  int get_num_registered_descendents () { return num_registered_descendents; }
67  bool is_composite_metric ()           { return isCompositeMetric; }
68  BaseMetric *get_BaseMetric ()         { return bm; }
69  char *get_name ()                     { return name; }
70  char *get_user_name ()                { return uname; }
71  char *get_unit ()                     { return unit; }
72  char *get_unit_uname ()               { return unit_uname; }
73
74private:
75  BaseMetricTreeNode (BaseMetric *item);
76  BaseMetricTreeNode (const char *name, const char *uname,
77		      const char *_unit, const char *_unit_uname);
78  void init_vars ();
79  void build_basic_tree ();
80  BaseMetricTreeNode *add_child (BaseMetric *item);
81  BaseMetricTreeNode *add_child (const char *name, const char *uname,
82				  const char *unit = NULL, const char *unit_uname = NULL);
83  BaseMetricTreeNode *add_child (BaseMetricTreeNode *new_node);
84  void register_node (BaseMetricTreeNode *);
85
86  BaseMetricTreeNode *root;     // root of tree
87  BaseMetricTreeNode *parent;   // my parent
88  bool aggregation;             // value is based on children's values
89  char *name;           // bm->get_cmd() for metrics, unique string otherwise
90  char *uname;                  // user-visible text
91  char *unit;                   // see UNIT_* defines
92  char *unit_uname;             // see UNIT_*_UNAME defines
93  Vector<BaseMetricTreeNode*> *children;    // my children
94  bool isCompositeMetric;       // value is sum of children
95  BaseMetric *bm;               // metric for this node, or null
96  bool registered;              // metric has been officially registered
97  int num_registered_descendents;   // does not include self
98};
99
100#endif  /* _BASEMETRICTREENODE_H */
101