[binutils-gdb] libctf: add ctf_member_count
Nick Alcock
nix@sourceware.org
Wed Jul 22 17:09:04 GMT 2020
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=e0325e2cede6f9da2560ede6d4a17d9e21fbea9c
commit e0325e2cede6f9da2560ede6d4a17d9e21fbea9c
Author: Nick Alcock <nick.alcock@oracle.com>
Date: Tue Jun 2 21:11:25 2020 +0100
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.
Diff:
---
include/ChangeLog | 4 ++++
include/ctf-api.h | 1 +
libctf/ChangeLog | 5 +++++
libctf/ctf-types.c | 24 ++++++++++++++++++++++++
libctf/libctf.ver | 1 +
5 files changed, 35 insertions(+)
diff --git a/include/ChangeLog b/include/ChangeLog
index 18b0b0b84c6..27ffb9051ed 100644
--- a/include/ChangeLog
+++ b/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>
* ctf-api.h (ctf_type_kind_forwarded): New.
diff --git a/include/ctf-api.h b/include/ctf-api.h
index 87446a5f7d1..7cdf4a56235 100644
--- a/include/ctf-api.h
+++ b/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 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_enum_iter (ctf_file_t *, ctf_id_t, ctf_enum_f *, void *);
extern int ctf_type_iter (ctf_file_t *, ctf_type_f *, void *);
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index 949e9d047b8..7df7867b4cb 100644
--- a/libctf/ChangeLog
+++ b/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>
* ctf-types.c (ctf_type_kind_forwarded): New.
diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c
index d8f848cf893..93967c6aa8d 100644
--- a/libctf/ctf-types.c
+++ b/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. */
int
diff --git a/libctf/libctf.ver b/libctf/libctf.ver
index b8c5133d3f9..77b380ca991 100644
--- a/libctf/libctf.ver
+++ b/libctf/libctf.ver
@@ -73,6 +73,7 @@ LIBCTF_1.0 {
ctf_member_info;
ctf_array_info;
+ ctf_member_count;
ctf_enum_name;
ctf_enum_value;
More information about the Binutils-cvs
mailing list