mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-25 08:47:28 +00:00
libctf: Add iteration over non-root types
The existing function ctf_type_iter lets you iterate over root-visible types (types you can look up by name). There is no way to iterate over non-root-visible types, which is troublesome because both the linker and dumper want to do that. So add a new function that can do it: the callback it takes accepts an extra parameter which indicates whether the type is root-visible or not. include/ * ctf-api.h (ctf_type_all_f): New. (ctf_type_iter_all): New. libctf/ * ctf_types.c (ctf_type_iter_all): New.
This commit is contained in:
@@ -1,3 +1,8 @@
|
|||||||
|
2019-07-13 Nick Alcock <nick.alcock@oracle.com>
|
||||||
|
|
||||||
|
* ctf-api.h (ctf_type_all_f): New.
|
||||||
|
(ctf_type_iter_all): New.
|
||||||
|
|
||||||
2019-07-11 Nick Alcock <nick.alcock@oracle.com>
|
2019-07-11 Nick Alcock <nick.alcock@oracle.com>
|
||||||
|
|
||||||
* ctf.h: Add object index and function index sections. Describe
|
* ctf.h: Add object index and function index sections. Describe
|
||||||
|
|||||||
@@ -211,6 +211,7 @@ typedef int ctf_member_f (const char *name, ctf_id_t membtype,
|
|||||||
typedef int ctf_enum_f (const char *name, int val, void *arg);
|
typedef int ctf_enum_f (const char *name, int val, void *arg);
|
||||||
typedef int ctf_variable_f (const char *name, ctf_id_t type, void *arg);
|
typedef int ctf_variable_f (const char *name, ctf_id_t type, void *arg);
|
||||||
typedef int ctf_type_f (ctf_id_t type, void *arg);
|
typedef int ctf_type_f (ctf_id_t type, void *arg);
|
||||||
|
typedef int ctf_type_all_f (ctf_id_t type, int flag, void *arg);
|
||||||
typedef int ctf_label_f (const char *name, const ctf_lblinfo_t *info,
|
typedef int ctf_label_f (const char *name, const ctf_lblinfo_t *info,
|
||||||
void *arg);
|
void *arg);
|
||||||
typedef int ctf_archive_member_f (ctf_file_t *fp, const char *name, void *arg);
|
typedef int ctf_archive_member_f (ctf_file_t *fp, const char *name, void *arg);
|
||||||
@@ -317,6 +318,7 @@ extern int ctf_label_info (ctf_file_t *, const char *, ctf_lblinfo_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 *);
|
||||||
|
extern int ctf_type_iter_all (ctf_file_t *, ctf_type_all_f *, void *);
|
||||||
extern int ctf_label_iter (ctf_file_t *, ctf_label_f *, void *);
|
extern int ctf_label_iter (ctf_file_t *, ctf_label_f *, void *);
|
||||||
extern int ctf_variable_iter (ctf_file_t *, ctf_variable_f *, void *);
|
extern int ctf_variable_iter (ctf_file_t *, ctf_variable_f *, void *);
|
||||||
extern int ctf_archive_iter (const ctf_archive_t *, ctf_archive_member_f *,
|
extern int ctf_archive_iter (const ctf_archive_t *, ctf_archive_member_f *,
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
2019-07-13 Nick Alcock <nick.alcock@oracle.com>
|
||||||
|
|
||||||
|
* ctf_types.c (ctf_type_iter_all): New.
|
||||||
|
|
||||||
2019-07-13 Nick Alcock <nick.alcock@oracle.com>
|
2019-07-13 Nick Alcock <nick.alcock@oracle.com>
|
||||||
|
|
||||||
* ctf-open.c (init_symtab): Check for overflow against the right
|
* ctf-open.c (init_symtab): Check for overflow against the right
|
||||||
|
|||||||
@@ -144,6 +144,27 @@ ctf_type_iter (ctf_file_t *fp, ctf_type_f *func, void *arg)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Iterate over every type in the given CTF container, user-visible or not.
|
||||||
|
We pass the type ID of each type to the specified callback function. */
|
||||||
|
|
||||||
|
int
|
||||||
|
ctf_type_iter_all (ctf_file_t *fp, ctf_type_all_f *func, void *arg)
|
||||||
|
{
|
||||||
|
ctf_id_t id, max = fp->ctf_typemax;
|
||||||
|
int rc, child = (fp->ctf_flags & LCTF_CHILD);
|
||||||
|
|
||||||
|
for (id = 1; id <= max; id++)
|
||||||
|
{
|
||||||
|
const ctf_type_t *tp = LCTF_INDEX_TO_TYPEPTR (fp, id);
|
||||||
|
if ((rc = func (LCTF_INDEX_TO_TYPE (fp, id, child),
|
||||||
|
LCTF_INFO_ISROOT(fp, tp->ctt_info)
|
||||||
|
? CTF_ADD_ROOT : CTF_ADD_NONROOT, arg) != 0))
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Iterate over every variable in the given CTF container, in arbitrary order.
|
/* Iterate over every variable in the given CTF container, in arbitrary order.
|
||||||
We pass the name of each variable to the specified callback function. */
|
We pass the name of each variable to the specified callback function. */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user