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 #ifndef _TABLE_H
22 #define _TABLE_H
23 
24 #include "vec.h"
25 #include "Map2D.h"
26 
27 #include "dbe_structs.h"
28 
29 class FilterExp;
30 struct PropDescr;
31 struct FieldDescr;
32 class PacketDescriptor;
33 class DataDescriptor;
34 class DataView;
35 
36 // Note: order must match VTYPE_TYPE_NAMES, below
37 
38 enum VType_type
39 {
40   TYPE_NONE,
41   TYPE_INT32,
42   TYPE_UINT32,
43   TYPE_INT64,
44   TYPE_UINT64,
45   TYPE_STRING,
46   TYPE_DOUBLE,
47   TYPE_OBJ,
48   TYPE_DATE, // Used in FieldDescr only, mapped to TYPE_UINT64 in PropDescr
49   TYPE_BOOL, // Used only to describe filter props
50   TYPE_ENUM, // Used only to describe filter props
51 
52   TYPE_LAST
53 };
54 
55 #define VTYPE_TYPE_NAMES \
56 { \
57     NTXT("NONE"), \
58     NTXT("INT32"), \
59     NTXT("UINT32"), \
60     NTXT("INT64"), \
61     NTXT("UINT64"), \
62     NTXT("STRING"), \
63     NTXT("DOUBLE"), \
64     NTXT("OBJECT"), \
65     NTXT("DATE"), \
66     NTXT("BOOL"), \
67     NTXT("ENUM") \
68 }
69 
70 // Note: order must match PROFDATA_TYPE_NAMES and PROFDATA_TYPE_UNAMES, below
71 
72 enum ProfData_type
73 { // a.k.a "data_id" (not the same as Pckt_type "kind")
74   DATA_SAMPLE,      // Traditional collect "Samples"
75   DATA_GCEVENT,     // Java Garbage Collection events
76   DATA_HEAPSZ,      // heap size tracking based on heap tracing data
77   DATA_CLOCK,       // clock profiling data
78   DATA_HWC,         // hardware counter profiling data
79   DATA_SYNCH,       // synchronization tracing data
80   DATA_HEAP,        // heap tracing data
81   DATA_MPI,         // MPI tracing data
82   DATA_RACE,        // data race detection data
83   DATA_DLCK,        // deadlock detection data
84   DATA_OMP,         // OpenMP profiling data (fork events)
85   DATA_OMP2,        // OpenMP profiling data (enter thread events)
86   DATA_OMP3,        // OpenMP profiling data (enter task events)
87   DATA_OMP4,        // OpenMP profiling data (parreg descriptions)
88   DATA_OMP5,        // OpenMP profiling data (task descriptions)
89   DATA_IOTRACE,     // IO tracing data
90   DATA_LAST
91 };
92 
93 extern char *get_prof_data_type_name (int t);
94 extern char *
95 get_prof_data_type_uname (int t);
96 
97 enum Prop_type
98 {
99   PROP_NONE,
100   // commonly used properties (libcollector modules, er_print)
101   PROP_ATSTAMP,     // hrtime_t, Filter: system HRT timestamp;
102 		    // "Absolute TSTAMP"
103   PROP_ETSTAMP,     // hrtime_t, Filter: nanoseconds from subexperiment start;
104 		    // "subExperiment TSTAMP"
105   PROP_TSTAMP,      // hrtime_t, Packet: system HRT timestamp
106 		    // Filter: nanoseconds from founder start
107   PROP_THRID,       // mapped to uint32_t by readPacket
108   PROP_LWPID,       // mapped to uint32_t by readPacket
109   PROP_CPUID,       // mapped to uint32_t by readPacket
110   PROP_FRINFO,      // uint64_t	frinfo
111   PROP_EVT_TIME,    // hrtime_t Filter: Time delta
112   // If TSTAMP taken at end of event, EVT_TIME will be positive
113   // If TSTAMP taken at start of event, EVT_TIME will be negative
114   // Note: clock and hwc profile events set EVT_TIME=0
115   //    except Solaris Microstate events where NTICK>1:
116   //    These will use EVT_TIME=(NTICK-1)*<tick duration>
117 
118   // DATA_SAMPLE
119   PROP_SAMPLE,      // uint64_t sample number
120   PROP_SMPLOBJ,     // Sample*
121 
122   // DATA_GCEVENT
123   PROP_GCEVENT,     // uint64_t event id
124   PROP_GCEVENTOBJ,  // GCEvent*
125 
126   // DATA_CLOCK
127   PROP_MSTATE,      // unsigned	ProfilePacket::mstate
128   PROP_NTICK,       // unsigned	ProfilePacket::value
129   PROP_OMPSTATE,    // int ProfilePacket::ompstate
130   PROP_MPISTATE,    // int ProfilePacket::mpistate
131 
132   // DATA_SAMPLE     // see PrUsage class, see PROP_MSTATE - TBR?
133   PROP_UCPU,
134   PROP_SCPU,
135   PROP_TRAP,
136   PROP_TFLT,
137   PROP_DFLT,
138   PROP_KFLT,
139   PROP_ULCK,
140   PROP_TSLP,
141   PROP_WCPU,
142   PROP_TSTP,
143 
144   // DATA_SYNCH
145   PROP_SRQST,       // hrtime_t SyncPacket::requested
146   PROP_SOBJ,        // Vaddr SyncPacket::objp
147 
148   // DATA_HWC
149   PROP_HWCTAG,      // uint32_t HWCntrPacket::tag;
150   PROP_HWCINT,      // uint64_t HWCntrPacket::interval
151   PROP_VADDR,       // Vaddr HWCntrPacket::dbeVA->eaddr
152   PROP_PADDR,       // Vaddr HWCntrPacket::dbePA->eaddr
153   PROP_HWCDOBJ,     // DataObject* HWCntrPacket::dobj
154   PROP_VIRTPC,      // Vaddr HWCntrPacket::eventVPC
155   PROP_PHYSPC,      // Vaddr HWCntrPacket::eventPPC
156   PROP_EA_PAGESIZE, // uint32_t HWCntrPacket::ea_pagesize
157   PROP_PC_PAGESIZE, // uint32_t HWCntrPacket::pc_pagesize
158   PROP_EA_LGRP,     // uint32_t HWCntrPacket::ea_lgrp
159   PROP_PC_LGRP,     // uint32_t HWCntrPacket::pc_lgrp
160   PROP_LWP_LGRP_HOME, // uint32_t HWCntrPacket::lwp_lgrp_home
161   PROP_PS_LGRP_HOME,  // uint32_t HWCntrPacket::ps_lgrp_home
162   PROP_MEM_LAT,     // uint64_t HWCntrPacket::latency
163   PROP_MEM_SRC,     // uint64_t HWCntrPacket::data_source
164 
165   // DATA_HEAP
166   PROP_HTYPE,       // Heap_type HeapPacket::mtype
167   PROP_HSIZE,       // Size HeapPacket::size (bytes alloc'd by this event)
168   PROP_HVADDR,      // Vaddr HeapPacket::vaddr
169   PROP_HOVADDR,     // Vaddr HeapPacket::ovaddr
170   PROP_HLEAKED,     // Size HeapPacket::leaked (net bytes leaked)
171   PROP_HMEM_USAGE,  // Size heap memory usage
172   PROP_HFREED,      // Size (bytes freed by this event)
173   PROP_HCUR_ALLOCS, // int64_t (net allocations running total.  Recomputed after each filter)
174   PROP_HCUR_NET_ALLOC, // int64_t (net allocation for this packet.  Recomputed after each filter)
175   PROP_HCUR_LEAKS,  // Size (net leaks running total.  Recomputed after each filter)
176 
177   // DATA_IOTRACE
178   PROP_IOTYPE,      // IOTrace_type IOTracePacket::iotype
179   PROP_IOFD,        // int32_t IOTracePacket::fd
180   PROP_IONBYTE,     // Size_type IOTracePacket::nbyte
181   PROP_IORQST,      // hrtime_t IOTracePacket::requested
182   PROP_IOOFD,       // int32_t IOTracePacket::ofd
183   PROP_IOFSTYPE,    // FileSystem_type IOTracePacket::fstype
184   PROP_IOFNAME,     // char IOTracePacket::fname
185   PROP_IOVFD,       // int32_t virtual file descriptor
186 
187   // DATA_MPI
188   PROP_MPITYPE,     // MPI_type MPIPacket::mpitype
189   PROP_MPISCOUNT,   // Size MPIPacket::scount
190   PROP_MPISBYTES,   // Size MPIPacket::sbytes
191   PROP_MPIRCOUNT,   // Size MPIPacket::rcount
192   PROP_MPIRBYTES,   // Size MPIPacket::rbytes
193 
194   // DATA_OMP*
195   PROP_CPRID,       // uint64_t (Note: not same as "PROP_CPRID" below)
196   PROP_PPRID,       // uint64_t OMPPacket::omp_pprid
197   PROP_TSKID,       // uint64_t (Note: not same as "PROP_CPRID" below)
198   PROP_PTSKID,      // uint64_t OMPPacket::omp_ptskid
199   PROP_PRPC,        // uint64_t OMPPacket::omp_prpc
200 
201   // DATA_RACE
202   PROP_RTYPE,       // Race_type RacePacket::rtype
203   PROP_RID,         // uint32_t RacePacket::id
204   PROP_RVADDR,      // Vaddr RacePacket::vaddr
205   PROP_RCNT,        // uint32_t RacePacket::count
206   PROP_LEAFPC,      // Vaddr CommonPacket::leafpc
207 
208   // DATA_DLCK
209   PROP_DID,         // uint32_t DeadlockPacket::id
210   PROP_DTYPE,       // Deadlock_Lock_type DeadlockPacket::lock_type
211   PROP_DLTYPE,      // Deadlock_type DeadlockPacket::dl_type
212   PROP_DVADDR,      // Vaddr DeadlockPacket::lock_addr
213 
214   // Synthetic properties (queries only)
215   PROP_STACKID,
216   PROP_STACK,       // void* Generic; mapped to M, U, or XSTACK
217   PROP_MSTACK,      // void* machine stack
218   PROP_USTACK,      // void* user_stack
219   PROP_XSTACK,      // void* expert_stack
220   PROP_HSTACK,      // void* hide_stack
221   //PROP_CPRID,       // void* (Note: not same as "PROP_CPRID" above)
222   //PROP_TSKID,       // void* (Note: not same as "PROP_TSKID" above)
223   PROP_JTHREAD,     // JThread* CommonPacket::jthread
224   PROP_LEAF,        // uint64_t stack leaf function
225   PROP_DOBJ,        // "DOBJ" DataObject*
226   PROP_SAMPLE_MAP,  // Map events to SAMPLE using sample's time range
227   PROP_GCEVENT_MAP, // Map events to GCEVENT using gcevent's time range
228   PROP_PID,         // int unix getpid()
229   PROP_EXPID,       // int Experiment->getUserExpId(), AKA process number, >=1.
230   PROP_EXPID_CMP,   // int "Comparable PROP_EXPID".  In compare mode, if this
231   //              process has been matched to another groups' process,
232   //              returns PROP_EXPID of the matching process with the
233   //              lowest PROP_EXPGRID value.  Otherwise returns PROP_EXPID.
234   PROP_EXPGRID,     // int Comparison group number.  >=0, 0 is Baseline.
235   PROP_PARREG,      // "PARREG" uint64_t (see 6436500) TBR?
236   PROP_TSTAMP_LO,   // hrtime_t Filter: Event's low TSTAMP
237   PROP_TSTAMP_HI,   // hrtime_t Filter: Event's high TSTAMP
238   PROP_TSTAMP2,     // hrtime_t Filter: End TSTAMP (TSTAMP<=TSTAMP2)
239   PROP_FREQ_MHZ,    // int frequency in MHZ (for converting HWC profiling cycles to time)
240   PROP_NTICK_USEC,  // hrtime_t Clock profiling interval, microseconds (PROP_NTICK * Experiment->ptimer_usec)
241   PROP_IOHEAPBYTES, // Size PROP_HSIZE or PROP_IONBYTE
242   PROP_STACKL,      // void* Generic; mapped to M, U, or XSTACK for DbeLine
243   PROP_MSTACKL,     // void* machine stack
244   PROP_USTACKL,     // void* user_stack
245   PROP_XSTACKL,     // void* expert_stack
246   PROP_STACKI,      // void* Generic; mapped to M, U, or XSTACK for DbeInstr
247   PROP_MSTACKI,     // void* machine stack
248   PROP_USTACKI,     // void* user_stack
249   PROP_XSTACKI,     // void* expert_stack
250   PROP_DDSCR_LNK,   // long long index into DataDescriptor table for a related event
251   PROP_VOIDP_OBJ,   // void* pointer to object containing metadata
252   PROP_LAST
253 };
254 
255 enum Prop_flag
256 {
257   PRFLAG_NOSHOW     = 0x40
258 };
259 
260 struct PropDescr
261 {
262   PropDescr (int propID, const char *name);
263   virtual ~PropDescr ();
264 
265   void addState (int value, const char *stname, const char *stuname);
266   char *getStateName (int value);
267   char *getStateUName (int value);
268 
269   int
getMaxStatePropDescr270   getMaxState ()
271   {
272     return stateNames ? stateNames->size () : 0;
273   }
274 
275   int propID;
276   char *name;
277   char *uname;
278   VType_type vtype;
279   int flags;
280 
281 private:
282   Vector<char*>*stateNames;
283   Vector<char*>*stateUNames;
284 };
285 
286 struct FieldDescr
287 {
288   FieldDescr (int propID, const char *name);
289   virtual ~FieldDescr ();
290 
291   int propID;
292   char *name;
293   int offset;
294   VType_type vtype;
295   char *format;
296 };
297 
298 class PacketDescriptor
299 {
300 public:
301   PacketDescriptor (DataDescriptor*);
302   virtual ~PacketDescriptor ();
303 
304   DataDescriptor *
getDataDescriptor()305   getDataDescriptor ()
306   {
307     return ddscr;
308   }
309 
310   Vector<FieldDescr*> *
getFields()311   getFields ()
312   {
313     return fields;
314   }
315 
316   void addField (FieldDescr*);
317 
318 private:
319   DataDescriptor *ddscr;
320   Vector<FieldDescr*> *fields;
321 };
322 
323 struct Datum
324 {
325 
326   void
setUINT32Datum327   setUINT32 (uint32_t vv)
328   {
329     type = TYPE_UINT32;
330     i = vv;
331   }
332 
333   void
setUINT64Datum334   setUINT64 (uint64_t vv)
335   {
336     type = TYPE_UINT64;
337     ll = vv;
338   }
339 
340   void
setSTRINGDatum341   setSTRING (char* vv)
342   {
343     type = TYPE_STRING;
344     l = vv;
345   }
346 
347   void
setDOUBLEDatum348   setDOUBLE (double vv)
349   {
350     type = TYPE_DOUBLE;
351     d = vv;
352   }
353 
354   void
setOBJDatum355   setOBJ (void* vv)
356   {
357     type = TYPE_OBJ;
358     p = vv;
359   }
360 
361   VType_type type;
362   union
363   {
364     int i;
365     double d;
366     char *l;
367     void *p;
368     unsigned long long ll;
369   };
370 };
371 
372 class Data
373 {
374 public:
375   static Data *newData (VType_type);
376 
377   virtual
~Data()378   ~Data () { }
379 
380   virtual VType_type
type()381   type ()
382   {
383     return TYPE_NONE;
384   }
385   virtual void reset () = 0;
386   virtual long getSize () = 0;
387   virtual int fetchInt (long i) = 0;
388   virtual unsigned long long fetchULong (long i) = 0;
389   virtual long long fetchLong (long i) = 0;
390   virtual char *fetchString (long i) = 0;
391   virtual double fetchDouble (long i) = 0;
392   virtual void *fetchObject (long i) = 0;
393   virtual void setDatumValue (long, const Datum*) = 0;
394   virtual void setValue (long, uint64_t) = 0;
395   virtual void setObjValue (long, void*) = 0;
396   virtual int cmpValues (long idx1, long idx2) = 0;
397   virtual int cmpDatumValue (long idx, const Datum *val) = 0;
398 };
399 
400 enum Data_flag
401 {
402   DDFLAG_NOSHOW = 0x01
403 };
404 
405 class DataDescriptor
406 {
407   /*
408    * An instance of this class stores the data packets for a specific
409    * type of profiling, for example, clock profiling.
410    *
411    * Each packet consists of values for various properties.
412    * For example, a timestamp is a property which is accessed with PROP_TSTAMP.
413    *
414    * Ideally, DataDescriptor contents are considered immutable after the
415    * data is read in.  setValue() should only be used during creation.
416    * - The packets are in fixed order.  This allows DataDescriptor <pkt_id>
417    *   to be treated as a stable handle.
418    * - Sorting/filtering is handled by the DataView class
419    * - In the future, if we need to add the ability to append new packets,
420    *   we might add a flag to show when the class is immutable and/or appendible
421    */
422 public:
423 
424   DataDescriptor (int id, const char* name, const char* uname, int flags = 0); // master
425   DataDescriptor (int id, const char* name, const char* uname, DataDescriptor*); // reference copy
426   ~DataDescriptor ();
427 
428   // packets' descriptions
429   int
getId()430   getId ()
431   {
432     return id;
433   }
434 
435   char *
getName()436   getName ()
437   {
438     return name;
439   }
440 
441   char *
getUName()442   getUName ()
443   {
444     return uname;
445   }
446 
447   Vector<PropDescr*> *
getProps()448   getProps ()
449   {
450     return props;       // packet properties
451   }
452   PropDescr *getProp (int prop_id);     // packet property
453 
454   long
getSize()455   getSize ()
456   {
457     return *ref_size;   // number of packets
458   }
459 
460   long
getFlags()461   getFlags ()
462   {
463     return flags;
464   }
465 
466   // class to provide sorting and filtering
467   DataView *createView ();
468   DataView *createImmutableView ();
469   DataView *createExtManagedView ();
470 
471   // packet property values (<pkt_id> is stable packet handle)
472   int getIntValue (int prop_id, long pkt_id);
473   unsigned long long getULongValue (int prop_id, long pkt_id);
474   long long getLongValue (int prop_id, long pkt_id);
475   void *getObjValue (int prop_id, long pkt_id);
476   Vector<long long> *getSet (int prop_id); // list of sorted, unique values
477 
478   // table creation/reset
479   void addProperty (PropDescr*); // add property to all packets
480   long addRecord ();            // add packet
481   Data *getData (int prop_id);  // get all packets
482   void setDatumValue (int prop_id, long pkt_id, const Datum *val);
483   void setValue (int prop_id, long pkt_id, uint64_t val);
484   void setObjValue (int prop_id, long pkt_id, void *val);
485   void reset ();                // remove all packets (ym: TBR?)
486 
487   void
setResolveFrInfoDone()488   setResolveFrInfoDone ()
489   {
490     *ref_resolveFrameInfoDone = true;
491   }
492 
493   bool
isResolveFrInfoDone()494   isResolveFrInfoDone ()
495   {
496     return *ref_resolveFrameInfoDone;
497   }
498 
499 
500 private:
501   bool isMaster;
502   int flags;        // see Data_flag enum
503   int id;
504   char *name;
505   char *uname;
506 
507   // the following should only be accessed if parent==NULL
508   long master_size;
509   bool master_resolveFrameInfoDone;
510 
511   // the following point to the master DataDescriptor's fields
512   long *ref_size;
513   bool *ref_resolveFrameInfoDone;
514   Vector<PropDescr*> *props;
515   Vector<Data*> *data;
516   Vector<Vector<long long>*> *setsTBR; // Sets of unique values
517 };
518 
519 typedef struct
520 {
521   long begin;
522   long end;
523   long orig_ddsize;
524   DataView *tmpView;
525   long *idxArr;
526   FilterExp *fltr;
527 } fltr_dbe_ctx;
528 
529 class DataView
530 {
531   /*
532    * Provides sorting and filtering of DataDescriptor packets
533    */
534 public:
535 
536   enum Relation
537   {
538     REL_LT,
539     REL_LTEQ,
540     REL_EQ,
541     REL_GTEQ,
542     REL_GT
543   };
544 
545   enum DataViewType
546   {
547     DV_NORMAL,      // filterable, sortable
548     DV_IMMUTABLE,   // reflects exact data in DataDescriptor
549     DV_EXT_MANAGED  // sortable.  index[] entries managed externally.
550   };
551 
552   DataView (DataDescriptor*);
553   DataView (DataDescriptor*, DataViewType);
554   virtual ~DataView ();
555 
556   Vector<PropDescr*> *getProps ();
557   PropDescr *getProp (int prop_id);
558   long getSize ();      // number of post-filter packets
559 
560   // packet property values accessed by sort index (not DataDescriptor pkt_id)
561   int getIntValue (int prop_id, long idx);
562   unsigned long long getULongValue (int prop_id, long idx);
563   long long getLongValue (int prop_id, long idx);
564   void *getObjValue (int prop_id, long idx);
565   long getIdByIdx (long idx);   // returns DataDescriptor pkt_id
566 
567   // define sort/filter
568   void sort (const int props[], int prop_count);
569   void sort (int prop);
570   void sort (int prop1, int prop2);
571   void sort (int prop1, int prop2, int prop3);
572   void setFilter (FilterExp*);
573 
574   // search packets
575   // - sort must already be defined
576   // - requires the user to provide all properties used in current sort.
577   // - For a match, the all but the last sort property (the "leaf")
578   //   must match exactly.
579   long getIdxByVals (const Datum valColumns[], Relation rel);
580   long getIdxByVals (const Datum valColumns[], Relation rel,
581 		     long minIdx, long maxIdx); //limit idx search range
582   bool idxRootDimensionsMatch (long idx, const Datum valColumns[]);
583   // packet at idx matches all non-leaf values in valColumns
584 
585   // use during table creation, updates underlying DataDescriptor
586   void setDatumValue (int prop_id, long idx, const Datum *val);
587   void setValue (int prop_id, long idx, uint64_t val);
588   void setObjValue (int prop_id, long idx, void *val);
589 
590   DataDescriptor *
getDataDescriptor()591   getDataDescriptor ()
592   {
593     return ddscr;
594   }
595 
596   void removeDbeViewIdx (long idx);
597 
598   // for use with DV_EXT_MANAGED DataViews:
599   void appendDataDescriptorId (long pkt_id);
600   void setDataDescriptorValue (int prop_id, long pkt_id, uint64_t val);
601   long long getDataDescriptorValue (int prop_id, long pkt_id);
602 
603 private:
604   bool checkUpdate ();
605   void init (DataDescriptor*, DataViewType);
606 
607   static void filter_in_chunks (fltr_dbe_ctx *dctx);
608   DataDescriptor *ddscr;
609   long ddsize;
610   Vector<long> *index; // sorted vector of data_id (index into dDscr)
611 #define MAX_SORT_DIMENSIONS 10
612 #define DATA_SORT_EOL ((Data *) -1)     /* marks end of sortedBy[] array */
613   Data *sortedBy[MAX_SORT_DIMENSIONS + 1]; // columns for sort
614   FilterExp *filter;
615   DataViewType type;
616 };
617 
618 #endif /* _TABLE_H */
619