From: Nick Alcock Date: Thu, 24 Apr 2025 16:05:10 +0000 (+0100) Subject: libctf: types: add ctf_struct_bitfield (NEEDS REVIEW) X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0a3ee49dd0b9cf89dd7987be1b6bf95e02b28545;p=thirdparty%2Fbinutils-gdb.git libctf: types: add ctf_struct_bitfield (NEEDS REVIEW) This new public API function allows you to find out if a struct has the bitfield flag set or not. (There are no other properties specific to a struct, so we needed a new function for it. I am open to a ctf_struct_info() function handing back a struct if people prefer.) New API: int ctf_struct_bitfield (ctf_dict_t *, ctf_id_t); --- diff --git a/include/ctf-api.h b/include/ctf-api.h index 71bc6da0e62..762cc4895ce 100644 --- a/include/ctf-api.h +++ b/include/ctf-api.h @@ -685,6 +685,9 @@ extern int ctf_type_cmp (ctf_dict_t *, ctf_id_t, ctf_dict_t *, ctf_id_t); extern const char *ctf_enum_name (ctf_dict_t *, ctf_id_t, int); extern int ctf_enum_value (ctf_dict_t *, ctf_id_t, const char *, int *); +/* Return nonzero if this struct or union uses bitfield encoding. */ + +extern int ctf_struct_bitfield (ctf_dict_t *, ctf_id_t); /* Get the size and member type of an array. */ diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c index ddc9f8c98a5..be421e77f83 100644 --- a/libctf/ctf-types.c +++ b/libctf/ctf-types.c @@ -21,6 +21,10 @@ #include #include +#ifndef roundup +#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) +#endif + /* Determine whether a type is a parent or a child. Bad IDs are not diagnosed! */ @@ -1800,6 +1804,25 @@ ctf_enum_value (ctf_dict_t *fp, ctf_id_t type, const char *name, int *valp) return ctf_set_errno (ofp, ECTF_NOENUMNAM); } +/* Return nonzero if this struct or union uses bitfield encoding. */ +int +ctf_struct_bitfield (ctf_dict_t * fp, ctf_id_t type) +{ + int kind; + const ctf_type_t *tp; /* The suffixed kind, if prefixed */ + + if ((kind = ctf_type_kind (fp, type)) < 0) + return -1; /* errno is set for us. */ + + if (kind != CTF_K_STRUCT && kind != CTF_K_UNION) + return (ctf_set_errno (fp, ECTF_NOTSOU)); + + if (ctf_lookup_by_id (&fp, type, &tp) == NULL) + return -1; /* errno is set for us. */ + + return CTF_INFO_KFLAG (tp->ctt_info); +} + /* Given a type ID relating to a function type, return info on return types and arg counts for that function. */ diff --git a/libctf/libctf.ver b/libctf/libctf.ver index 77d532f2941..a94b2fe0869 100644 --- a/libctf/libctf.ver +++ b/libctf/libctf.ver @@ -86,6 +86,7 @@ LIBCTF_2.0 { ctf_member_next; ctf_array_info; ctf_member_count; + ctf_struct_bitfield; ctf_enum_name; ctf_enum_value;