/* Copyright (C) 2021-2024 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 #include #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 *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 *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 *cstack; Histable *sobj; MetricList *mlist; Metric::HistMetric *hist_metric; int limit; int print_row; }; class er_print_gprof : public er_print_common_display { public: er_print_gprof (DbeView *dbv, Vector *cstack); void data_dump (); private: Vector *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: int max_len1, max_len2, max_len3; 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 *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 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