174 lines
7.0 KiB
C
174 lines
7.0 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2012 Fidelity Information Services, Inc *
|
|
* *
|
|
* This source code contains the intellectual property *
|
|
* of its copyright holder(s), and is made available *
|
|
* under a license. If you do not know the terms of *
|
|
* the license, please stop and do not read further. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#ifndef MPROF_H_INCLUDED
|
|
#define MPROF_H_INCLUDED
|
|
#include "mdef.h"
|
|
#include "str2gvargs.h"
|
|
#include "xfer_enum.h"
|
|
#include "fix_xfer_entry.h"
|
|
#ifdef UNIX
|
|
#include "gtm_times.h"
|
|
#include <sys/resource.h>
|
|
#endif
|
|
#define OFFSET_LEN 8 /* single-pointer padding at the beginning of pcalloc allocation; 8 is chosen to both fit a
|
|
* pointer on 32- and 64-bit architectures and ensure proper memory alignment even when we
|
|
* are dealing with 32-bit compiles on 64-bit machines */
|
|
#define PROFCALLOC_DSBLKSIZE 8192 /* the size of pcalloc allocation chunks */
|
|
|
|
#define POPULATE_PROFILING_TABLE() { \
|
|
/* xfer_table[xf_linefetch] = op_mproflinefetch; */ \
|
|
/* xfer_table[xf_linefetch] = NON_IA64_ONLY((op_mproflinefetch) IA64_ONLY(CODE_ADDRESS_ASM(op_mproflinestart));*/ \
|
|
FIX_XFER_ENTRY(xf_linefetch, op_mproflinefetch); \
|
|
/* xfer_table[xf_linestart] = NON_IA64_ONLY(op_mproflinestart) IA64_ONLY(CODE_ADDRESS_ASM(op_mproflinestart)); */ \
|
|
FIX_XFER_ENTRY(xf_linestart, op_mproflinestart) \
|
|
FIX_XFER_ENTRY(xf_extexfun, op_mprofextexfun); \
|
|
FIX_XFER_ENTRY(xf_extcall, op_mprofextcall); \
|
|
FIX_XFER_ENTRY(xf_exfun, op_mprofexfun); \
|
|
FIX_XFER_ENTRY(xf_callb, op_mprofcallb); \
|
|
FIX_XFER_ENTRY(xf_calll, op_mprofcalll); \
|
|
FIX_XFER_ENTRY(xf_callw, op_mprofcallw); \
|
|
FIX_XFER_ENTRY(xf_callspl, op_mprofcallspl); \
|
|
FIX_XFER_ENTRY(xf_callspw, op_mprofcallspw); \
|
|
FIX_XFER_ENTRY(xf_callspb, op_mprofcallspb); \
|
|
FIX_XFER_ENTRY(xf_forlcldob, op_mprofforlcldob); \
|
|
FIX_XFER_ENTRY(xf_forlcldow, op_mprofforlcldow); \
|
|
FIX_XFER_ENTRY(xf_forlcldol, op_mprofforlcldol); \
|
|
FIX_XFER_ENTRY(xf_forchk1, op_mprofforchk1); \
|
|
}
|
|
|
|
#define CLEAR_PROFILING_TABLE() { \
|
|
FIX_XFER_ENTRY(xf_linefetch, op_linefetch); \
|
|
FIX_XFER_ENTRY(xf_linestart, op_linestart); \
|
|
FIX_XFER_ENTRY(xf_extexfun, op_extexfun); \
|
|
FIX_XFER_ENTRY(xf_extcall, op_extcall); \
|
|
FIX_XFER_ENTRY(xf_exfun, op_exfun); \
|
|
FIX_XFER_ENTRY(xf_callb, op_callb); \
|
|
FIX_XFER_ENTRY(xf_callw, op_callw); \
|
|
FIX_XFER_ENTRY(xf_calll, op_calll); \
|
|
/* xfer_table[xf_exfun] = op_exfun; */ \
|
|
FIX_XFER_ENTRY(xf_callspb, op_callspb); \
|
|
FIX_XFER_ENTRY(xf_callspw, op_callspw); \
|
|
FIX_XFER_ENTRY(xf_callspl, op_callspl); \
|
|
FIX_XFER_ENTRY(xf_forlcldob, op_forlcldob); \
|
|
FIX_XFER_ENTRY(xf_forlcldow, op_forlcldow); \
|
|
FIX_XFER_ENTRY(xf_forlcldol, op_forlcldol); \
|
|
FIX_XFER_ENTRY(xf_forchk1, op_forchk1); \
|
|
}
|
|
|
|
typedef struct ext_tms_struct
|
|
{
|
|
gtm_uint64_t tms_utime; /* user time */
|
|
gtm_uint64_t tms_stime; /* system time */
|
|
gtm_uint64_t tms_etime; /* elapsed time */
|
|
} ext_tms;
|
|
|
|
/* holds information identifying a line of/label in the code */
|
|
typedef struct
|
|
{
|
|
mident *rout_name; /* routine name */
|
|
mident *label_name; /* label name */
|
|
signed int line_num; /* line number; -1 used for generic label nodes, and -2 for overflow node */
|
|
unsigned count; /* number of executions */
|
|
gtm_uint64_t sys_time; /* total system time */
|
|
gtm_uint64_t usr_time; /* total user time */
|
|
gtm_uint64_t elp_time; /* total elapsed time */
|
|
int loop_level; /* nesting level; 0 for regular code and 1+ for (nested) loops */
|
|
char *raddr; /* return address used in FORs to record destination after current iteration */
|
|
} trace_entry;
|
|
|
|
/* defines an mprof stack frame */
|
|
typedef struct mprof_stack_frame_struct
|
|
{
|
|
struct mprof_stack_frame_struct *prev; /* reference to the previous frame */
|
|
mident *rout_name; /* routine name */
|
|
mident *label_name; /* label name */
|
|
struct mprof_tree_struct *curr_node; /* reference to the current tree node in this frame */
|
|
struct ext_tms_struct start; /* user and system time at the beginning of current measurement */
|
|
struct ext_tms_struct carryover; /* user and system time to be subtracted from parent frames */
|
|
int dummy_stack_count; /* number of non-label stack frames (IFs and FORs with DO) */
|
|
} mprof_stack_frame;
|
|
|
|
/* defines a node of mprof tree which is an AVL tree */
|
|
typedef struct mprof_tree_struct
|
|
{
|
|
trace_entry e; /* holds identifying information about this node */
|
|
struct mprof_tree_struct *link[2]; /* references to left and right children */
|
|
struct mprof_tree_struct *loop_link; /* FORs attached to the node as a linked list */
|
|
int desc_dir; /* descending direction that indicates which subtree is unbalanced */
|
|
int ins_path_hint; /* indicates whether node was (1) or was not (-1) in the path of last
|
|
* insert, or was the node inserted (0) */
|
|
} mprof_tree;
|
|
|
|
typedef struct mprof_wrapper_struct
|
|
{
|
|
struct ext_tms_struct tprev, tcurr;
|
|
mprof_tree *head_tblnd, *curr_tblnd;
|
|
int curr_num_subscripts;
|
|
char **pcavailptr, **pcavailbase;
|
|
int pcavail;
|
|
boolean_t is_tracing_ini;
|
|
mval subsc[MAX_GVSUBSCRIPTS];
|
|
gvargs_t gvargs;
|
|
mval gbl_to_fill;
|
|
} mprof_wrapper;
|
|
|
|
STATICFNDCL void get_entryref_information(boolean_t, trace_entry *);
|
|
STATICFNDCL void parse_gvn(mval *);
|
|
#ifdef UNIX
|
|
STATICFNDCL void times_usec(ext_tms *curr);
|
|
STATICFNDCL void child_times_usec(void);
|
|
#else
|
|
STATICFNDCL void get_cputime(ext_tms *curr);
|
|
#endif
|
|
STATICFNDCL void insert_total_times(boolean_t for_process);
|
|
|
|
STATICFNDCL mprof_tree *rotate_2(mprof_tree **, int);
|
|
STATICFNDCL mprof_tree *rotate_3(mprof_tree **, int, int);
|
|
STATICFNDCL int mprof_tree_compare(mprof_tree *, trace_entry *);
|
|
STATICFNDCL void mprof_tree_rebalance_path(mprof_tree *, trace_entry *);
|
|
STATICFNDCL void mprof_tree_rebalance(mprof_tree **, trace_entry *);
|
|
|
|
void turn_tracing_on(mval *glvn, boolean_t from_env, boolean_t save_gbl);
|
|
void turn_tracing_off(mval *);
|
|
void forchkhandler(char *return_address);
|
|
void pcurrpos(void);
|
|
void new_prof_frame(int);
|
|
void unw_prof_frame(void);
|
|
char *pcalloc(unsigned int);
|
|
void mprof_reclaim_slots(void);
|
|
void crt_gbl(mprof_tree *p, boolean_t is_for);
|
|
void stack_leak_check(void);
|
|
|
|
mprof_tree *new_node(trace_entry *);
|
|
mprof_tree *new_for_node(trace_entry *, char *);
|
|
void mprof_tree_walk(mprof_tree *);
|
|
mprof_tree *mprof_tree_insert(mprof_tree **, trace_entry *);
|
|
|
|
void mprof_stack_init(void);
|
|
mprof_stack_frame *mprof_stack_push(void);
|
|
mprof_stack_frame *mprof_stack_pop(void);
|
|
void mprof_stack_free(void);
|
|
|
|
/* functions required for the transfer table manipulations*/
|
|
int op_mproflinefetch(), op_mproflinestart();
|
|
int op_mprofextexfun(), op_mprofextcall(), op_mprofexfun();
|
|
int op_mprofcallb(), op_mprofcallw(), op_mprofcalll();
|
|
int op_mprofcallspw(), op_mprofcallspl(), op_mprofcallspb();
|
|
int op_mprofforlcldow(), op_mprofforlcldol(), op_mprofforlcldob(), op_mprofforchk1();
|
|
int op_linefetch(), op_linestart();
|
|
int op_extexfun(), op_extcall(), op_exfun(), op_forlcldo();
|
|
int op_callw(), op_calll(), op_callb();
|
|
int op_callspw(), op_callspl(), op_callspb();
|
|
int op_forlcldow(), op_forlcldol(), op_forlcldob(), op_forchk1();
|
|
|
|
#endif /* MPROF_H_INCLUDED */
|