diff options
author | Vladimir Mezentsev <vladimir.mezentsev@oracle.com> | 2022-03-11 08:58:31 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2022-03-11 08:58:31 +0000 |
commit | bb368aad297fe3ad40cf397e6fc85aa471429a28 (patch) | |
tree | 0ab25909b8fe789d676bbdb00d501d4d485e4afe /gprofng/src/DbeSession.h | |
parent | a655f19af95eb685ba64f48ee8fc2b3b7a3d886a (diff) | |
download | gdb-bb368aad297fe3ad40cf397e6fc85aa471429a28.zip gdb-bb368aad297fe3ad40cf397e6fc85aa471429a28.tar.gz gdb-bb368aad297fe3ad40cf397e6fc85aa471429a28.tar.bz2 |
gprofng: a new GNU profiler
top-level
* Makefile.def: Add gprofng module.
* configure.ac: Add --enable-gprofng option.
* src-release.sh: Add gprofng.
* Makefile.in: Regenerate.
* configure: Regenerate.
* gprofng: New directory.
binutils
* MAINTAINERS: Add gprofng maintainer.
* README-how-to-make-a-release: Add gprofng.
include.
* collectorAPI.h: New file.
* libcollector.h: New file.
* libfcollector.h: New file.
Diffstat (limited to 'gprofng/src/DbeSession.h')
-rw-r--r-- | gprofng/src/DbeSession.h | 481 |
1 files changed, 481 insertions, 0 deletions
diff --git a/gprofng/src/DbeSession.h b/gprofng/src/DbeSession.h new file mode 100644 index 0000000..0a5c01c --- /dev/null +++ b/gprofng/src/DbeSession.h @@ -0,0 +1,481 @@ +/* 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 DbeSession class is instantiated by a DbeApplication, and contains + * all the data referring to a set of loaded experiments + * + * It manages a set of tables for the Experiments, for the LoadObjects + * referenced in them, and for the other objects representing the + * elements in the program hierarchy that can have metrics associated + * with them. It also has a master list of all the metrics available + * from all the loaded experiments. + * + * It gets an instance of the Settings class, instantiated as a copy + * of the one in the DbeApplication that instantiated the DbeSession. + * + * In addition, it manages a vector of DbeView's (q.v.); each DbeView + * represents a window into the DbeSession, and has its own set of + * Settings, and FilterSets for the Experiments, and is the access point + * for all processed data. + */ + +#ifndef _DBESESSION_H +#define _DBESESSION_H + + +#include <stdio.h> +#include "dbe_structs.h" +#include "vec.h" +#include "Hist_data.h" +#include "Histable.h" +#include "BaseMetric.h" +#include "BaseMetricTreeNode.h" +#include "MemorySpace.h" +#include "hwcentry.h" +#include "dbe_types.h" +#include "Settings.h" +#include "HashMap.h" +#include "Table.h" +#include "Experiment.h" + +class DbeSession; +class Experiment; +class Expression; +class ExpGroup; +class Function; +class JMethod; +class Histable; +class DbeView; +class Module; +class LoadObject; +class DataObject; +class SourceFile; +class Settings; +class StringBuilder; +class UserLabel; +class DbeFile; +class DbeJarFile; +class FileData; +class HeapData; +template <typename ITEM> class DbeSyncMap; +template <class ITEM> class Vector; + +struct DispTab; +struct List; +struct Countable; +class IndexObjType_t; + +typedef struct +{ + char *path; + Experiment *exp; + DbeSession *ds; + bool read_ahead; +} exp_ctx; + +class DbeSession +{ +public: + DbeSession (Settings *_settings, bool _ipc_mode, bool _rdt_mode); + ~DbeSession (); + + void reset (); + void reset_data (); + + void + set_interactive (bool _interactive) + { + interactive = _interactive; + } + + bool + is_interactive () + { + return interactive; + } + + bool is_datamode_available (); + bool is_leaklist_available (); + bool is_heapdata_available (); + bool is_iodata_available (); + bool is_racelist_available (); + bool is_deadlocklist_available (); + bool is_timeline_available (); + bool is_ifreq_available (); + bool is_omp_available (); + bool has_java (); + bool has_ompavail (); + + // XXX get_clock should be removed, to support cpus with different clocks + // XXX means reworking time-convertible HWC code + int get_clock (int id); + + // Access functions for DbeView's + int createView (); + int createView (int index, int cloneindex); + DbeView *getView (int index); + void dropView (int index); + + // Access functions controlling the experiment list + Vector<char*> *get_group_or_expt (char *path); // load an experiment or group + + void open_experiment (Experiment *exp, char *path); + Experiment *get_exp (int exp_ind); + Vector<Vector<char*>*> *getExperimensGroups (); + char *setExperimentsGroups (Vector<Vector<char*>*> *groups); + char *drop_experiment (int exp_ind); + int find_experiment (char *path); + + int + nexps () + { + return exps->size (); + } + int ngoodexps (); + + // Access functions controlling the DataObject list + DataObject *createDataObject (); + DataObject *createDataObject (DataObject *d, DataObject *p = NULL); + DataObject *createMasterDataObject (DataObject *); + Vector<DataObject*> *get_dobj_elements (DataObject *); + + DataObject * + get_Total_DataObject () + { + return d_total; + }; + + DataObject * + get_Unknown_DataObject () + { + return d_unknown; + }; + + DataObject * + get_Scalars_DataObject () + { + return d_scalars; + }; + + DataObject *find_dobj_by_name (char *dobj_name); + DataObject *find_dobj_match (DataObject *dobj); + DataObject *find_dobj_master (DataObject *dobj); + + int + ndobjs () + { + return dobjs->size (); + } + + // check if no -xhwcprof should be ignored + bool + check_ignore_no_xhwcprof () + { + return settings->get_ignore_no_xhwcprof (); + }; + + // check if FS warning should be comment, or real warning + bool + check_ignore_fs_warn () + { + return settings->get_ignore_fs_warn (); + }; + + // Access functions controlling the LoadObject list + DbeSyncMap<LoadObject> *loadObjMap; + void append (LoadObject *lobj); + LoadObject *createLoadObject (const char *nm, int64_t cksum = 0); + LoadObject *createLoadObject (const char *nm, const char *runTimePath, DbeFile *df); + + Vector<LoadObject *> * + get_LoadObjects () + { + return lobjs; + }; + + void dobj_updateHT (DataObject *dobj); + LoadObject *get_Total_LoadObject (); + Vector<LoadObject*> *get_text_segments (); + LoadObject *get_Unknown_LoadObject (); + LoadObject *find_lobj_by_name (const char *lobj_name, int64_t cksum = 0); + + // Access functions controlling the Tab list + Vector<DispTab*> * + get_TabList () + { + return settings->get_TabList (); + }; + + Vector<bool> * + get_MemTabList () + { + return settings->get_MemTabState (); + }; + + void mobj_define (MemObjType_t *); + + // Access functions controlling metrics + BaseMetric *find_base_reg_metric (char *mcmd); + Vector<BaseMetric*> *get_base_reg_metrics (); // excludes comparison (expr) variants + + Vector<BaseMetric*> * + get_all_reg_metrics () + { + return reg_metrics; // includes comparison (expr) variants + }; + + BaseMetricTreeNode *get_reg_metrics_tree (); + BaseMetric *register_metric_expr (BaseMetric::Type type, char *aux, char *expr_spec); + BaseMetric *register_metric (BaseMetric::Type type); + BaseMetric *register_metric (char *name, char *username, char *_def); + BaseMetric *register_metric (Hwcentry *ctr, const char* cmdname, const char* username); + void drop_metric (BaseMetric *); + Module *createModule (LoadObject *lo, const char *nm); + Module *createUnknownModule (LoadObject *lo); + Module *createClassFile (char *className); + DbeFile *getDbeFile (char *filename, int filetype); + SourceFile *get_Unknown_Source (); + SourceFile *createSourceFile (const char *path); + Histable *createHistObject (Histable::Type); + Function *createFunction (); + Function *create_hide_function (LoadObject *lo); + Function *get_Total_Function (); + Function *get_Unknown_Function (); + Function *get_JUnknown_Function (); + Function *get_jvm_Function (); + LoadObject *get_OMP_LoadObject (); + Function *get_OMP_Function (int); + JMethod *createJMethod (); + Histable *createIndexObject (int idxtype, int64_t idx); + Histable *createIndexObject (int idxtype, Histable *hobj); + + enum SpecialFunction + { + TruncatedStackFunc, + FailedUnwindFunc, + LastSpecialFunction + }; + Function *getSpecialFunction (SpecialFunction); + + Histable * + findObjectById (uint64_t _id) + { + long id = (long) _id; + return (id >= 0 && id < objs->size ()) ? objs->fetch (id) : NULL; + } + + Histable *findObjectById (Histable::Type type, int subtype, uint64_t id); + + // Other access functions + bool find_obj (FILE *dis_file, FILE *inp_file, Histable *&obj, char *name, + const char *sel, Histable::Type type, bool xdefault); + int ask_which (FILE *dis_file, FILE *inp_file, Vector<Histable*> *list, char *name); + LoadObject *map_NametoLoadObject (char *name, Vector<Histable*> *, int which); + Module *map_NametoModule (char *name, Vector<Histable*> *, int which); + Function *map_NametoFunction (char *, Vector<Histable*> *, const char *); + DataObject *map_NametoDataObject (char *name, Vector<Histable*> *, int which); + bool match_FName (char *name, Function *func); + + // Functions to convert a string to all matching Functions/DataObjects + Vector<Function *> *match_func_names (const char *ustr, Histable::NameFormat nfmt); + Vector<DataObject *> *match_dobj_names (char *); + + // Functions to convert a string to all matching JThreads + Vector<JThread*> *match_java_threads (char *ustr, int matchParent, + Vector<uint64_t> * &grids, + Vector<uint64_t> * &expids); + // Function to convert a string to all matching File names + Vector<FileData *> *match_file_names (char *ustr, Histable::NameFormat nfmt); + + // Access functions concerning the search path + Vector<char*> * + get_search_path () + { + return search_path; + } + + Vector<DbeFile*>*get_classpath (); + void set_search_path (Vector<char*> *path, bool reset); + void set_search_path (char *lpath, bool reset); + bool add_classpath (char *path); + bool add_path (char *path); + void set_pathmaps (Vector<pathmap_t*> *newPathMap); + Vector<pathmap_t*> *get_pathmaps (); + + // functions to aid debugging + void dump_stacks (FILE *); + void dump_dataobjects (FILE *); + void dump_segments (FILE *); + void dump_map (FILE *); + + // Find dynamic property by name + int registerPropertyName (const char *name); + int getPropIdByName (const char *name); + char* getPropName (int propId); + char* getPropUName (int propId); + + Vector<UserLabel*> *userLabels; // List of er_labels + UserLabel *findUserLabel (char *name); + DbeJarFile *get_JarFile (const char *name); + void append (UserLabel *lbl); + void append (SourceFile *sf); + void append (Experiment *exp); + void append (Hwcentry *exp); + void set_need_refind (); + + // Find user defined object by name + Expression *findObjDefByName (char *); + void get_filter_keywords (Vector<void*> *res); + + // Get the Settings class object + Settings * + get_settings () + { + return settings; + } + + // static members, used to define or fetch the various IndexSpaces + Vector<void*> *getIndxObjDescriptions (void); + Vector<void*> *getCustomIndxObjects (void); + char *indxobj_define (const char *, char *, const char *, char *, char *); + char *getIndexSpaceName (int index); + char *getIndexSpaceDescr (int index); + Expression *getIndexSpaceExpr (int index); + char *getIndexSpaceExprStr (int index); + int findIndexSpaceByName (const char *mname); + void removeIndexSpaceByName (const char *mname); + IndexObjType_t *getIndexSpace (int index); + IndexObjType_t *findIndexSpace (const char *mname); + Expression *ql_parse (const char *expr_spec); + BaseMetric *find_metric (BaseMetric::Type type, const char *cmd, const char *expr_spec = NULL); + static void dump (char *msg, Vector<Metric*> *mlist); + static void dump (char *msg, Vector<BaseMetric*> *mlist); + static Platform_t platform; // Sparc, Intel + Vector<ExpGroup *> *expGroups; + HashMap<char*, LoadObject *> *comp_lobjs; // list of comparable LoadObjects + HashMap<char*, DbeLine *> *comp_dbelines; // list of comparable DbeLines + HashMap<char*, SourceFile*>*comp_sources; // list of comparable SourceFiles + char *localized_SP_UNKNOWN_NAME; + + void + set_lib_visibility_used () + { + lib_visibility_used = true; + } + + bool + is_lib_visibility_used () + { + return lib_visibility_used; + } + + void unlink_tmp_files (); + char *get_tmp_file_name (const char *nm, bool for_java); + + Vector<char *> *tmp_files; + int status_ompavail; + int archive_mode; + bool ipc_mode; + bool rdt_mode; + + // data and methods concerning the machine model + // methods are in source file MachineModel.cc + Vector<char*> *list_mach_models (); // scan . and system lib directory for models + char *load_mach_model (char *); + + char * + get_mach_model () + { + return dbe_strdup (mach_model_loaded); + }; + Vector<SourceFile *> *get_sources (); + +private: + void init (); + void check_tab_avail (); + bool add_path (char *path, Vector<char*> *pathes); + Experiment *createExperiment (); + + // Divide the regular createExperiment into two parts - + // Part1 creates just the Experiment data structure + // Part2 updates related fields and vectors + Experiment *createExperimentPart1 (); + void createExperimentPart2 (Experiment *exp); + + Histable *findIndexObject (int idxtype, uint64_t idx); + void append_mesgs (StringBuilder *sb, char *path, Experiment *exp); + static void insert_metric (BaseMetric *mtr, Vector<BaseMetric*> *mlist); + void update_metric_tree (BaseMetric *m); + + char *find_mach_model (char *); // fine machine model file by name + Vector<Experiment*> *exps; // Master list of experiments + Vector<Histable*> *objs; // Master list of Functions,Modules,Segments + Vector<DataObject*> *dobjs; // Master list of DataObjects + Vector<LoadObject*> *lobjs; // Auxiliary list of LoadObjects + Vector<Hwcentry*> *hwcentries; + Vector<HashMap<uint64_t, Histable*>*> *idxobjs; // Master list of IndexObjects + HashMap<char*, SourceFile*> *sourcesMap; // list of Source which were not archived + Vector<SourceFile*> *sources; // list of SourceFiles + Map<const char*, DbeJarFile*>*dbeJarFiles; + Vector<Countable*> *metrics; + Vector<BaseMetric*> *reg_metrics; // Master list of BaseMetrics + BaseMetricTreeNode* reg_metrics_tree; // Hierarchy of BaseMetrics + Vector<char*> *search_path; + Vector<char*> *classpath; + Vector<DbeFile*> *classpath_df; + Map<const char*, DbeFile*>*dbeFiles; + Vector<DbeView*> *views; // Master list of DbeViews + bool interactive; // interactive mode + bool lib_visibility_used; + LoadObject *lo_total; // Total LoadObject + Function *f_total; // Total function + LoadObject *lo_unknown; // Unknown LoadObject + Function *f_unknown; // Unknown function + SourceFile *sf_unknown; // Unknown source file + Function *f_jvm; // pseudo-function <JVM-System> + Vector<Function*> *f_special; // pseudo-functions + Function *j_unknown; // pseudo-function <no Java callstack> + LoadObject *lo_omp; // OMP LoadObject (libmtsk) + Vector<Function*> *omp_functions; // OMP-overhead, etc. + DataObject *d_unknown; // Unknown dataobject + DataObject *d_scalars; // Scalars dataobject + DataObject *d_total; // Total dataobject + List **dnameHTable; // DataObject name hash table + Settings *settings; // setting/defaults structure + Vector<IndexObjType_t*> *dyn_indxobj; // Index Object definitions + int dyn_indxobj_indx; + int dyn_indxobj_indx_fixed; + + void propNames_name_store (int propId, const char *propName); + void propNames_name_store (int propId, const char *propName, + const char *propUName, VType_type vType, int flags); + char* propNames_name_fetch (int propId); + Vector<PropDescr*> *propNames; + char *defExpName; + int user_exp_id_counter; + char *mach_model_loaded; + char *tmp_dir_name; +}; + +// For now, there's only one, so keep its pointer +extern DbeSession *dbeSession; + +extern Vector<char *> *split_str (char *str, char delimiter); +#endif /* _DBESESSION_H */ |