aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libctf/ChangeLog7
-rw-r--r--libctf/ctf-create.c9
-rw-r--r--libctf/ctf-types.c9
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;