aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libctf/ChangeLog5
-rw-r--r--libctf/ctf-types.c22
2 files changed, 26 insertions, 1 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index 8f41ece..74dfbef 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,3 +1,8 @@
+2019-08-09 Nick Alcock <nick.alcock@oracle.com>
+
+ * ctf-types.c (ctf_type_encoding): Fix the dynamic case to
+ work right for non-int/fps.
+
2019-08-08 Nick Alcock <nick.alcock@oracle.com>
* ctf-types.c (ctf_type_name): Don't strlen a potentially-
diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c
index ec221d7..27cbfb9 100644
--- a/libctf/ctf-types.c
+++ b/libctf/ctf-types.c
@@ -739,7 +739,27 @@ ctf_type_encoding (ctf_file_t *fp, ctf_id_t type, ctf_encoding_t *ep)
if ((dtd = ctf_dynamic_type (ofp, type)) != NULL)
{
- *ep = dtd->dtd_u.dtu_enc;
+ switch (LCTF_INFO_KIND (fp, tp->ctt_info))
+ {
+ case CTF_K_INTEGER:
+ case CTF_K_FLOAT:
+ *ep = dtd->dtd_u.dtu_enc;
+ break;
+ case CTF_K_SLICE:
+ {
+ const ctf_slice_t *slice;
+ ctf_encoding_t underlying_en;
+ slice = &dtd->dtd_u.dtu_slice;
+
+ 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;
+ break;
+ }
+ default:
+ return (ctf_set_errno (ofp, ECTF_NOTINTFP));
+ }
return 0;
}