]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
libctf: types: add ctf_struct_bitfield (NEEDS REVIEW)
authorNick Alcock <nick.alcock@oracle.com>
Thu, 24 Apr 2025 16:05:10 +0000 (17:05 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Fri, 25 Apr 2025 17:07:42 +0000 (18:07 +0100)
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);

include/ctf-api.h
libctf/ctf-types.c
libctf/libctf.ver

index 71bc6da0e62d748beede32dbdf9d76e0b14663d7..762cc4895ce3d8d6ab75b2c45609352136295be4 100644 (file)
@@ -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.  */
 
index ddc9f8c98a53bae8d8ddf7ede6a230344c96e84b..be421e77f83527593fb3a6db40fe8a713b123570 100644 (file)
 #include <assert.h>
 #include <string.h>
 
+#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.  */
 
index 77d532f294136e0235026ba3e579e854706ba461..a94b2fe08694540a026192fbac62aa6968bdee1f 100644 (file)
@@ -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;