/* 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. */ /* * 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 #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 * get_TabList () { return settings->get_TabList (); }; // Get the list of memory tabs for this view Vector * get_MemTabState () { return settings->get_MemTabState (); }; // Set the list of memory tabs for this view void set_MemTabState (Vector*sel) { settings->set_MemTabState (sel); }; // Get the list of index tabs for this view Vector * get_IndxTabState () { return settings->get_IndxTabState (); }; // Set the list of memory tabs for this view void set_IndxTabState (Vector*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 *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 *get_all_filters (int nexp); FilterNumeric *get_FilterNumeric (int nexp, int idx); bool set_pattern (int n, Vector *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 *objs = NULL, Histable *context = NULL, Vector *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 *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 *indx_data; // index object data Vector *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 *sel_idxobj; // selected index objects char *error_msg; // error message char *warning_msg; // warning message Vector *marks; // flagged as important for anno src/dis Vector *marks2dsrc; Vector *marks2dsrc_inc; Vector *marks2ddis; Vector *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 *memspaces; MemorySpace *addMemorySpace (int mtype); Vector *filters; Vector *lo_expands; Vector *reg_metrics; // vector of registered metrics Vector *metrics_lists; // metrics list of MET_NORMAL, MET_CALL... // note: includes compare metrics Vector *metrics_ref_lists; DerivedMetrics *derived_metrics; // vector of derived metrics DataSpace *dspace; PathTree *ptree; Vector *indxspaces; IOActivity *iospace; HeapActivity *heapspace; int phaseIdx; bool ompDisMode; bool filterHideMode; bool showAll; bool showHideChanged; bool newViewMode; // Filtered events Vector*> *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 */