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 _PRINT_H
22#define _PRINT_H
23
24
25// Include files
26#include <stdio.h>
27#include <stdlib.h>
28#include "dbe_types.h"
29#include "Metric.h"
30#include "Hist_data.h"
31#include "Ovw_data.h"
32#include "Stats_data.h"
33#include "Emsg.h"
34#include "Exp_Layout.h"
35#include "DefaultMap.h"
36#include "FileData.h"
37#include "HeapData.h"
38#include "HashMap.h"
39
40const char nl[] = "\n";
41const char tab[] = "\t";
42
43// Printing options.
44enum Print_destination
45{
46  DEST_PRINTER      = 0,
47  DEST_FILE         = 1,
48  DEST_OPEN_FILE    = 2
49};
50
51enum Print_mode
52{
53  MODE_LIST,
54  MODE_DETAIL,
55  MODE_GPROF,
56  MODE_ANNOTATED
57};
58
59struct Print_params
60{
61  Print_destination dest;   // printer or file
62  char *name;               // of printer or file
63  int ncopies;              // # of copies
64  bool header;              // print header first
65  FILE *openfile;           // if destination is DEST_OPEN_FILE
66};
67
68class Experiment;
69class MetricList;
70class DbeView;
71class Stack_coverage;
72class Function;
73class LoadObject;
74
75//  Class Definitions
76class er_print_common_display
77{
78public:
79  er_print_common_display ()
80  {
81    out_file = NULL;
82    pr_params.header = false;
83  }
84
85  virtual ~er_print_common_display () { }
86
87  //  Open the file/printer to write to
88  int open (Print_params *);
89
90  void
91  set_out_file (FILE *o)
92  {
93    out_file = o;
94    pr_params.dest = DEST_FILE;
95  }
96
97  //  Print the final output data.  This function calls
98  //  data_dump() to actually do the dumping of data.
99  bool print_output ();
100
101  //  Print the output in the appropriate format.
102  virtual void data_dump () = 0;
103
104  void header_dump (int exp_idx);
105
106  // Return the report. If the report size is greater than max, return truncated report
107  // Allocates memory, so the caller should free this memory.
108  char *get_output (int max);
109
110protected:
111  DbeView *dbev;
112  FILE *out_file;
113  Print_params pr_params;
114  char *tmp_file;
115  int exp_idx1, exp_idx2;
116  bool load;
117  bool header;
118};
119
120class er_print_histogram : public er_print_common_display
121{
122public:
123  er_print_histogram (DbeView *dbv, Hist_data *data, MetricList *metrics_list,
124		      Print_mode disp_type, int limit, char *sort_name,
125		      Histable *sobj, bool show_load, bool show_header);
126  void data_dump ();
127
128private:
129  void dump_list (int limit);
130  void dump_detail (int limit);
131  void get_gprof_width (Metric::HistMetric *hist_metric, int limit);
132  void dump_gprof (int limit);
133  void dump_annotated_dataobjects (Vector<int> *marks, int threshold);
134  void dump_annotated ();
135
136  Stack_coverage *stack_cov;
137  Hist_data *hist_data;
138  MetricList *mlist;
139  Print_mode type;
140  int number_entries;
141  char *sort_metric;
142  Histable *sel_obj;
143};
144
145class er_print_ctree : public er_print_common_display
146{
147public:
148  er_print_ctree (DbeView *dbv, Vector<Histable*> *cstack, Histable *sobj,
149		  int limit);
150  void data_dump ();
151  void print_children (Hist_data *data, int index, Histable *obj, char *prefix,
152		       Hist_data::HistItem *total);
153
154private:
155  Vector<Histable*> *cstack;
156  Histable *sobj;
157  MetricList *mlist;
158  Metric::HistMetric *hist_metric;
159  int limit;
160  int print_row;
161};
162
163class er_print_gprof : public er_print_common_display
164{
165public:
166  er_print_gprof (DbeView *dbv, Vector<Histable*> *cstack);
167  void data_dump ();
168private:
169  Vector<Histable*> *cstack;
170};
171
172class er_print_leaklist : public er_print_common_display
173{
174public:
175  er_print_leaklist (DbeView *dbv, bool show_leak,
176		     bool show_alloca, int limit);
177  void data_dump ();
178
179private:
180  bool leak;
181  bool alloca;
182  int limit;
183};
184
185class er_print_heapactivity : public er_print_common_display
186{
187public:
188  er_print_heapactivity (DbeView *_dbev, Histable::Type _type,
189			 bool _printStat, int _limit);
190  void data_dump ();
191
192private:
193  void printStatistics (Hist_data *hist_data);
194  void printCallStacks (Hist_data *hist_data);
195
196  Histable::Type type;
197  bool printStat;
198  int limit;
199};
200
201class er_print_ioactivity : public er_print_common_display
202{
203public:
204  er_print_ioactivity (DbeView *_dbev, Histable::Type _type,
205		       bool _printStat, int _limit);
206  void data_dump ();
207
208private:
209  void printStatistics (Hist_data *hist_data);
210  void printCallStacks (Hist_data *hist_data);
211
212  Histable::Type type;
213  bool printStat;
214  int limit;
215};
216
217class er_print_experiment : public er_print_common_display
218{
219public:
220  er_print_experiment (DbeView *me, int bgn_idx, int end_idx, bool show_load,
221	   bool show_header, bool show_stat, bool show_over, bool show_odetail);
222  void data_dump ();
223
224private:
225  int max_len1, max_len2, max_len3;
226  void overview_sum (int &maxlen);
227  void overview_dump (int exp_idx, int &maxlen);
228  void overview_summary (Ovw_data *ovw_data, int &maxlen);
229  void overview_item (Ovw_data::Ovw_item *ovw_item,
230		      Ovw_data::Ovw_item *ovw_item_labels);
231  void overview_value (Value *value, ValueTag value_tag, double total_value);
232  void statistics_sum (int &maxlen);
233  void statistics_dump (int exp_idx, int &maxlen);
234  void statistics_item (Stats_data *stats_data);
235
236  bool stat;
237  bool over;
238  bool odetail;
239};
240
241//  Print the header.  Experiment name and the sample
242//  selection, along with the percentage.
243char *pr_load_objects (Vector<LoadObject*> *loadobjects, char *lead);
244char *pr_samples (Experiment *exp);
245char *pr_mesgs (Emsg *msg, const char *null_str, const char *lead);
246void print_load_object (FILE *out_file);
247void print_header (Experiment *exp, FILE *out_file);
248
249// Print Function metrics
250int print_label (FILE *out_file, MetricList *metrics_list,
251		 Metric::HistMetric *hist_metric, int space);
252void print_anno_file (char *name, const char *sel, const char *srcFile,
253		      bool isDisasm, FILE *dis_file, FILE *inp_file,
254		      FILE *out_file, DbeView *dbev, bool xdefault);
255void print_html_title (FILE *out_file, char *title);
256void print_html_label (FILE *out_file, MetricList *metrics_list);
257void print_html_content (FILE *out_file, Hist_data *d, MetricList *metrics_list,
258			 int limit, Histable::NameFormat nfmt);
259void print_html_one (FILE *out_file, Hist_data *data, Hist_data::HistItem *item,
260		     MetricList *metrics_list, Histable::NameFormat nfmt);
261void print_html_trailer (FILE* out_file);
262char *html_ize_name (char *name);
263void print_delim_label (FILE *out_file, MetricList *metrics_list, char delim);
264void print_delim_content (FILE *out_file, Hist_data *data,
265			  MetricList *metrics_list, int limit,
266			  Histable::NameFormat nfmt, char delim);
267void print_delim_one (FILE *out_file, Hist_data *data, Hist_data::HistItem *item,
268	       MetricList *metrics_list, Histable::NameFormat nfmt, char delim);
269void print_delim_trailer (FILE* out_file, char delim);
270char *csv_ize_name (char *name, char delim);
271char *split_metric_name (char *name);
272
273#endif
274