Retro68/binutils/gprofng/src/Print.h
Wolfgang Thaller f485e125c4 binutils 2.39
2022-10-27 20:45:45 +02:00

274 lines
7.3 KiB
C++

/* 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;
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:
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<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
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