From 437061996d8d25ba902903e15952cfc14257b839 Mon Sep 17 00:00:00 2001 From: Nick Alcock Date: Tue, 2 Jun 2020 20:25:02 +0100 Subject: [PATCH] libctf, types: allow ctf_type_reference of dynamic slices One spot was missed when we rejigged ctf_update into ctf_serialize and allowed all operations on dynamic containers: ctf_type_reference of slices. A dynamic slice's vlen state is stored in the dtu_slice member, so fetch it from there. libctf/ * ctf-types.c (ctf_type_reference): Add support for dynamic slices. --- libctf/ChangeLog | 4 ++++ libctf/ctf-types.c | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/libctf/ChangeLog b/libctf/ChangeLog index 598b93a0117..8dd6651e07a 100644 --- a/libctf/ChangeLog +++ b/libctf/ChangeLog @@ -1,3 +1,7 @@ +2020-07-22 Nick Alcock + + * ctf-types.c (ctf_type_reference): Add support for dynamic slices. + 2020-07-22 Nick Alcock * ctf-create.c (ctf_serialize): Add cast. diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c index 35253cb3cbc..9c10905ea11 100644 --- a/libctf/ctf-types.c +++ b/libctf/ctf-types.c @@ -680,10 +680,19 @@ ctf_type_reference (ctf_file_t *fp, ctf_id_t type) /* Slices store their type in an unusual place. */ case CTF_K_SLICE: { + ctf_dtdef_t *dtd; const ctf_slice_t *sp; - ssize_t increment; - (void) ctf_get_ctt_size (fp, tp, NULL, &increment); - sp = (const ctf_slice_t *) ((uintptr_t) tp + increment); + + if ((dtd = ctf_dynamic_type (ofp, type)) == NULL) + { + ssize_t increment; + + (void) ctf_get_ctt_size (fp, tp, NULL, &increment); + sp = (const ctf_slice_t *) ((uintptr_t) tp + increment); + } + else + sp = &dtd->dtd_u.dtu_slice; + return sp->cts_type; } default: -- 2.30.2