[DTrace-devel] [PATCH v2 1/5] Add storage offset support in dt_ident_t and dt_idhash_t
Eugene Loh
eugene.loh at oracle.com
Mon Nov 30 08:52:55 PST 2020
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
On 11/24/2020 01:50 PM, Kris Van Hees wrote:
> Variables (especially of a complex type) and aggregations will need
> to be allocated from a memory block. They will therefore require a
> storage offset to be associated with them so that the code generator
> can access the correct memory locations.
>
> The dt_ident_t structure now has a di_offset member to hold the
> storage offset for the identifier (if applicable) and the dt_idhash_t
> structure has a dh_nextoff member to hold the offset to allocate the
> next item at.
>
> The dt_idhash_nextoff(dt_idhash_t *dhp, uint_t alignment, uint_t size)
> function will return the offset where the next data item is to be
> allocated. The size argument specifies the size (in bytes) of the
> data item. The returned value is guaranteed to be properly aligned to
> the number of bytes specified by the alignment argument, and the next
> offset member (dh_nextoff in dt_idhash_t) will be advanced by the
> given number of bytes.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> libdtrace/dt_ident.c | 12 ++++++++++++
> libdtrace/dt_ident.h | 3 +++
> 2 files changed, 15 insertions(+)
>
> diff --git a/libdtrace/dt_ident.c b/libdtrace/dt_ident.c
> index 392f8e56..34b49728 100644
> --- a/libdtrace/dt_ident.c
> +++ b/libdtrace/dt_ident.c
> @@ -669,6 +669,7 @@ dt_idhash_create(const char *name, const dt_ident_t *tmpl,
> dhp->dh_nextid = min;
> dhp->dh_minid = min;
> dhp->dh_maxid = max;
> + dhp->dh_nextoff = 0;
> dhp->dh_hashsz = _dtrace_strbuckets;
>
> return (dhp);
> @@ -768,6 +769,16 @@ dt_idhash_peekid(dt_idhash_t *dhp)
> return dhp->dh_nextid;
> }
>
> +uint_t
> +dt_idhash_nextoff(dt_idhash_t *dhp, uint_t alignment, uint_t size)
> +{
> + uint_t off = (dhp->dh_nextoff + (alignment - 1)) & ~(alignment - 1);
> +
> + dhp->dh_nextoff = off + size;
> +
> + return off;
> +}
> +
> ulong_t
> dt_idhash_size(const dt_idhash_t *dhp)
> {
> @@ -947,6 +958,7 @@ dt_ident_create(const char *name, ushort_t kind, ushort_t flags, uint_t id,
> idp->di_data = NULL;
> idp->di_ctfp = NULL;
> idp->di_type = CTF_ERR;
> + idp->di_offset = -1;
> idp->di_next = NULL;
> idp->di_gen = gen;
> idp->di_lineno = yylineno;
> diff --git a/libdtrace/dt_ident.h b/libdtrace/dt_ident.h
> index c74aa10c..99f16ad5 100644
> --- a/libdtrace/dt_ident.h
> +++ b/libdtrace/dt_ident.h
> @@ -58,6 +58,7 @@ typedef struct dt_ident {
> 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 */
> 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 */
> @@ -102,6 +103,7 @@ typedef struct dt_idhash {
> 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 return at idhash_nextoff() */
> 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 */
> @@ -128,6 +130,7 @@ 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_nextoff(dt_idhash_t *, uint_t, uint_t);
> extern ulong_t dt_idhash_size(const dt_idhash_t *);
> extern const char *dt_idhash_name(const dt_idhash_t *);
>
More information about the DTrace-devel
mailing list