File: dt_ident.h

package info (click to toggle)
dtrace 2.0.5-1
  • links: PTS
  • area: main
  • in suites: sid
  • size: 24,408 kB
  • sloc: ansic: 61,247; sh: 17,997; asm: 1,717; lex: 947; awk: 754; yacc: 695; perl: 37; sed: 17; makefile: 15
file content (177 lines) | stat: -rw-r--r-- 8,022 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/*
 * Oracle Linux DTrace.
 * Copyright (c) 2005, 2022, Oracle and/or its affiliates. All rights reserved.
 * Licensed under the Universal Permissive License v 1.0 as shown at
 * http://oss.oracle.com/licenses/upl.
 */

#ifndef	_DT_IDENT_H
#define	_DT_IDENT_H

#include <sys/ctf-api.h>
#include <dtrace.h>

#ifdef	__cplusplus
extern "C" {
#endif

#include <dt_list.h>

struct dt_node;
struct dt_ident;
struct dt_idhash;
struct dt_irlist;
struct dt_regset;

typedef struct dt_idsig {
	int dis_varargs;	/* argument index of start of varargs (or -1) */
	int dis_optargs;	/* argument index of start of optargs (or -1) */
	int dis_argc;		/* number of types in this signature */
	struct dt_node *dis_args; /* array of nodes representing formal types */
	uint64_t dis_auxinfo;	/* auxiliary signature information, if any */
} dt_idsig_t;

typedef struct dt_idnode {
	struct dt_node *din_list; /* allocation list for parse tree nodes */
	struct dt_node *din_root; /* root of this identifier's parse tree */
	struct dt_idhash *din_hash; /* identifiers private to this subtree */
	struct dt_ident **din_argv; /* identifiers in din_hash for arguments */
	int din_argc;		  /* length of din_argv[] array */
} dt_idnode_t;

typedef struct dt_idops {
	void (*di_cook)(struct dt_node *, struct dt_ident *,
	    int, struct dt_node *);
	void (*di_dtor)(struct dt_ident *);
	size_t (*di_size)(struct dt_ident *);
} dt_idops_t;

typedef struct dt_ident {
	char *di_name;		/* identifier name */
	ushort_t di_kind;	/* identifier kind (see below) */
	ushort_t di_flags;	/* identifier flags (see below) */
	uint_t di_id;		/* variable or subr id */
	dtrace_attribute_t di_attr; /* identifier stability attributes */
	uint_t di_vers;		/* identifier version number (dt_version_t) */
	const dt_idops_t *di_ops; /* identifier's class-specific ops vector */
	void *di_iarg;		/* initial argument pointer for ops vector */
	void *di_data;		/* private data pointer for ops vector */
	ctf_file_t *di_ctfp;	/* CTF container for the variable data type */
	ctf_id_t di_type;	/* CTF identifier for the variable data type */
	int di_offset;		/* storage offset */
	int di_size;		/* storage size */
	struct dt_ident *di_next; /* pointer to next ident in hash chain */
	ulong_t di_gen;		/* generation number (pass that created me) */
	int di_lineno;		/* line number that defined this identifier */
	struct dt_idhash *di_hash; /* idhash this identifier belongs to */
} dt_ident_t;

#define	DT_IDENT_ARRAY	0	/* identifier is an array variable */
#define	DT_IDENT_SCALAR	1	/* identifier is a scalar variable */
#define	DT_IDENT_PTR	2	/* identifier is a magic pointer */
#define	DT_IDENT_FUNC	3	/* identifier is a built-in function */
#define	DT_IDENT_AGG	4	/* identifier is an aggregation */
#define	DT_IDENT_AGGFUNC 5	/* identifier is an aggregating function */
#define	DT_IDENT_ACTFUNC 6	/* identifier is an action function */
#define	DT_IDENT_XLSOU	7	/* identifier is a translated struct or union */
#define	DT_IDENT_XLPTR	8	/* identifier is a translated pointer */
#define	DT_IDENT_SYMBOL	9	/* identifier is an external symbol */
#define	DT_IDENT_ENUM	10	/* identifier is an enumerator */
#define	DT_IDENT_PRAGAT	11	/* identifier is #pragma attributes */
#define	DT_IDENT_PRAGBN	12	/* identifier is #pragma binding */
#define	DT_IDENT_PROBE	13	/* identifier is a probe definition */

#define	DT_IDFLG_TLS	0x0001	/* variable is thread-local storage */
#define	DT_IDFLG_LOCAL	0x0002	/* variable is local storage */
#define	DT_IDFLG_WRITE	0x0004	/* variable is writable (can be modified) */
#define	DT_IDFLG_INLINE	0x0008	/* variable is an inline definition */
#define	DT_IDFLG_REF	0x0010	/* variable is referenced by this program */
#define	DT_IDFLG_MOD	0x0020	/* variable is modified by this program */
#define	DT_IDFLG_DIFR	0x0040	/* variable is referenced by current DIFO */
#define	DT_IDFLG_DIFW	0x0080	/* variable is modified by current DIFO */
#define	DT_IDFLG_CGREG	0x0100	/* variable is inlined by code generator */
#define	DT_IDFLG_USER	0x0200	/* variable is associated with userland */
#define	DT_IDFLG_DECL	0x0400	/* variable is associated with explicit decl */
#define	DT_IDFLG_ORPHAN	0x0800	/* variable is in a dt_node and not dt_idhash */
#define	DT_IDFLG_BPF	0x1000	/* variable is BPF */
#define	DT_IDFLG_ALLOCA	0x2000	/* variable holds an alloca()ed pointer */
#define	DT_IDFLG_NONALLOCA 0x4000 /* variable known not to hold an alloca()ed pointer */
#define	DT_IDFLG_DPTR	0x8000	/* variable is ptr to DTrace-managed storage */

#define DT_IDENT_UNDEF	UINT_MAX /* id for (as yet) undefined identifiers */

typedef struct dt_idhash {
	dt_list_t dh_list;	/* list prev/next pointers for dt_idstack */
	const char *dh_name;	/* name of this hash table */
	void (*dh_defer)(struct dt_idhash *, dt_ident_t *); /* defer callback */
	const dt_ident_t *dh_tmpl; /* template for initial ident population */
	uint_t dh_nextid;	/* next id to be returned by idhash_nextid() */
	uint_t dh_minid;	/* min id to be returned by idhash_nextid() */
	uint_t dh_maxid;	/* max id to be returned by idhash_nextid() */
	uint_t dh_nextoff;	/* next offset to use for storage allocation */
	ulong_t dh_nelems;	/* number of identifiers in hash table */
	ulong_t dh_hashsz;	/* number of entries in dh_buckets array */
	dt_ident_t *dh_hash[1];	/* array of hash table bucket pointers */
} dt_idhash_t;

typedef struct dt_idstack {
	dt_list_t dids_list;	/* list meta-data for dt_idhash_t stack */
} dt_idstack_t;

extern const dt_idops_t dt_idops_assc;	/* associative array or aggregation */
extern const dt_idops_t dt_idops_func;	/* function call built-in */
extern const dt_idops_t dt_idops_args;	/* args[] built-in */
extern const dt_idops_t dt_idops_regs;	/* regs[]/uregs[] built-in */
extern const dt_idops_t dt_idops_type;	/* predefined type name string */
extern const dt_idops_t dt_idops_thaw;	/* prefrozen type identifier */
extern const dt_idops_t dt_idops_inline; /* inline variable */
extern const dt_idops_t dt_idops_probe;	/* probe definition */
extern const dt_idops_t dt_idops_difo;	/* symbol DIFO */

extern dt_idhash_t *dt_idhash_create(const char *, const dt_ident_t *,
    uint_t, uint_t);
extern void dt_idhash_destroy(dt_idhash_t *);
extern void dt_idhash_update(dt_idhash_t *);
extern dt_ident_t *dt_idhash_lookup(dt_idhash_t *, const char *);
extern int dt_idhash_nextid(dt_idhash_t *, uint_t *);
extern uint_t dt_idhash_peekid(dt_idhash_t *);
extern uint_t dt_idhash_datasize(const dt_idhash_t *);
extern ulong_t dt_idhash_size(const dt_idhash_t *);
extern const char *dt_idhash_name(const dt_idhash_t *);

extern dt_ident_t *dt_idhash_insert(dt_idhash_t *, const char *, ushort_t,
    ushort_t, uint_t, dtrace_attribute_t, uint_t,
    const dt_idops_t *, void *, ulong_t);

extern void dt_idhash_xinsert(dt_idhash_t *, dt_ident_t *);
extern void dt_idhash_delete(dt_idhash_t *, dt_ident_t *);

typedef int dt_idhash_f(dt_idhash_t *, dt_ident_t *, void *);
extern int dt_idhash_iter(dt_idhash_t *, dt_idhash_f *, void *);

extern dt_ident_t *dt_idstack_lookup(dt_idstack_t *, const char *);
extern void dt_idstack_push(dt_idstack_t *, dt_idhash_t *);
extern void dt_idstack_pop(dt_idstack_t *, dt_idhash_t *);

extern dt_ident_t *dt_ident_create(const char *, ushort_t, ushort_t, uint_t,
    dtrace_attribute_t, uint_t, const dt_idops_t *, void *, ulong_t);
extern void dt_ident_destroy(dt_ident_t *);
extern void dt_ident_morph(dt_ident_t *, ushort_t, const dt_idops_t *, void *);
extern dtrace_attribute_t dt_ident_cook(struct dt_node *,
    dt_ident_t *, struct dt_node **);

extern void dt_ident_set_id(dt_ident_t *, uint_t);
extern void dt_ident_set_data(dt_ident_t *, void *);
extern void dt_ident_set_storage(dt_ident_t *, uint_t, uint_t);
extern void dt_ident_type_assign(dt_ident_t *, ctf_file_t *, ctf_id_t);
extern dt_ident_t *dt_ident_resolve(dt_ident_t *);
extern size_t dt_ident_size(dt_ident_t *);
extern int dt_ident_unref(const dt_ident_t *);

extern const char *dt_idkind_name(uint_t);

#ifdef	__cplusplus
}
#endif

#endif	/* _DT_IDENT_H */