1 /* Copyright (C) 2021 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 /* The DbeSession class is instantiated by a DbeApplication, and contains
22  *	all the data referring to a set of loaded experiments
23  *
24  *	It manages a set of tables for the Experiments, for the LoadObjects
25  *	referenced in them, and for the other objects representing the
26  *	elements in the program hierarchy that can have metrics associated
27  *	with them.  It also has a master list of all the metrics available
28  *	from all the loaded experiments.
29  *
30  *	It gets an instance of the Settings class, instantiated as a copy
31  *	of the one in the DbeApplication that instantiated the DbeSession.
32  *
33  *	In addition, it manages a vector of DbeView's (q.v.); each DbeView
34  *	represents a window into the DbeSession, and has its own set of
35  *	Settings, and FilterSets for the Experiments, and is the access point
36  *	for all processed data.
37  */
38 
39 #ifndef _DBESESSION_H
40 #define _DBESESSION_H
41 
42 
43 #include <stdio.h>
44 #include "dbe_structs.h"
45 #include "vec.h"
46 #include "Hist_data.h"
47 #include "Histable.h"
48 #include "BaseMetric.h"
49 #include "BaseMetricTreeNode.h"
50 #include "MemorySpace.h"
51 #include "hwcentry.h"
52 #include "dbe_types.h"
53 #include "Settings.h"
54 #include "HashMap.h"
55 #include "Table.h"
56 #include "Experiment.h"
57 
58 class DbeSession;
59 class Experiment;
60 class Expression;
61 class ExpGroup;
62 class Function;
63 class JMethod;
64 class Histable;
65 class DbeView;
66 class Module;
67 class LoadObject;
68 class DataObject;
69 class SourceFile;
70 class Settings;
71 class StringBuilder;
72 class UserLabel;
73 class DbeFile;
74 class DbeJarFile;
75 class FileData;
76 class HeapData;
77 template <typename ITEM> class DbeSyncMap;
78 template <class ITEM> class Vector;
79 
80 struct DispTab;
81 struct List;
82 struct Countable;
83 class IndexObjType_t;
84 
85 typedef struct
86 {
87   char *path;
88   Experiment *exp;
89   DbeSession *ds;
90   bool read_ahead;
91 } exp_ctx;
92 
93 class DbeSession
94 {
95 public:
96   DbeSession (Settings *_settings, bool _ipc_mode, bool _rdt_mode);
97   ~DbeSession ();
98 
99   void reset ();
100   void reset_data ();
101 
102   void
set_interactive(bool _interactive)103   set_interactive (bool _interactive)
104   {
105     interactive = _interactive;
106   }
107 
108   bool
is_interactive()109   is_interactive ()
110   {
111     return interactive;
112   }
113 
114   bool is_datamode_available ();
115   bool is_leaklist_available ();
116   bool is_heapdata_available ();
117   bool is_iodata_available ();
118   bool is_racelist_available ();
119   bool is_deadlocklist_available ();
120   bool is_timeline_available ();
121   bool is_ifreq_available ();
122   bool is_omp_available ();
123   bool has_java ();
124   bool has_ompavail ();
125 
126   // XXX  get_clock should be removed, to support cpus with different clocks
127   // XXX    means reworking time-convertible HWC code
128   int get_clock (int id);
129 
130   // Access functions for DbeView's
131   int createView ();
132   int createView (int index, int cloneindex);
133   DbeView *getView (int index);
134   void dropView (int index);
135 
136   // Access functions controlling the experiment list
137   Vector<char*> *get_group_or_expt (char *path); // load an experiment or group
138 
139   void open_experiment (Experiment *exp, char *path);
140   Experiment *get_exp (int exp_ind);
141   Vector<Vector<char*>*> *getExperimensGroups ();
142   char *setExperimentsGroups (Vector<Vector<char*>*> *groups);
143   char *drop_experiment (int exp_ind);
144   int find_experiment (char *path);
145 
146   int
nexps()147   nexps ()
148   {
149     return exps->size ();
150   }
151   int ngoodexps ();
152 
153   // Access functions controlling the DataObject list
154   DataObject *createDataObject ();
155   DataObject *createDataObject (DataObject *d, DataObject *p = NULL);
156   DataObject *createMasterDataObject (DataObject *);
157   Vector<DataObject*> *get_dobj_elements (DataObject *);
158 
159   DataObject *
get_Total_DataObject()160   get_Total_DataObject ()
161   {
162     return d_total;
163   };
164 
165   DataObject *
get_Unknown_DataObject()166   get_Unknown_DataObject ()
167   {
168     return d_unknown;
169   };
170 
171   DataObject *
get_Scalars_DataObject()172   get_Scalars_DataObject ()
173   {
174     return d_scalars;
175   };
176 
177   DataObject *find_dobj_by_name (char *dobj_name);
178   DataObject *find_dobj_match (DataObject *dobj);
179   DataObject *find_dobj_master (DataObject *dobj);
180 
181   int
ndobjs()182   ndobjs ()
183   {
184     return dobjs->size ();
185   }
186 
187   // check if no -xhwcprof should be ignored
188   bool
check_ignore_no_xhwcprof()189   check_ignore_no_xhwcprof ()
190   {
191     return settings->get_ignore_no_xhwcprof ();
192   };
193 
194   // check if FS warning should be comment, or real warning
195   bool
check_ignore_fs_warn()196   check_ignore_fs_warn ()
197   {
198     return settings->get_ignore_fs_warn ();
199   };
200 
201   // Access functions controlling the LoadObject list
202   DbeSyncMap<LoadObject> *loadObjMap;
203   void append (LoadObject *lobj);
204   LoadObject *createLoadObject (const char *nm, int64_t cksum = 0);
205   LoadObject *createLoadObject (const char *nm, const char *runTimePath, DbeFile *df);
206 
207   Vector<LoadObject *> *
get_LoadObjects()208   get_LoadObjects ()
209   {
210     return lobjs;
211   };
212 
213   void dobj_updateHT (DataObject *dobj);
214   LoadObject *get_Total_LoadObject ();
215   Vector<LoadObject*> *get_text_segments ();
216   LoadObject *get_Unknown_LoadObject ();
217   LoadObject *find_lobj_by_name (const char *lobj_name, int64_t cksum = 0);
218 
219   // Access functions controlling the Tab list
220   Vector<DispTab*> *
get_TabList()221   get_TabList ()
222   {
223     return settings->get_TabList ();
224   };
225 
226   Vector<bool> *
get_MemTabList()227   get_MemTabList ()
228   {
229     return settings->get_MemTabState ();
230   };
231 
232   void mobj_define (MemObjType_t *);
233 
234   // Access functions controlling metrics
235   BaseMetric *find_base_reg_metric (char *mcmd);
236   Vector<BaseMetric*> *get_base_reg_metrics (); // excludes comparison (expr) variants
237 
238   Vector<BaseMetric*> *
get_all_reg_metrics()239   get_all_reg_metrics ()
240   {
241     return reg_metrics;     // includes comparison (expr) variants
242   };
243 
244   BaseMetricTreeNode *get_reg_metrics_tree ();
245   BaseMetric *register_metric_expr (BaseMetric::Type type, char *aux, char *expr_spec);
246   BaseMetric *register_metric (BaseMetric::Type type);
247   BaseMetric *register_metric (char *name, char *username, char *_def);
248   BaseMetric *register_metric (Hwcentry *ctr, const char* cmdname, const char* username);
249   void drop_metric (BaseMetric *);
250   Module *createModule (LoadObject *lo, const char *nm);
251   Module *createUnknownModule (LoadObject *lo);
252   Module *createClassFile (char *className);
253   DbeFile *getDbeFile (char *filename, int filetype);
254   SourceFile *get_Unknown_Source ();
255   SourceFile *createSourceFile (const char *path);
256   Histable *createHistObject (Histable::Type);
257   Function *createFunction ();
258   Function *create_hide_function (LoadObject *lo);
259   Function *get_Total_Function ();
260   Function *get_Unknown_Function ();
261   Function *get_JUnknown_Function ();
262   Function *get_jvm_Function ();
263   LoadObject *get_OMP_LoadObject ();
264   Function *get_OMP_Function (int);
265   JMethod *createJMethod ();
266   Histable *createIndexObject (int idxtype, int64_t idx);
267   Histable *createIndexObject (int idxtype, Histable *hobj);
268 
269   enum SpecialFunction
270   {
271     TruncatedStackFunc,
272     FailedUnwindFunc,
273     LastSpecialFunction
274   };
275   Function *getSpecialFunction (SpecialFunction);
276 
277   Histable *
findObjectById(uint64_t _id)278   findObjectById (uint64_t _id)
279   {
280     long id = (long) _id;
281     return (id >= 0 && id < objs->size ()) ? objs->fetch (id) : NULL;
282   }
283 
284   Histable *findObjectById (Histable::Type type, int subtype, uint64_t id);
285 
286   // Other access functions
287   bool find_obj (FILE *dis_file, FILE *inp_file, Histable *&obj, char *name,
288 		 const char *sel, Histable::Type type, bool xdefault);
289   int ask_which (FILE *dis_file, FILE *inp_file, Vector<Histable*> *list, char *name);
290   LoadObject *map_NametoLoadObject (char *name, Vector<Histable*> *, int which);
291   Module *map_NametoModule (char *name, Vector<Histable*> *, int which);
292   Function *map_NametoFunction (char *, Vector<Histable*> *, const char *);
293   DataObject *map_NametoDataObject (char *name, Vector<Histable*> *, int which);
294   bool match_FName (char *name, Function *func);
295 
296   // Functions to convert a string to all matching Functions/DataObjects
297   Vector<Function *> *match_func_names (const char *ustr, Histable::NameFormat nfmt);
298   Vector<DataObject *> *match_dobj_names (char *);
299 
300   // Functions to convert a string to all matching JThreads
301   Vector<JThread*> *match_java_threads (char *ustr, int matchParent,
302 					Vector<uint64_t> * &grids,
303 					Vector<uint64_t> * &expids);
304   // Function to convert a string to all matching File names
305   Vector<FileData *> *match_file_names (char *ustr, Histable::NameFormat nfmt);
306 
307   // Access functions concerning the search path
308   Vector<char*> *
get_search_path()309   get_search_path ()
310   {
311     return search_path;
312   }
313 
314   Vector<DbeFile*>*get_classpath ();
315   void set_search_path (Vector<char*> *path, bool reset);
316   void set_search_path (char *lpath, bool reset);
317   bool add_classpath (char *path);
318   bool add_path (char *path);
319   void set_pathmaps (Vector<pathmap_t*> *newPathMap);
320   Vector<pathmap_t*> *get_pathmaps ();
321 
322   // functions to aid debugging
323   void dump_stacks (FILE *);
324   void dump_dataobjects (FILE *);
325   void dump_segments (FILE *);
326   void dump_map (FILE *);
327 
328   // Find dynamic property by name
329   int registerPropertyName (const char *name);
330   int getPropIdByName (const char *name);
331   char* getPropName (int propId);
332   char* getPropUName (int propId);
333 
334   Vector<UserLabel*> *userLabels; // List of er_labels
335   UserLabel *findUserLabel (const char *name);
336   DbeJarFile *get_JarFile (const char *name);
337   void append (UserLabel *lbl);
338   void append (SourceFile *sf);
339   void append (Experiment *exp);
340   void append (Hwcentry *exp);
341   void set_need_refind ();
342 
343   // Find user defined object by name
344   Expression *findObjDefByName (const char *);
345   void get_filter_keywords (Vector<void*> *res);
346 
347   // Get the Settings class object
348   Settings *
get_settings()349   get_settings ()
350   {
351     return settings;
352   }
353 
354   // static members, used to define or fetch the various IndexSpaces
355   Vector<void*> *getIndxObjDescriptions (void);
356   Vector<void*> *getCustomIndxObjects (void);
357   char *indxobj_define (const char *, char *, const char *, char *, char *);
358   char *getIndexSpaceName (int index);
359   char *getIndexSpaceDescr (int index);
360   Expression *getIndexSpaceExpr (int index);
361   char *getIndexSpaceExprStr (int index);
362   int findIndexSpaceByName (const char *mname);
363   void removeIndexSpaceByName (const char *mname);
364   IndexObjType_t *getIndexSpace (int index);
365   IndexObjType_t *findIndexSpace (const char *mname);
366   Expression *ql_parse (const char *expr_spec);
367   BaseMetric *find_metric (BaseMetric::Type type, const char *cmd, const char *expr_spec = NULL);
368   static void dump (char *msg, Vector<Metric*> *mlist);
369   static void dump (char *msg, Vector<BaseMetric*> *mlist);
370   static Platform_t platform;               // Sparc, Intel
371   Vector<ExpGroup *> *expGroups;
372   HashMap<char*, LoadObject *> *comp_lobjs; // list of comparable LoadObjects
373   HashMap<char*, DbeLine *> *comp_dbelines; // list of comparable DbeLines
374   HashMap<char*, SourceFile*>*comp_sources; // list of comparable SourceFiles
375   char *localized_SP_UNKNOWN_NAME;
376 
377   void
set_lib_visibility_used()378   set_lib_visibility_used ()
379   {
380     lib_visibility_used = true;
381   }
382 
383   bool
is_lib_visibility_used()384   is_lib_visibility_used ()
385   {
386     return lib_visibility_used;
387   }
388 
389   void unlink_tmp_files ();
390   char *get_tmp_file_name (const char *nm, bool for_java);
391 
392   Vector<char *> *tmp_files;
393   int status_ompavail;
394   int archive_mode;
395   bool ipc_mode;
396   bool rdt_mode;
397 
398   // data and methods concerning the machine model
399   //    methods are in source file MachineModel.cc
400   Vector<char*> *list_mach_models (); // scan . and system lib directory for models
401   char *load_mach_model (char *);
402 
403   char *
get_mach_model()404   get_mach_model ()
405   {
406     return dbe_strdup (mach_model_loaded);
407   };
408   Vector<SourceFile *> *get_sources ();
409 
410 private:
411   void init ();
412   void check_tab_avail ();
413   bool add_path (char *path, Vector<char*> *pathes);
414   Experiment *createExperiment ();
415 
416   // Divide the regular createExperiment into two parts -
417   // Part1 creates just the Experiment data structure
418   // Part2 updates related fields and vectors
419   Experiment *createExperimentPart1 ();
420   void createExperimentPart2 (Experiment *exp);
421 
422   Histable *findIndexObject (int idxtype, uint64_t idx);
423   void append_mesgs (StringBuilder *sb, char *path, Experiment *exp);
424   static void insert_metric (BaseMetric *mtr, Vector<BaseMetric*> *mlist);
425   void update_metric_tree (BaseMetric *m);
426 
427   char *find_mach_model (char *);   // fine machine model file by name
428   Vector<Experiment*> *exps;        // Master list of experiments
429   Vector<Histable*> *objs;          // Master list of Functions,Modules,Segments
430   Vector<DataObject*> *dobjs;       // Master list of DataObjects
431   Vector<LoadObject*> *lobjs;       // Auxiliary list of LoadObjects
432   Vector<Hwcentry*> *hwcentries;
433   Vector<HashMap<uint64_t, Histable*>*> *idxobjs; // Master list of IndexObjects
434   HashMap<char*, SourceFile*> *sourcesMap;  // list of Source which were not archived
435   Vector<SourceFile*> *sources;         // list of SourceFiles
436   Map<const char*, DbeJarFile*>*dbeJarFiles;
437   Vector<Countable*> *metrics;
438   Vector<BaseMetric*> *reg_metrics;     // Master list of BaseMetrics
439   BaseMetricTreeNode* reg_metrics_tree; // Hierarchy of BaseMetrics
440   Vector<char*> *search_path;
441   Vector<char*> *classpath;
442   Vector<DbeFile*> *classpath_df;
443   Map<const char*, DbeFile*>*dbeFiles;
444   Vector<DbeView*> *views;              // Master list of DbeViews
445   bool interactive;                     // interactive mode
446   bool lib_visibility_used;
447   LoadObject *lo_total;                 // Total LoadObject
448   Function *f_total;                    // Total function
449   LoadObject *lo_unknown;               // Unknown LoadObject
450   Function *f_unknown;                  // Unknown function
451   SourceFile *sf_unknown;               // Unknown source file
452   Function *f_jvm;                      // pseudo-function <JVM-System>
453   Vector<Function*> *f_special;         // pseudo-functions
454   Function *j_unknown;                  // pseudo-function <no Java callstack>
455   LoadObject *lo_omp;                   // OMP LoadObject (libmtsk)
456   Vector<Function*> *omp_functions;     // OMP-overhead, etc.
457   DataObject *d_unknown;                // Unknown dataobject
458   DataObject *d_scalars;                // Scalars dataobject
459   DataObject *d_total;                  // Total dataobject
460   List **dnameHTable;                   // DataObject name hash table
461   Settings *settings;                   // setting/defaults structure
462   Vector<IndexObjType_t*> *dyn_indxobj; // Index Object definitions
463   int dyn_indxobj_indx;
464   int dyn_indxobj_indx_fixed;
465 
466   void propNames_name_store (int propId, const char *propName);
467   void propNames_name_store (int propId, const char *propName,
468 			     const char *propUName, VType_type vType, int flags);
469   char* propNames_name_fetch (int propId);
470   Vector<PropDescr*> *propNames;
471   char *defExpName;
472   int user_exp_id_counter;
473   char *mach_model_loaded;
474   char *tmp_dir_name;
475 };
476 
477 // For now, there's only one, so keep its pointer
478 extern DbeSession *dbeSession;
479 
480 extern Vector<char *> *split_str (char *str, char delimiter);
481 #endif  /* _DBESESSION_H */
482