mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-05-22 17:57:45 +08:00
libctf, ld: handle nonrepresentable types better
ctf_type_visit (used, among other things, by the type dumping code) was aborting when it saw a nonrepresentable type anywhere: even a single structure member with a nonrepresentable type caused an abort with ECTF_NONREPRESENTABLE. This is not useful behaviour, given that the abort comes from a type-resolution we are only doing in order to determine whether the type is a structure or union. We know nonrepresentable types can't be either, so handle that case and pass the nonrepresentable type down. (The added test verifies that the dumper now handles this case and prints nonrepresentable structure members as it already does nonrepresentable top-level types, rather than skipping the whole structure -- or, without the previous commit, skipping the whole types section.) ld/ChangeLog 2021-10-25 Nick Alcock <nick.alcock@oracle.com> * testsuite/ld-ctf/nonrepresentable-member.*: New test. libctf/ChangeLog 2021-10-25 Nick Alcock <nick.alcock@oracle.com> * ctf-types.c (ctf_type_rvisit): Handle nonrepresentable types.
This commit is contained in:
@ -1641,20 +1641,27 @@ ctf_type_rvisit (ctf_dict_t *fp, ctf_id_t type, ctf_visit_f *func,
|
||||
unsigned char *vlen;
|
||||
ssize_t size, increment, vbytes;
|
||||
uint32_t kind, n, i = 0;
|
||||
int nonrepresentable = 0;
|
||||
int rc;
|
||||
|
||||
if ((type = ctf_type_resolve (fp, type)) == CTF_ERR)
|
||||
return -1; /* errno is set for us. */
|
||||
if ((type = ctf_type_resolve (fp, type)) == CTF_ERR) {
|
||||
if (ctf_errno (fp) != ECTF_NONREPRESENTABLE)
|
||||
return -1; /* errno is set for us. */
|
||||
else
|
||||
nonrepresentable = 1;
|
||||
}
|
||||
|
||||
if ((tp = ctf_lookup_by_id (&fp, type)) == NULL)
|
||||
return -1; /* errno is set for us. */
|
||||
if (!nonrepresentable)
|
||||
if ((tp = ctf_lookup_by_id (&fp, type)) == NULL)
|
||||
return -1; /* errno is set for us. */
|
||||
|
||||
if ((rc = func (name, otype, offset, depth, arg)) != 0)
|
||||
return rc;
|
||||
|
||||
kind = LCTF_INFO_KIND (fp, tp->ctt_info);
|
||||
if (!nonrepresentable)
|
||||
kind = LCTF_INFO_KIND (fp, tp->ctt_info);
|
||||
|
||||
if (kind != CTF_K_STRUCT && kind != CTF_K_UNION)
|
||||
if (nonrepresentable || (kind != CTF_K_STRUCT && kind != CTF_K_UNION))
|
||||
return 0;
|
||||
|
||||
ctf_get_ctt_size (fp, tp, &size, &increment);
|
||||
|
Reference in New Issue
Block a user