diff --git a/ld/ChangeLog b/ld/ChangeLog index 470e446ad5f..c613b398046 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,7 @@ +2021-10-25 Nick Alcock + + * testsuite/ld-ctf/nonrepresentable-member.*: New test. + 2021-10-25 Nick Alcock * testsuite/ld-ctf/array.d: Change --ctf=.ctf to --ctf. diff --git a/ld/testsuite/ld-ctf/nonrepresentable-member.c b/ld/testsuite/ld-ctf/nonrepresentable-member.c new file mode 100644 index 00000000000..b3657af01e1 --- /dev/null +++ b/ld/testsuite/ld-ctf/nonrepresentable-member.c @@ -0,0 +1,7 @@ +struct blah +{ + int boring; + int __attribute__((vector_size(8))) foo; + const int __attribute__((vector_size(8))) bar; + int this_is_printed; +} wibble __attribute__((__used__)); diff --git a/ld/testsuite/ld-ctf/nonrepresentable-member.d b/ld/testsuite/ld-ctf/nonrepresentable-member.d new file mode 100644 index 00000000000..6c76253a8c1 --- /dev/null +++ b/ld/testsuite/ld-ctf/nonrepresentable-member.d @@ -0,0 +1,25 @@ +#as: +#source: nonrepresentable-member.c +#objdump: --ctf +#ld: -shared +#name: Nonrepresentable members + +.*: +file format .* + +Contents of CTF section .ctf: + + Header: + Magic number: 0xdff2 + Version: 4 \(CTF_VERSION_3\) +#... + Types: +#... + 0x[0-9a-f]*: \(kind 6\) struct blah .* + *\[0x0\] boring: ID 0x[0-9a-f]*: \(kind 1\) int .* + *\[0x[0-9a-f]*\] foo: .* \(.*represent.*\) + *\[0x[0-9a-f]*\] bar: .* \(.*represent.*\) + *\[0x[0-9a-f]*\] this_is_printed: ID 0x[0-9a-f]*: \(kind 1\) int .* +#... + + Strings: +#... diff --git a/libctf/ChangeLog b/libctf/ChangeLog index 879e128126a..245987fdf42 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,3 +1,7 @@ +2021-10-25 Nick Alcock + + * ctf-types.c (ctf_type_rvisit): Handle nonrepresentable types. + 2021-10-25 Nick Alcock * ctf-dump.c (ctf_dump_type): Do not abort on error. diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c index 243de9348d3..55834856da9 100644 --- a/libctf/ctf-types.c +++ b/libctf/ctf-types.c @@ -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);