(root)/
binutils-2.41/
gprofng/
src/
Print.h
       1  /* Copyright (C) 2021-2023 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  
      40  const char nl[] = "\n";
      41  const char tab[] = "\t";
      42  
      43  // Printing options.
      44  enum Print_destination
      45  {
      46    DEST_PRINTER      = 0,
      47    DEST_FILE         = 1,
      48    DEST_OPEN_FILE    = 2
      49  };
      50  
      51  enum Print_mode
      52  {
      53    MODE_LIST,
      54    MODE_DETAIL,
      55    MODE_GPROF,
      56    MODE_ANNOTATED
      57  };
      58  
      59  struct 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  
      68  class Experiment;
      69  class MetricList;
      70  class DbeView;
      71  class Stack_coverage;
      72  class Function;
      73  class LoadObject;
      74  
      75  //  Class Definitions
      76  class er_print_common_display
      77  {
      78  public:
      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  
     110  protected:
     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  
     120  class er_print_histogram : public er_print_common_display
     121  {
     122  public:
     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  
     128  private:
     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  
     145  class er_print_ctree : public er_print_common_display
     146  {
     147  public:
     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  
     154  private:
     155    Vector<Histable*> *cstack;
     156    Histable *sobj;
     157    MetricList *mlist;
     158    Metric::HistMetric *hist_metric;
     159    int limit;
     160    int print_row;
     161  };
     162  
     163  class er_print_gprof : public er_print_common_display
     164  {
     165  public:
     166    er_print_gprof (DbeView *dbv, Vector<Histable*> *cstack);
     167    void data_dump ();
     168  private:
     169    Vector<Histable*> *cstack;
     170  };
     171  
     172  class er_print_leaklist : public er_print_common_display
     173  {
     174  public:
     175    er_print_leaklist (DbeView *dbv, bool show_leak,
     176  		     bool show_alloca, int limit);
     177    void data_dump ();
     178  
     179  private:
     180    bool leak;
     181    bool alloca;
     182    int limit;
     183  };
     184  
     185  class er_print_heapactivity : public er_print_common_display
     186  {
     187  public:
     188    er_print_heapactivity (DbeView *_dbev, Histable::Type _type,
     189  			 bool _printStat, int _limit);
     190    void data_dump ();
     191  
     192  private:
     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  
     201  class er_print_ioactivity : public er_print_common_display
     202  {
     203  public:
     204    er_print_ioactivity (DbeView *_dbev, Histable::Type _type,
     205  		       bool _printStat, int _limit);
     206    void data_dump ();
     207  
     208  private:
     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  
     217  class er_print_experiment : public er_print_common_display
     218  {
     219  public:
     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  
     224  private:
     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.
     243  char *pr_load_objects (Vector<LoadObject*> *loadobjects, char *lead);
     244  char *pr_samples (Experiment *exp);
     245  char *pr_mesgs (Emsg *msg, const char *null_str, const char *lead);
     246  void print_load_object (FILE *out_file);
     247  void print_header (Experiment *exp, FILE *out_file);
     248  
     249  // Print Function metrics
     250  int print_label (FILE *out_file, MetricList *metrics_list,
     251  		 Metric::HistMetric *hist_metric, int space);
     252  void 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);
     255  void print_html_title (FILE *out_file, char *title);
     256  void print_html_label (FILE *out_file, MetricList *metrics_list);
     257  void print_html_content (FILE *out_file, Hist_data *d, MetricList *metrics_list,
     258  			 int limit, Histable::NameFormat nfmt);
     259  void print_html_one (FILE *out_file, Hist_data *data, Hist_data::HistItem *item,
     260  		     MetricList *metrics_list, Histable::NameFormat nfmt);
     261  void print_html_trailer (FILE* out_file);
     262  char *html_ize_name (char *name);
     263  void print_delim_label (FILE *out_file, MetricList *metrics_list, char delim);
     264  void print_delim_content (FILE *out_file, Hist_data *data,
     265  			  MetricList *metrics_list, int limit,
     266  			  Histable::NameFormat nfmt, char delim);
     267  void print_delim_one (FILE *out_file, Hist_data *data, Hist_data::HistItem *item,
     268  	       MetricList *metrics_list, Histable::NameFormat nfmt, char delim);
     269  void print_delim_trailer (FILE* out_file, char delim);
     270  char *csv_ize_name (char *name, char delim);
     271  char *split_metric_name (char *name);
     272  
     273  #endif