summaryrefslogtreecommitdiff
path: root/libctf/ctf-types.c
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2020-06-02 20:43:03 +0100
committerNick Alcock <nick.alcock@oracle.com>2020-07-22 17:57:31 +0100
commit502e838ed9657ee74cdb4f53798e1468004c9524 (patch)
tree6571863adaa1fe7e0b450b7b104ced7a7391abe6 /libctf/ctf-types.c
parentdd987f004301f6a737fcd431a9ae14d2fc2675bf (diff)
downloadbinutils-gdb-502e838ed9657ee74cdb4f53798e1468004c9524.tar.gz
libctf, types: support slices of anything terminating in an int
It is perfectly valid C to say e.g. typedef u64 int; struct foo_t { const volatile u64 wibble:2; }; i.e. bitfields have to be integral types, but they can be cv-qualified integral types or typedefs of same, etc. This is easy to fix: do a ctf_type_resolve_unsliced() at creation time to ensure the ultimate type is integral, and ctf_type_resolve() at lookup time so that if you somehow have e.g. a slice of a typedef of a slice of a cv-qualified int, we pull the encoding that the topmost slice is based on out of the subsidiary slice (and then modify it), not out of the underlying int. (This last bit is rather academic right now, since all slices override exactly the same properties of the underlying type, but it's still the right thing to do.) libctf/ * 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.
Diffstat (limited to 'libctf/ctf-types.c')
-rw-r--r--libctf/ctf-types.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/libctf/ctf-types.c b/libctf/ctf-types.c
index 9c10905ea11..f5a1fc0ae12 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;