diff options
author | Nick Alcock <nick.alcock@oracle.com> | 2025-03-25 15:11:21 +0000 |
---|---|---|
committer | Nick Alcock <nick.alcock@oracle.com> | 2025-03-25 15:11:56 +0000 |
commit | e7169428a1166c59c6154034b7ba13373c4036b6 (patch) | |
tree | 7b606d1e800f44f22808e103507ba085ec4210f8 /libctf/ctf-create.c | |
parent | 1ba11b6f86fcafffc47cd4b55de7c6b7f4bf5a76 (diff) | |
download | binutils-e7169428a1166c59c6154034b7ba13373c4036b6.zip binutils-e7169428a1166c59c6154034b7ba13373c4036b6.tar.gz binutils-e7169428a1166c59c6154034b7ba13373c4036b6.tar.bz2 |
libctf: create: get the bit offset right for initial struct members and unions
Even initial struct members and union members can be bitfields: the bit
width shouldn't be simply ignored for them.
Diffstat (limited to 'libctf/ctf-create.c')
-rw-r--r-- | libctf/ctf-create.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c index 9b80c11..7e357d0 100644 --- a/libctf/ctf-create.c +++ b/libctf/ctf-create.c @@ -1774,12 +1774,17 @@ ctf_add_member_bitfield (ctf_dict_t *fp, ctf_id_t souid, const char *name, vlen = LCTF_VLEN (fp, prefix); memb = (ctf_member_t *) dtd->dtd_vlen; + bit_offset = off; - memb[vlen].ctm_offset = CTF_MEMBER_MAKE_BIT_OFFSET (bit_width, off); ssize = ctf_get_ctt_size (fp, prefix, NULL, NULL); ssize = MAX (ssize, ((signed) ((bit_offset + dtd->dtd_last_offset)) / CHAR_BIT) + msize); } + if (kflag) + memb[vlen].ctm_offset = CTF_MEMBER_MAKE_BIT_OFFSET (bit_width, bit_offset); + else + memb[vlen].ctm_offset = bit_offset; + vlen = LCTF_VLEN (fp, prefix); if (ctf_grow_vlen (fp, dtd, sizeof (ctf_member_t) * (vlen + 1)) < 0) |