diff options
-rw-r--r-- | libctf/ChangeLog | 7 | ||||
-rw-r--r-- | libctf/ctf-create.c | 9 | ||||
-rw-r--r-- | libctf/ctf-types.c | 9 |
3 files changed, 22 insertions, 3 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog index 0aee504..78f8f7e 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,5 +1,12 @@ 2020-07-22 Nick Alcock <nick.alcock@oracle.com> + * ctf-create.c (ctf_add_slice): Support slices of any kind that + resolves to an integral type. + * ctf-types.c (ctf_type_encoding): Resolve the type before + fishing its encoding out. + +2020-07-22 Nick Alcock <nick.alcock@oracle.com> + * ctf-create.c (ctf_create): Mark dirty. 2020-07-22 Nick Alcock <nick.alcock@oracle.com> diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c index 1416d18..c13b83d 100644 --- a/libctf/ctf-create.c +++ b/libctf/ctf-create.c @@ -944,6 +944,7 @@ ctf_add_slice (ctf_file_t *fp, uint32_t flag, ctf_id_t ref, const ctf_encoding_t *ep) { ctf_dtdef_t *dtd; + ctf_id_t resolved_ref = ref; ctf_id_t type; int kind; const ctf_type_t *tp; @@ -961,7 +962,13 @@ ctf_add_slice (ctf_file_t *fp, uint32_t flag, ctf_id_t ref, if (ref != 0 && ((tp = ctf_lookup_by_id (&tmp, ref)) == NULL)) return CTF_ERR; /* errno is set for us. */ - kind = ctf_type_kind_unsliced (tmp, ref); + /* Make sure we ultimately point to an integral type. We also allow slices to + point to the unimplemented type, for now, because the compiler can emit + such slices, though they're not very much use. */ + + resolved_ref = ctf_type_resolve_unsliced (tmp, ref); + kind = ctf_type_kind_unsliced (tmp, resolved_ref); + if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) && (kind != CTF_K_ENUM) && (ref != 0)) diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c index 9c10905..f5a1fc0 100644 --- a/libctf/ctf-types.c +++ b/libctf/ctf-types.c @@ -758,9 +758,12 @@ ctf_type_encoding (ctf_file_t *fp, ctf_id_t type, ctf_encoding_t *ep) { const ctf_slice_t *slice; ctf_encoding_t underlying_en; + ctf_id_t underlying; + slice = &dtd->dtd_u.dtu_slice; + underlying = ctf_type_resolve (fp, slice->cts_type); + data = ctf_type_encoding (fp, underlying, &underlying_en); - data = ctf_type_encoding (fp, slice->cts_type, &underlying_en); ep->cte_format = underlying_en.cte_format; ep->cte_offset = slice->cts_offset; ep->cte_bits = slice->cts_bits; @@ -792,9 +795,11 @@ ctf_type_encoding (ctf_file_t *fp, ctf_id_t type, ctf_encoding_t *ep) { const ctf_slice_t *slice; ctf_encoding_t underlying_en; + ctf_id_t underlying; slice = (ctf_slice_t *) ((uintptr_t) tp + increment); - data = ctf_type_encoding (fp, slice->cts_type, &underlying_en); + underlying = ctf_type_resolve (fp, slice->cts_type); + data = ctf_type_encoding (fp, underlying, &underlying_en); ep->cte_format = underlying_en.cte_format; ep->cte_offset = slice->cts_offset; |