blob: 9d2c434fbabfbe91a3e8530ad9519b451a8d13cd [file] [log] [blame]
/* 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. */
/*
* The DbeView class represents a window into the data managed by a DbeSession
*
* A DbeView has a Settings class that determines the user preferences,
* instantiated initially as a copy of the one in the DbeSession
* that created it, or in the DbeView being cloned by the DbeSession
*
* A DbeView has a vector of Experiment pointers, matching the one in the
* DbeSession, and a vector of enable bits governing which of the
* Experiments are currently being used to process the data.
*
* A DbeView has three vectors of Metrics, one for functions, etc.,
* a second for callers/callees, and a third for dataspace/memoryspace.
*
* A DbeView has a vector of FilterSet's (q.v.), one for each Experiment,
* used to determine how the data is filtered.
*
* Each DbeView has its own instantiation of the objects representing
* the processed, filtered data. Currently these are a PathTree
* for computing text-based metrics, a DataSpace for computing
* data-based metrics, and a MemorySpace used for computing
* memory-object-based metrics.
*/
#ifndef _DBEVIEW_H
#define _DBEVIEW_H
#include <stdio.h>
#include "dbe_structs.h"
#include "vec.h"
#include "enums.h"
#include "util.h"
#include "DerivedMetrics.h"
#include "Histable.h"
#include "Hist_data.h"
#include "Settings.h"
#include "Metric.h"
#include "Table.h"
#include "PathTree.h"
class Application;
class DataView;
class Experiment;
class Expression;
class FilterSet;
class FilterNumeric;
class FilterExp;
class Function;
class Histable;
class MetricList;
class Module;
class Ovw_data;
class PathTree;
class DataSpace;
class MemorySpace;
class Stats_data;
class LoadObject;
class IOActivity;
class HeapActivity;
class DbeView
{
public:
DbeView (Application *app, Settings *_settings, int _vindex);
DbeView (DbeView *dbev, int _vindex);
~DbeView ();
// Access functions for settings in the view
Settings *
get_settings ()
{
return settings;
};
// Get the list of tabs for this view
Vector<DispTab*> *
get_TabList ()
{
return settings->get_TabList ();
};
// Get the list of memory tabs for this view
Vector<bool> *
get_MemTabState ()
{
return settings->get_MemTabState ();
};
// Set the list of memory tabs for this view
void
set_MemTabState (Vector<bool>*sel)
{
settings->set_MemTabState (sel);
};
// Get the list of index tabs for this view
Vector<bool> *
get_IndxTabState ()
{
return settings->get_IndxTabState ();
};
// Set the list of memory tabs for this view
void
set_IndxTabState (Vector<bool>*sel)
{
settings->set_IndxTabState (sel);
};
// controlling the name format
Cmd_status
set_name_format (char *str)
{
return settings->set_name_format (str);
};
void
set_name_format (int fname_format, bool soname)
{
settings->set_name_format (fname_format, soname);
};
Histable::NameFormat
get_name_format ()
{
return settings->name_format;
}
// processing modes: view_mode
Cmd_status set_view_mode (char *str, bool fromRC); // from a string
void set_view_mode (VMode mode); // from the analyzer
VMode
get_view_mode ()
{
return settings->get_view_mode ();
};
// handling of descendant processes
Cmd_status set_en_desc (char *str, bool rc); // from a string
bool
check_en_desc (const char * lineage_name = NULL, const char *targname = NULL)
{
return settings->check_en_desc (lineage_name, targname);
};
// Controlling the print line-limit
char *
set_limit (char *str, bool rc) // from a string
{
settings->set_limit (str, rc);
return NULL;
};
char *
set_limit (int _limit)
{
settings->limit = _limit;
return NULL;
};
int
get_limit ()
{
return settings->limit;
};
// Controlling the print format mode
char *
set_printmode (char *str)
{
return settings->set_printmode (str);
};
enum PrintMode
get_printmode ()
{
return settings->print_mode;
};
char
get_printdelimiter ()
{
return settings->print_delim;
};
char *
get_printmode_str ()
{
return dbe_strdup (settings->str_printmode);
};
// processing compiler commentary visibility bits, and other source annotation
// controls
Cmd_status
proc_compcom (const char *cmd, bool isSrc, bool rc)
{
return settings->proc_compcom (cmd, isSrc, rc);
};
char *
get_str_scompcom ()
{
return settings->str_scompcom;
};
char *
get_str_dcompcom ()
{
return settings->str_dcompcom;
};
void
set_src_compcom (int v)
{
settings->src_compcom = v;
};
int
get_src_compcom ()
{
return settings->src_compcom;
};
void
set_dis_compcom (int v)
{
settings->dis_compcom = v;
};
int
get_dis_compcom ()
{
return settings->dis_compcom;
};
void
set_cmpline_visible (bool vis)
{
settings->set_cmpline_visible (vis);
}
int
get_cmpline_visible ()
{
return settings->cmpline_visible;
}
void
set_funcline_visible (bool vis)
{
settings->set_funcline_visible (vis);
}
int
get_funcline_visible ()
{
return settings->funcline_visible;
}
// controls for disassembly presentation
void
set_src_visible (int vis)
{
settings->set_src_visible (vis);
}
int
get_src_visible ()
{
return settings->src_visible;
}
void
set_srcmetric_visible (bool vis)
{
settings->set_srcmetric_visible (vis);
}
bool
get_srcmetric_visible ()
{
return settings->srcmetric_visible;
}
void
set_hex_visible (bool vis)
{
settings->set_hex_visible (vis);
}
bool
get_hex_visible ()
{
return settings->hex_visible;
}
// processing and accessing the threshold settings
Cmd_status
proc_thresh (char *cmd, bool isSrc, bool rc)
{
return settings->proc_thresh (cmd, isSrc, rc);
};
void
set_thresh_src (int v)
{
settings->threshold_src = v;
};
int
get_thresh_src ()
{
return settings->threshold_src;
};
void
set_thresh_dis (int v)
{
settings->threshold_dis = v;
};
int
get_thresh_dis ()
{
return settings->threshold_dis;
};
// controls for the Timeline mode, stack presentation
Cmd_status
proc_tlmode (char *cmd, bool rc)
{
return settings->proc_tlmode (cmd, rc);
};
void
set_tlmode (int _tlmode)
{
settings->tlmode = _tlmode;
};
int
get_tlmode ()
{
return settings->tlmode;
};
void
set_stack_align (int _stack_align)
{
settings->stack_align = _stack_align;
};
int
get_stack_align ()
{
return settings->stack_align;
};
void
set_stack_depth (int _stack_depth)
{
settings->stack_depth = _stack_depth;
};
int
get_stack_depth ()
{
return settings->stack_depth;
};
// Controls for which data is shown in Timeline
Cmd_status
proc_tldata (char *cmd, bool rc)
{
return settings->proc_tldata (cmd, rc);
};
void
set_tldata (const char* tldata_cmd)
{
settings->set_tldata (tldata_cmd);
};
char*
get_tldata ()
{
return settings->get_tldata ();
};
// settings controlling the expand/collapse of functions within each LoadObject
enum LibExpand get_lo_expand (int idx);
// set_lo_expand -- returns true if any change
bool set_lo_expand (int idx, enum LibExpand how);
// set_libexpand -- returns true if any change
bool set_libexpand (char *liblist, enum LibExpand flag);
void update_lo_expands ();
bool set_libdefaults ();
void reset ();
void reset_data (bool all);
char *
get_error_msg ()
{
return error_msg;
};
void
clear_error_msg ()
{
error_msg = NULL;
};
char *
get_warning_msg ()
{
return warning_msg;
};
void
clear_warning_msg ()
{
warning_msg = NULL;
};
char *get_processor_msg (int type);
// methods controlling the metric list
BaseMetric *register_metric_expr (BaseMetric::Type type, char *aux, char *expr_spec);
Vector<BaseMetric*> *get_all_reg_metrics ();
void reset_metric_list (MetricList *mlist, int cmp_mode);
// Get the various metric master lists
MetricList *get_metric_ref (MetricType mtype);
// Get the various current metric lists
MetricList *get_metric_list (int dsptype, int subtype);
MetricList *get_metric_list (MetricType mtype);
MetricList *get_metric_list (MetricType mtype, bool compare, int gr_num);
MetricList *get_compare_mlist (MetricList *met_list, int grInd);
// Set the metric list, from a string specification
char *setMetrics (char *metricspec, bool fromRcFile);
// Set the sort metric, from its name
char *setSort (char *sortname, MetricType mtype, bool fromRcFile);
// Set the sort metric, from its visible index (Analyzer)
void setSort (int visindex, MetricType mtype, bool reverse);
// Resort any cached data, after changing sort
void resortData (MetricType mtype);
// Get the sort metric
char *getSort (MetricType mtype);
char *getSortCmd (MetricType mtype);
// reset the metrics
void reset_metrics ();
bool comparingExperiments ();
int
get_compare_mode ()
{
return settings->compare_mode;
};
void
reset_compare_mode (int mode)
{
settings->compare_mode = mode;
};
void set_compare_mode (int mode); // modifies the global MET_* arrays
void add_compare_metrics (MetricList *mlist);
void remove_compare_metrics (MetricList *mlist);
Histable *get_compare_obj (Histable *obj);
// method for printing the instruction-frequency report
void ifreq (FILE *);
// methods controlling the experiment list
void add_experiment (int index, bool enabled);
void add_subexperiment (int index, bool enabled);
void add_experiment_epilogue ();
void drop_experiment (int index);
bool get_exp_enable (int n);
void set_exp_enable (int n, bool e);
// method for new-style filtering
char *set_filter (const char *filter_spec);
char *get_filter (void);
char *get_advanced_filter ();
void backtrack_filter ();
void update_advanced_filter ();
FilterExp *get_FilterExp (Experiment *exp);
Expression *
get_filter_expr ()
{
return cur_filter_expr;
};
// methods controlling old-style filtering
Vector<FilterNumeric*> *get_all_filters (int nexp);
FilterNumeric *get_FilterNumeric (int nexp, int idx);
bool set_pattern (int n, Vector<char *> *pattern_str, bool *error);
bool set_pattern (int m, char *pattern);
// Data processing objects
PathTree *
get_path_tree ()
{
return ptree;
};
DataSpace *
get_data_space ()
{
return dspace;
};
IOActivity *
get_io_space ()
{
return iospace;
};
HeapActivity *
get_heap_space ()
{
return heapspace;
};
Hist_data *get_data (MetricList *mlist, Histable *selObj, int type, int subtype);
int get_sel_ind (Histable *selObj, int type, int subtype);
// Return histogram data for the specified arguments.
Hist_data *get_hist_data (MetricList *mlist, Histable::Type type,
int subtype, // used for memory objects only
Hist_data::Mode mode,
Vector<Histable*> *objs = NULL,
Histable *context = NULL,
Vector<Histable*> *sel_objs = NULL,
PathTree::PtreeComputeOption flag = PathTree::COMPUTEOPT_NONE
);
Hist_data *get_hist_data (MetricList *mlist, Histable::Type type,
int subtype, // used for memory objects only
Hist_data::Mode mode, Histable *obj,
Histable *context = NULL,
Vector<Histable*> *sel_objs = NULL,
PathTree::PtreeComputeOption flag = PathTree::COMPUTEOPT_NONE
);
CStack_data *get_cstack_data (MetricList *);
Stats_data *get_stats_data (int index);
Ovw_data *get_ovw_data (int index);
char *names_src[3]; // names for anno-src
char *names_dis[3]; // names for anno-dis
// Get filtered packets. Ordering is NOT guaranteed to be
// stable between calls; DataView indexes are not persistent -
// use underlying DataDescriptor ids if you don't consume data right away.
// Parameters: idx==exp_id, data_id==kind==ProfData_type
DataView *get_filtered_events (int idx, int data_id);
DataView *get_filtered_events (int idx, int data_id,
const int sortprops[], int sortprop_count);
// SORT is not used for PathTree.
// PathTree reads data once and discards. It doesn't
// depend on the indices so sort can be performed w/o recomputing pathtree.
// Timeline is the primary consumer of sort(), however Races also need to sort.
//
// YM: I can't remember the context for the following note, but
// In case I need it when we refactor more TBR stuff, here it is:
// base metrics like USER_CPU are known,(but we should/should not?)
// explicitly set DATA_CLOCK as a property/attribute?
bool adjust_filter (Experiment *exp);
// Generated report data
Hist_data *func_data; // function list data
Hist_data *line_data; // hot line list data
Hist_data *pc_data; // hot PC list data
Hist_data *src_data; // annotated source data
Hist_data *dis_data; // annotated disasm data
Hist_data *fitem_data; // func item for callers/callees
Hist_data *callers; // callers data
Hist_data *callees; // callees data
Hist_data *dobj_data; // data object list data
Hist_data *dlay_data; // data layout data
Hist_data *iofile_data; // io data aggregated by file name
Hist_data *iovfd_data; // io data aggregated by virtual fd
Hist_data *iocs_data; // io data aggregated by call stack
Hist_data *heapcs_data; // heap data aggregated by call stack
Vector<Hist_data*> *indx_data; // index object data
Vector<int> *lobjectsNoJava; // List of indices into LoadObjects excluding java classes
// memory object data -- create MemorySpace, if needed
MemorySpace *getMemorySpace (int subtype);
char *get_mobj_name (int subtype);
void addIndexSpace (int type);
Hist_data *get_indxobj_data (int subtype);
void set_indxobj_sel (int subtype, int sel_ind);
Histable *get_indxobj_sel (int subtype);
void set_obj_sel_io (int type, long sel_ind);
Histable *set_sel_obj (Histable *obj);
Histable *get_sel_obj (Histable::Type type);
Histable *get_sel_obj_io (uint64_t id, Histable::Type type);
Histable *get_sel_obj_heap (uint64_t id);
Histable *sel_obj; // current selected obj
Histable *sel_dobj; // current selected data obj
Histable *sel_binctx; // current binary context
Vector<Histable*> *sel_idxobj; // selected index objects
char *error_msg; // error message
char *warning_msg; // warning message
Vector<int> *marks; // flagged as important for anno src/dis
Vector<int_pair_t> *marks2dsrc;
Vector<int_pair_t> *marks2dsrc_inc;
Vector<int_pair_t> *marks2ddis;
Vector<int_pair_t> *marks2ddis_inc;
void dump_nodes (FILE *); // dump out the pathtree nodes
void dump_profile (FILE *); // dump out the clock profiling events
void dump_sync (FILE *); // dump out the synctrace events
void dump_iotrace (FILE *); // dump out the IO trace events
void dump_hwc (FILE *); // dump out the HWC Profiling events
void dump_heap (FILE *); // dump out the heap trace events
void dump_gc_events (FILE *); // dump out the Java garbage collector events
int vindex; // index of this view -- set by Analyzer
bool func_scope;
bool
get_func_scope ()
{
return func_scope;
};
void
set_func_scope (bool scope_only)
{
func_scope = scope_only;
};
// value set T if filtering is active, i.e., some packets were dropped
bool filter_active;
bool
get_filter_active ()
{
return filter_active;
};
DerivedMetrics *
get_derived_metrics ()
{
return derived_metrics;
}
// Internal time (time means change)
int
getPhaseIdx ()
{
return phaseIdx;
}
enum DbeView_status
{
DBEVIEW_SUCCESS = 0,
DBEVIEW_NO_DATA,
DBEVIEW_IO_ERROR,
DBEVIEW_BAD_DATA,
DBEVIEW_BAD_SYMBOL_DATA,
DBEVIEW_NO_SEL_OBJ
};
static char *status_str (DbeView_status status);
bool
isOmpDisMode ()
{
return ompDisMode;
}
void
setOmpDisMode ()
{
ompDisMode = true;
}
void
resetOmpDisMode ()
{
ompDisMode = false;
}
bool
isShowHideChanged ()
{
return showHideChanged;
}
void
setShowHideChanged ()
{
showHideChanged = true;
}
void
resetShowHideChanged ()
{
showHideChanged = false;
}
bool
isNewViewMode ()
{
return newViewMode;
}
void
setNewViewMode ()
{
newViewMode = true;
}
void
resetNewViewMode ()
{
newViewMode = false;
}
bool
isFilterHideMode ()
{
return filterHideMode;
}
void
setFilterHideMode ()
{
filterHideMode = true;
}
void
resetFilterHideMode ()
{
filterHideMode = false;
}
bool
isShowAll ()
{
return showAll;
}
void
setShowAll ()
{
showAll = true;
}
void
resetShowAll ()
{
showAll = false;
}
void resetAndConstructShowHideStacks ();
private:
void init ();
Metric *get_compare_metric (Metric *mtr, int groupNum);
// methods controlling old-style filtering
FilterSet *get_filter_set (int n);
void purge_events (int n = -1);
char *cur_filter_str;
char *prev_filter_str;
Expression *cur_filter_expr;
bool noParFilter;
// MemorySpace's -- added when a request is made; for now, never dropped
Vector<MemorySpace*> *memspaces;
MemorySpace *addMemorySpace (int mtype);
Vector<FilterSet*> *filters;
Vector<enum LibExpand> *lo_expands;
Vector<BaseMetric*> *reg_metrics; // vector of registered metrics
Vector<MetricList*> *metrics_lists; // metrics list of MET_NORMAL, MET_CALL...
// note: includes compare metrics
Vector<MetricList*> *metrics_ref_lists;
DerivedMetrics *derived_metrics; // vector of derived metrics
DataSpace *dspace;
PathTree *ptree;
Vector<PathTree *> *indxspaces;
IOActivity *iospace;
HeapActivity *heapspace;
int phaseIdx;
bool ompDisMode;
bool filterHideMode;
bool showAll;
bool showHideChanged;
bool newViewMode;
// Filtered events
Vector<Vector<DataView*>*> *dataViews; //outer idx is exp_id, inner is data_id
Settings *settings;
Application *app;
Function *convert_line_to_func (DbeLine *dbeLine);
DbeInstr *convert_line_to_instr (DbeLine *dbeLine);
DbeInstr *convert_func_to_instr (Function *func);
DbeInstr *lastSelInstr;
Function *lastSelFunc;
void constructShowHideStack (DataDescriptor* dDscr, Experiment *exp);
void resetAndConstructShowHideStack (Experiment *exp);
};
#endif /* _DBEVIEW_H */