aboutsummaryrefslogtreecommitdiff
path: root/libctf/ctf-create.c
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2025-03-25 15:11:21 +0000
committerNick Alcock <nick.alcock@oracle.com>2025-03-25 15:11:56 +0000
commite7169428a1166c59c6154034b7ba13373c4036b6 (patch)
tree7b606d1e800f44f22808e103507ba085ec4210f8 /libctf/ctf-create.c
parent1ba11b6f86fcafffc47cd4b55de7c6b7f4bf5a76 (diff)
downloadbinutils-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.c7
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)