summaryrefslogtreecommitdiff
path: root/gprofng/src/Print.h
diff options
context:
space:
mode:
Diffstat (limited to 'gprofng/src/Print.h')
-rw-r--r--gprofng/src/Print.h283
1 files changed, 283 insertions, 0 deletions
diff --git a/gprofng/src/Print.h b/gprofng/src/Print.h
new file mode 100644
index 00000000000..4bc66558b6f
--- /dev/null
+++ b/gprofng/src/Print.h
@@ -0,0 +1,283 @@
+/* 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 _PRINT_H
+#define _PRINT_H
+
+
+// Include files
+#include <stdio.h>
+#include <stdlib.h>
+#include "dbe_types.h"
+#include "Metric.h"
+#include "Hist_data.h"
+#include "Ovw_data.h"
+#include "Stats_data.h"
+#include "Emsg.h"
+#include "Exp_Layout.h"
+#include "DefaultMap.h"
+#include "FileData.h"
+#include "HeapData.h"
+#include "HashMap.h"
+
+const char nl[] = "\n";
+const char tab[] = "\t";
+
+// Printing options.
+enum Print_destination
+{
+ DEST_PRINTER = 0,
+ DEST_FILE = 1,
+ DEST_OPEN_FILE = 2
+};
+
+enum Print_mode
+{
+ MODE_LIST,
+ MODE_DETAIL,
+ MODE_GPROF,
+ MODE_ANNOTATED
+};
+
+struct Print_params
+{
+ Print_destination dest; // printer or file
+ char *name; // of printer or file
+ int ncopies; // # of copies
+ bool header; // print header first
+ FILE *openfile; // if destination is DEST_OPEN_FILE
+};
+
+class Experiment;
+class MetricList;
+class DbeView;
+class Stack_coverage;
+class Function;
+class LoadObject;
+
+// Class Definitions
+class er_print_common_display
+{
+public:
+ er_print_common_display ()
+ {
+ out_file = NULL;
+ pr_params.header = false;
+ }
+
+ virtual ~er_print_common_display () { }
+
+ // Open the file/printer to write to
+ int open (Print_params *);
+
+ void
+ set_out_file (FILE *o)
+ {
+ out_file = o;
+ pr_params.dest = DEST_FILE;
+ }
+
+ // Print the final output data. This function calls
+ // data_dump() to actually do the dumping of data.
+ bool print_output ();
+
+ // Print the output in the appropriate format.
+ virtual void data_dump () = 0;
+
+ void header_dump (int exp_idx);
+
+ // Return the report. If the report size is greater than max, return truncated report
+ // Allocates memory, so the caller should free this memory.
+ char *get_output (int max);
+
+protected:
+ DbeView *dbev;
+ FILE *out_file;
+ Print_params pr_params;
+ char *tmp_file;
+ int exp_idx1, exp_idx2;
+ bool load;
+ bool header;
+};
+
+class er_print_histogram : public er_print_common_display
+{
+public:
+ er_print_histogram (DbeView *dbv, Hist_data *data, MetricList *metrics_list,
+ Print_mode disp_type, int limit, char *sort_name,
+ Histable *sobj, bool show_load, bool show_header);
+ void data_dump ();
+
+private:
+ void dump_list (int limit);
+ void dump_detail (int limit);
+ void get_gprof_width (Metric::HistMetric *hist_metric, int limit);
+ void dump_gprof (int limit);
+ void dump_annotated_dataobjects (Vector<int> *marks, int threshold);
+ void dump_annotated ();
+
+ Stack_coverage *stack_cov;
+ Hist_data *hist_data;
+ MetricList *mlist;
+ Print_mode type;
+ int number_entries;
+ char *sort_metric;
+ Histable *sel_obj;
+};
+
+class er_print_ctree : public er_print_common_display
+{
+public:
+ er_print_ctree (DbeView *dbv, Vector<Histable*> *cstack, Histable *sobj,
+ int limit);
+ void data_dump ();
+ void print_children (Hist_data *data, int index, Histable *obj, char *prefix,
+ Hist_data::HistItem *total);
+
+private:
+ Vector<Histable*> *cstack;
+ Histable *sobj;
+ MetricList *mlist;
+ Metric::HistMetric *hist_metric;
+ char **fmt_int;
+ char **fmt_real0;
+ char **fmt_real1;
+ int limit;
+ int print_row;
+};
+
+class er_print_gprof : public er_print_common_display
+{
+public:
+ er_print_gprof (DbeView *dbv, Vector<Histable*> *cstack);
+ void data_dump ();
+private:
+ Vector<Histable*> *cstack;
+};
+
+class er_print_leaklist : public er_print_common_display
+{
+public:
+ er_print_leaklist (DbeView *dbv, bool show_leak,
+ bool show_alloca, int limit);
+ void data_dump ();
+
+private:
+ bool leak;
+ bool alloca;
+ int limit;
+};
+
+class er_print_heapactivity : public er_print_common_display
+{
+public:
+ er_print_heapactivity (DbeView *_dbev, Histable::Type _type,
+ bool _printStat, int _limit);
+ void data_dump ();
+
+private:
+ void printStatistics (Hist_data *hist_data);
+ void printCallStacks (Hist_data *hist_data);
+
+ Histable::Type type;
+ bool printStat;
+ int limit;
+};
+
+class er_print_ioactivity : public er_print_common_display
+{
+public:
+ er_print_ioactivity (DbeView *_dbev, Histable::Type _type,
+ bool _printStat, int _limit);
+ void data_dump ();
+
+private:
+ void printStatistics (Hist_data *hist_data);
+ void printCallStacks (Hist_data *hist_data);
+
+ Histable::Type type;
+ bool printStat;
+ int limit;
+};
+
+class er_print_experiment : public er_print_common_display
+{
+public:
+ er_print_experiment (DbeView *me, int bgn_idx, int end_idx, bool show_load,
+ bool show_header, bool show_stat, bool show_over, bool show_odetail);
+ void data_dump ();
+
+private:
+ char fmt1[32], fmt2[32], fmt3[32], fmt4[32];
+ // buffers shared by the following functions
+ void overview_sum (int &maxlen);
+ void overview_dump (int exp_idx, int &maxlen);
+ void overview_summary (Ovw_data *ovw_data, int &maxlen);
+ void overview_item (Ovw_data::Ovw_item *ovw_item,
+ Ovw_data::Ovw_item *ovw_item_labels);
+ void overview_value (Value *value, ValueTag value_tag,
+ double total_value);
+ void statistics_sum (int &maxlen);
+ void statistics_dump (int exp_idx, int &maxlen);
+ void statistics_item (Stats_data *stats_data);
+
+ bool stat;
+ bool over;
+ bool odetail;
+};
+
+// Print the header. Experiment name and the sample
+// selection, along with the percentage.
+char *pr_load_objects (Vector<LoadObject*> *loadobjects, char *lead);
+char *pr_samples (Experiment *exp);
+char *pr_mesgs (Emsg *msg, const char *null_str, const char *lead);
+void print_load_object (FILE *out_file);
+void print_header (Experiment *exp, FILE *out_file);
+
+// Print Function metrics
+void get_width (Hist_data *data, MetricList *metrics_list,
+ Metric::HistMetric *hist_metric);
+void get_format (char **fmt_int, char **fmt_real0, char **fmt_real1,
+ MetricList *metrics_list, Metric::HistMetric *hist_metric,
+ int nspace);
+int print_label (FILE *out_file, MetricList *metrics_list,
+ Metric::HistMetric *hist_metric, int space);
+void print_anno_file (char *name, const char *sel, const char *srcFile,
+ bool isDisasm, FILE *dis_file, FILE *inp_file,
+ FILE *out_file, DbeView *dbev, bool xdefault);
+void print_html_title (FILE *out_file, char *title);
+void print_html_label (FILE *out_file, MetricList *metrics_list);
+void print_html_content (FILE *out_file, Hist_data *d, MetricList *metrics_list,
+ int limit, Histable::NameFormat nfmt);
+void print_html_one (FILE *out_file, Hist_data *data, Hist_data::HistItem *item,
+ MetricList *metrics_list, Histable::NameFormat nfmt);
+void print_html_trailer (FILE* out_file);
+char *html_ize_name (char *name);
+void print_delim_label (FILE *out_file, MetricList *metrics_list, char delim);
+void print_delim_content (FILE *out_file, Hist_data *data,
+ MetricList *metrics_list, int limit,
+ Histable::NameFormat nfmt, char delim);
+void print_delim_one (FILE *out_file, Hist_data *data, Hist_data::HistItem *item,
+ MetricList *metrics_list, Histable::NameFormat nfmt, char delim);
+void print_delim_trailer (FILE* out_file, char delim);
+char *csv_ize_name (char *name, char delim);
+char *split_metric_name (char *name);
+
+#endif