blob: e72034309c3e83afbb9640964705748c4e95b911 [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. */
#ifndef _TABLE_H
#define _TABLE_H
#include "vec.h"
#include "Map2D.h"
#include "dbe_structs.h"
class FilterExp;
struct PropDescr;
struct FieldDescr;
class PacketDescriptor;
class DataDescriptor;
class DataView;
// Note: order must match VTYPE_TYPE_NAMES, below
enum VType_type
{
TYPE_NONE,
TYPE_INT32,
TYPE_UINT32,
TYPE_INT64,
TYPE_UINT64,
TYPE_STRING,
TYPE_DOUBLE,
TYPE_OBJ,
TYPE_DATE, // Used in FieldDescr only, mapped to TYPE_UINT64 in PropDescr
TYPE_BOOL, // Used only to describe filter props
TYPE_ENUM, // Used only to describe filter props
TYPE_LAST
};
#define VTYPE_TYPE_NAMES \
{ \
NTXT("NONE"), \
NTXT("INT32"), \
NTXT("UINT32"), \
NTXT("INT64"), \
NTXT("UINT64"), \
NTXT("STRING"), \
NTXT("DOUBLE"), \
NTXT("OBJECT"), \
NTXT("DATE"), \
NTXT("BOOL"), \
NTXT("ENUM") \
}
// Note: order must match PROFDATA_TYPE_NAMES and PROFDATA_TYPE_UNAMES, below
enum ProfData_type
{ // a.k.a "data_id" (not the same as Pckt_type "kind")
DATA_SAMPLE, // Traditional collect "Samples"
DATA_GCEVENT, // Java Garbage Collection events
DATA_HEAPSZ, // heap size tracking based on heap tracing data
DATA_CLOCK, // clock profiling data
DATA_HWC, // hardware counter profiling data
DATA_SYNCH, // synchronization tracing data
DATA_HEAP, // heap tracing data
DATA_MPI, // MPI tracing data
DATA_RACE, // data race detection data
DATA_DLCK, // deadlock detection data
DATA_OMP, // OpenMP profiling data (fork events)
DATA_OMP2, // OpenMP profiling data (enter thread events)
DATA_OMP3, // OpenMP profiling data (enter task events)
DATA_OMP4, // OpenMP profiling data (parreg descriptions)
DATA_OMP5, // OpenMP profiling data (task descriptions)
DATA_IOTRACE, // IO tracing data
DATA_LAST
};
extern char *get_prof_data_type_name (int t);
extern char *
get_prof_data_type_uname (int t);
enum Prop_type
{
PROP_NONE,
// commonly used properties (libcollector modules, er_print)
PROP_ATSTAMP, // hrtime_t, Filter: system HRT timestamp;
// "Absolute TSTAMP"
PROP_ETSTAMP, // hrtime_t, Filter: nanoseconds from subexperiment start;
// "subExperiment TSTAMP"
PROP_TSTAMP, // hrtime_t, Packet: system HRT timestamp
// Filter: nanoseconds from founder start
PROP_THRID, // mapped to uint32_t by readPacket
PROP_LWPID, // mapped to uint32_t by readPacket
PROP_CPUID, // mapped to uint32_t by readPacket
PROP_FRINFO, // uint64_t frinfo
PROP_EVT_TIME, // hrtime_t Filter: Time delta
// If TSTAMP taken at end of event, EVT_TIME will be positive
// If TSTAMP taken at start of event, EVT_TIME will be negative
// Note: clock and hwc profile events set EVT_TIME=0
// except Solaris Microstate events where NTICK>1:
// These will use EVT_TIME=(NTICK-1)*<tick duration>
// DATA_SAMPLE
PROP_SAMPLE, // uint64_t sample number
PROP_SMPLOBJ, // Sample*
// DATA_GCEVENT
PROP_GCEVENT, // uint64_t event id
PROP_GCEVENTOBJ, // GCEvent*
// DATA_CLOCK
PROP_MSTATE, // unsigned ProfilePacket::mstate
PROP_NTICK, // unsigned ProfilePacket::value
PROP_OMPSTATE, // int ProfilePacket::ompstate
PROP_MPISTATE, // int ProfilePacket::mpistate
// DATA_SAMPLE // see PrUsage class, see PROP_MSTATE - TBR?
PROP_UCPU,
PROP_SCPU,
PROP_TRAP,
PROP_TFLT,
PROP_DFLT,
PROP_KFLT,
PROP_ULCK,
PROP_TSLP,
PROP_WCPU,
PROP_TSTP,
// DATA_SYNCH
PROP_SRQST, // hrtime_t SyncPacket::requested
PROP_SOBJ, // Vaddr SyncPacket::objp
// DATA_HWC
PROP_HWCTAG, // uint32_t HWCntrPacket::tag;
PROP_HWCINT, // uint64_t HWCntrPacket::interval
PROP_VADDR, // Vaddr HWCntrPacket::dbeVA->eaddr
PROP_PADDR, // Vaddr HWCntrPacket::dbePA->eaddr
PROP_HWCDOBJ, // DataObject* HWCntrPacket::dobj
PROP_VIRTPC, // Vaddr HWCntrPacket::eventVPC
PROP_PHYSPC, // Vaddr HWCntrPacket::eventPPC
PROP_EA_PAGESIZE, // uint32_t HWCntrPacket::ea_pagesize
PROP_PC_PAGESIZE, // uint32_t HWCntrPacket::pc_pagesize
PROP_EA_LGRP, // uint32_t HWCntrPacket::ea_lgrp
PROP_PC_LGRP, // uint32_t HWCntrPacket::pc_lgrp
PROP_LWP_LGRP_HOME, // uint32_t HWCntrPacket::lwp_lgrp_home
PROP_PS_LGRP_HOME, // uint32_t HWCntrPacket::ps_lgrp_home
PROP_MEM_LAT, // uint64_t HWCntrPacket::latency
PROP_MEM_SRC, // uint64_t HWCntrPacket::data_source
// DATA_HEAP
PROP_HTYPE, // Heap_type HeapPacket::mtype
PROP_HSIZE, // Size HeapPacket::size (bytes alloc'd by this event)
PROP_HVADDR, // Vaddr HeapPacket::vaddr
PROP_HOVADDR, // Vaddr HeapPacket::ovaddr
PROP_HLEAKED, // Size HeapPacket::leaked (net bytes leaked)
PROP_HMEM_USAGE, // Size heap memory usage
PROP_HFREED, // Size (bytes freed by this event)
PROP_HCUR_ALLOCS, // int64_t (net allocations running total. Recomputed after each filter)
PROP_HCUR_NET_ALLOC, // int64_t (net allocation for this packet. Recomputed after each filter)
PROP_HCUR_LEAKS, // Size (net leaks running total. Recomputed after each filter)
// DATA_IOTRACE
PROP_IOTYPE, // IOTrace_type IOTracePacket::iotype
PROP_IOFD, // int32_t IOTracePacket::fd
PROP_IONBYTE, // Size_type IOTracePacket::nbyte
PROP_IORQST, // hrtime_t IOTracePacket::requested
PROP_IOOFD, // int32_t IOTracePacket::ofd
PROP_IOFSTYPE, // FileSystem_type IOTracePacket::fstype
PROP_IOFNAME, // char IOTracePacket::fname
PROP_IOVFD, // int32_t virtual file descriptor
// DATA_MPI
PROP_MPITYPE, // MPI_type MPIPacket::mpitype
PROP_MPISCOUNT, // Size MPIPacket::scount
PROP_MPISBYTES, // Size MPIPacket::sbytes
PROP_MPIRCOUNT, // Size MPIPacket::rcount
PROP_MPIRBYTES, // Size MPIPacket::rbytes
// DATA_OMP*
PROP_CPRID, // uint64_t (Note: not same as "PROP_CPRID" below)
PROP_PPRID, // uint64_t OMPPacket::omp_pprid
PROP_TSKID, // uint64_t (Note: not same as "PROP_CPRID" below)
PROP_PTSKID, // uint64_t OMPPacket::omp_ptskid
PROP_PRPC, // uint64_t OMPPacket::omp_prpc
// DATA_RACE
PROP_RTYPE, // Race_type RacePacket::rtype
PROP_RID, // uint32_t RacePacket::id
PROP_RVADDR, // Vaddr RacePacket::vaddr
PROP_RCNT, // uint32_t RacePacket::count
PROP_LEAFPC, // Vaddr CommonPacket::leafpc
// DATA_DLCK
PROP_DID, // uint32_t DeadlockPacket::id
PROP_DTYPE, // Deadlock_Lock_type DeadlockPacket::lock_type
PROP_DLTYPE, // Deadlock_type DeadlockPacket::dl_type
PROP_DVADDR, // Vaddr DeadlockPacket::lock_addr
// Synthetic properties (queries only)
PROP_STACKID,
PROP_STACK, // void* Generic; mapped to M, U, or XSTACK
PROP_MSTACK, // void* machine stack
PROP_USTACK, // void* user_stack
PROP_XSTACK, // void* expert_stack
PROP_HSTACK, // void* hide_stack
//PROP_CPRID, // void* (Note: not same as "PROP_CPRID" above)
//PROP_TSKID, // void* (Note: not same as "PROP_TSKID" above)
PROP_JTHREAD, // JThread* CommonPacket::jthread
PROP_LEAF, // uint64_t stack leaf function
PROP_DOBJ, // "DOBJ" DataObject*
PROP_SAMPLE_MAP, // Map events to SAMPLE using sample's time range
PROP_GCEVENT_MAP, // Map events to GCEVENT using gcevent's time range
PROP_PID, // int unix getpid()
PROP_EXPID, // int Experiment->getUserExpId(), AKA process number, >=1.
PROP_EXPID_CMP, // int "Comparable PROP_EXPID". In compare mode, if this
// process has been matched to another groups' process,
// returns PROP_EXPID of the matching process with the
// lowest PROP_EXPGRID value. Otherwise returns PROP_EXPID.
PROP_EXPGRID, // int Comparison group number. >=0, 0 is Baseline.
PROP_PARREG, // "PARREG" uint64_t (see 6436500) TBR?
PROP_TSTAMP_LO, // hrtime_t Filter: Event's low TSTAMP
PROP_TSTAMP_HI, // hrtime_t Filter: Event's high TSTAMP
PROP_TSTAMP2, // hrtime_t Filter: End TSTAMP (TSTAMP<=TSTAMP2)
PROP_FREQ_MHZ, // int frequency in MHZ (for converting HWC profiling cycles to time)
PROP_NTICK_USEC, // hrtime_t Clock profiling interval, microseconds (PROP_NTICK * Experiment->ptimer_usec)
PROP_IOHEAPBYTES, // Size PROP_HSIZE or PROP_IONBYTE
PROP_STACKL, // void* Generic; mapped to M, U, or XSTACK for DbeLine
PROP_MSTACKL, // void* machine stack
PROP_USTACKL, // void* user_stack
PROP_XSTACKL, // void* expert_stack
PROP_STACKI, // void* Generic; mapped to M, U, or XSTACK for DbeInstr
PROP_MSTACKI, // void* machine stack
PROP_USTACKI, // void* user_stack
PROP_XSTACKI, // void* expert_stack
PROP_DDSCR_LNK, // long long index into DataDescriptor table for a related event
PROP_VOIDP_OBJ, // void* pointer to object containing metadata
PROP_LAST
};
enum Prop_flag
{
PRFLAG_NOSHOW = 0x40
};
struct PropDescr
{
PropDescr (int propID, const char *name);
virtual ~PropDescr ();
void addState (int value, const char *stname, const char *stuname);
char *getStateName (int value);
char *getStateUName (int value);
int
getMaxState ()
{
return stateNames ? stateNames->size () : 0;
}
int propID;
char *name;
char *uname;
VType_type vtype;
int flags;
private:
Vector<char*>*stateNames;
Vector<char*>*stateUNames;
};
struct FieldDescr
{
FieldDescr (int propID, const char *name);
virtual ~FieldDescr ();
int propID;
char *name;
int offset;
VType_type vtype;
char *format;
};
class PacketDescriptor
{
public:
PacketDescriptor (DataDescriptor*);
virtual ~PacketDescriptor ();
DataDescriptor *
getDataDescriptor ()
{
return ddscr;
}
Vector<FieldDescr*> *
getFields ()
{
return fields;
}
void addField (FieldDescr*);
private:
DataDescriptor *ddscr;
Vector<FieldDescr*> *fields;
};
struct Datum
{
void
setUINT32 (uint32_t vv)
{
type = TYPE_UINT32;
i = vv;
}
void
setUINT64 (uint64_t vv)
{
type = TYPE_UINT64;
ll = vv;
}
void
setSTRING (char* vv)
{
type = TYPE_STRING;
l = vv;
}
void
setDOUBLE (double vv)
{
type = TYPE_DOUBLE;
d = vv;
}
void
setOBJ (void* vv)
{
type = TYPE_OBJ;
p = vv;
}
VType_type type;
union
{
int i;
double d;
char *l;
void *p;
unsigned long long ll;
};
};
class Data
{
public:
static Data *newData (VType_type);
virtual
~Data () { }
virtual VType_type
type ()
{
return TYPE_NONE;
}
virtual void reset () = 0;
virtual long getSize () = 0;
virtual int fetchInt (long i) = 0;
virtual unsigned long long fetchULong (long i) = 0;
virtual long long fetchLong (long i) = 0;
virtual char *fetchString (long i) = 0;
virtual double fetchDouble (long i) = 0;
virtual void *fetchObject (long i) = 0;
virtual void setDatumValue (long, const Datum*) = 0;
virtual void setValue (long, uint64_t) = 0;
virtual void setObjValue (long, void*) = 0;
virtual int cmpValues (long idx1, long idx2) = 0;
virtual int cmpDatumValue (long idx, const Datum *val) = 0;
};
enum Data_flag
{
DDFLAG_NOSHOW = 0x01
};
class DataDescriptor
{
/*
* An instance of this class stores the data packets for a specific
* type of profiling, for example, clock profiling.
*
* Each packet consists of values for various properties.
* For example, a timestamp is a property which is accessed with PROP_TSTAMP.
*
* Ideally, DataDescriptor contents are considered immutable after the
* data is read in. setValue() should only be used during creation.
* - The packets are in fixed order. This allows DataDescriptor <pkt_id>
* to be treated as a stable handle.
* - Sorting/filtering is handled by the DataView class
* - In the future, if we need to add the ability to append new packets,
* we might add a flag to show when the class is immutable and/or appendible
*/
public:
DataDescriptor (int id, const char* name, const char* uname, int flags = 0); // master
DataDescriptor (int id, const char* name, const char* uname, DataDescriptor*); // reference copy
~DataDescriptor ();
// packets' descriptions
int
getId ()
{
return id;
}
char *
getName ()
{
return name;
}
char *
getUName ()
{
return uname;
}
Vector<PropDescr*> *
getProps ()
{
return props; // packet properties
}
PropDescr *getProp (int prop_id); // packet property
long
getSize ()
{
return *ref_size; // number of packets
}
long
getFlags ()
{
return flags;
}
// class to provide sorting and filtering
DataView *createView ();
DataView *createImmutableView ();
DataView *createExtManagedView ();
// packet property values (<pkt_id> is stable packet handle)
int getIntValue (int prop_id, long pkt_id);
unsigned long long getULongValue (int prop_id, long pkt_id);
long long getLongValue (int prop_id, long pkt_id);
void *getObjValue (int prop_id, long pkt_id);
Vector<long long> *getSet (int prop_id); // list of sorted, unique values
// table creation/reset
void addProperty (PropDescr*); // add property to all packets
long addRecord (); // add packet
Data *getData (int prop_id); // get all packets
void setDatumValue (int prop_id, long pkt_id, const Datum *val);
void setValue (int prop_id, long pkt_id, uint64_t val);
void setObjValue (int prop_id, long pkt_id, void *val);
void reset (); // remove all packets (ym: TBR?)
void
setResolveFrInfoDone ()
{
*ref_resolveFrameInfoDone = true;
}
bool
isResolveFrInfoDone ()
{
return *ref_resolveFrameInfoDone;
}
private:
bool isMaster;
int flags; // see Data_flag enum
int id;
char *name;
char *uname;
// the following should only be accessed if parent==NULL
long master_size;
bool master_resolveFrameInfoDone;
// the following point to the master DataDescriptor's fields
long *ref_size;
bool *ref_resolveFrameInfoDone;
Vector<PropDescr*> *props;
Vector<Data*> *data;
Vector<Vector<long long>*> *setsTBR; // Sets of unique values
};
typedef struct
{
long begin;
long end;
long orig_ddsize;
DataView *tmpView;
long *idxArr;
FilterExp *fltr;
} fltr_dbe_ctx;
class DataView
{
/*
* Provides sorting and filtering of DataDescriptor packets
*/
public:
enum Relation
{
REL_LT,
REL_LTEQ,
REL_EQ,
REL_GTEQ,
REL_GT
};
enum DataViewType
{
DV_NORMAL, // filterable, sortable
DV_IMMUTABLE, // reflects exact data in DataDescriptor
DV_EXT_MANAGED // sortable. index[] entries managed externally.
};
DataView (DataDescriptor*);
DataView (DataDescriptor*, DataViewType);
virtual ~DataView ();
Vector<PropDescr*> *getProps ();
PropDescr *getProp (int prop_id);
long getSize (); // number of post-filter packets
// packet property values accessed by sort index (not DataDescriptor pkt_id)
int getIntValue (int prop_id, long idx);
unsigned long long getULongValue (int prop_id, long idx);
long long getLongValue (int prop_id, long idx);
void *getObjValue (int prop_id, long idx);
long getIdByIdx (long idx); // returns DataDescriptor pkt_id
// define sort/filter
void sort (const int props[], int prop_count);
void sort (int prop);
void sort (int prop1, int prop2);
void sort (int prop1, int prop2, int prop3);
void setFilter (FilterExp*);
// search packets
// - sort must already be defined
// - requires the user to provide all properties used in current sort.
// - For a match, the all but the last sort property (the "leaf")
// must match exactly.
long getIdxByVals (const Datum valColumns[], Relation rel);
long getIdxByVals (const Datum valColumns[], Relation rel,
long minIdx, long maxIdx); //limit idx search range
bool idxRootDimensionsMatch (long idx, const Datum valColumns[]);
// packet at idx matches all non-leaf values in valColumns
// use during table creation, updates underlying DataDescriptor
void setDatumValue (int prop_id, long idx, const Datum *val);
void setValue (int prop_id, long idx, uint64_t val);
void setObjValue (int prop_id, long idx, void *val);
DataDescriptor *
getDataDescriptor ()
{
return ddscr;
}
void removeDbeViewIdx (long idx);
// for use with DV_EXT_MANAGED DataViews:
void appendDataDescriptorId (long pkt_id);
void setDataDescriptorValue (int prop_id, long pkt_id, uint64_t val);
long long getDataDescriptorValue (int prop_id, long pkt_id);
private:
bool checkUpdate ();
void init (DataDescriptor*, DataViewType);
static void filter_in_chunks (fltr_dbe_ctx *dctx);
DataDescriptor *ddscr;
long ddsize;
Vector<long> *index; // sorted vector of data_id (index into dDscr)
#define MAX_SORT_DIMENSIONS 10
#define DATA_SORT_EOL ((Data *) -1) /* marks end of sortedBy[] array */
Data *sortedBy[MAX_SORT_DIMENSIONS + 1]; // columns for sort
FilterExp *filter;
DataViewType type;
};
#endif /* _TABLE_H */