
This adds 'Innovative Computing Labs' as an external author to update-copyright.py, to cover the copyright notice in gprofng/common/opteron_pcbe.c, and uses that plus another external author 'Oracle and' to update gprofng copyright dates. I'm not going to commit 'Oracle and' as an accepted author, but that covers the string "Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved." found in gprofng/testsuite/gprofng.display/jsynprog files.
273 lines
7.3 KiB
C++
273 lines
7.3 KiB
C++
/* Copyright (C) 2021-2023 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
|