Browse Source

libctf: add ctf_member_count

This returns the number of members in a struct or union, or the number
of enumerations in an enum.  (This was only available before now by
iterating across every member, but it can be returned much faster than
that.)

include/
	* ctf-api.h (ctf_member_count): New.

libctf/
	* ctf-types.c (ctf_member_count): New.
	* libctf.ver: New public function.
gdb-10-branch
Nick Alcock 6 years ago
parent
commit
e0325e2ced
  1. 4
      include/ChangeLog
  2. 1
      include/ctf-api.h
  3. 5
      libctf/ChangeLog
  4. 24
      libctf/ctf-types.c
  5. 1
      libctf/libctf.ver

4
include/ChangeLog

@ -1,3 +1,7 @@
2020-07-22 Nick Alcock <nick.alcock@oracle.com>
* ctf-api.h (ctf_member_count): New.
2020-07-22 Nick Alcock <nick.alcock@oracle.com> 2020-07-22 Nick Alcock <nick.alcock@oracle.com>
* ctf-api.h (ctf_type_kind_forwarded): New. * ctf-api.h (ctf_type_kind_forwarded): New.

1
include/ctf-api.h

@ -349,6 +349,7 @@ extern const char *ctf_label_get (ctf_file_t *);
extern const char *ctf_label_topmost (ctf_file_t *); extern const char *ctf_label_topmost (ctf_file_t *);
extern int ctf_label_info (ctf_file_t *, const char *, ctf_lblinfo_t *); extern int ctf_label_info (ctf_file_t *, const char *, ctf_lblinfo_t *);
extern int ctf_member_count (ctf_file_t *, ctf_id_t);
extern int ctf_member_iter (ctf_file_t *, ctf_id_t, ctf_member_f *, void *); extern int ctf_member_iter (ctf_file_t *, ctf_id_t, ctf_member_f *, void *);
extern int ctf_enum_iter (ctf_file_t *, ctf_id_t, ctf_enum_f *, void *); extern int ctf_enum_iter (ctf_file_t *, ctf_id_t, ctf_enum_f *, void *);
extern int ctf_type_iter (ctf_file_t *, ctf_type_f *, void *); extern int ctf_type_iter (ctf_file_t *, ctf_type_f *, void *);

5
libctf/ChangeLog

@ -1,3 +1,8 @@
2020-07-22 Nick Alcock <nick.alcock@oracle.com>
* ctf-types.c (ctf_member_count): New.
* libctf.ver: New public function.
2020-07-22 Nick Alcock <nick.alcock@oracle.com> 2020-07-22 Nick Alcock <nick.alcock@oracle.com>
* ctf-types.c (ctf_type_kind_forwarded): New. * ctf-types.c (ctf_type_kind_forwarded): New.

24
libctf/ctf-types.c

@ -963,6 +963,30 @@ ctf_type_compat (ctf_file_t *lfp, ctf_id_t ltype,
} }
} }
/* Return the number of members in a STRUCT or UNION, or the number of
enumerators in an ENUM. */
int
ctf_member_count (ctf_file_t *fp, ctf_id_t type)
{
ctf_file_t *ofp = fp;
const ctf_type_t *tp;
uint32_t kind;
if ((type = ctf_type_resolve (fp, type)) == CTF_ERR)
return -1; /* errno is set for us. */
if ((tp = ctf_lookup_by_id (&fp, type)) == NULL)
return -1; /* errno is set for us. */
kind = LCTF_INFO_KIND (fp, tp->ctt_info);
if (kind != CTF_K_STRUCT && kind != CTF_K_UNION && kind != CTF_K_ENUM)
return (ctf_set_errno (ofp, ECTF_NOTSUE));
return LCTF_INFO_VLEN (fp, tp->ctt_info);
}
/* Return the type and offset for a given member of a STRUCT or UNION. */ /* Return the type and offset for a given member of a STRUCT or UNION. */
int int

1
libctf/libctf.ver

@ -73,6 +73,7 @@ LIBCTF_1.0 {
ctf_member_info; ctf_member_info;
ctf_array_info; ctf_array_info;
ctf_member_count;
ctf_enum_name; ctf_enum_name;
ctf_enum_value; ctf_enum_value;

Loading…
Cancel
Save