diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-05-24 07:25:24 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-05-24 07:25:24 -0700 |
commit | 7b39d691a0fa1cffb2553237318c224d91bb9407 (patch) | |
tree | af831a63ba71960c3b61cc38c9b0394931313f53 /args.c | |
parent | fd37633953e63ac317b3dfd663f5cb0659d0aceb (diff) | |
download | txr-7b39d691a0fa1cffb2553237318c224d91bb9407.tar.gz txr-7b39d691a0fa1cffb2553237318c224d91bb9407.tar.bz2 txr-7b39d691a0fa1cffb2553237318c224d91bb9407.zip |
ffi: reproduce odd GNU C behavior for aligned bitfields.
We've already taken care of imitating the situation that GNU
C allows __attribute__((aligned(n))) to weaken the alignment
of a bitfield, contrary to it being documented that align only
strengthens alignment. Even a value of n == 1 is meaningful
in that it can cause the bitfield to start allocating from
a new byte.
This patch corrects a newly discovered nuance: when a bitfield
is attributed with a weaker alignment than its underlying
type (e.g. uint32_t field marked with 2 byte alignment),
the original type's alignment is still in effect for calculating
the alignment of the structure, and the padding.
* ffi.c (struct txr_ffi_type): New member oalign, for keeping
track of the type's original alignment, prior to adjustment.
(make_ffi_type_struct): For a named bitfield, take the oalign
value into account when determining the most strict member
alignment.
(ffi_type_compile): When marking a type as aligned, the
we remember the original alignment in atft->oalign.
* tests/017/bitfields.tl: New test case, struct s16.
* txr.1: Documented.
Diffstat (limited to 'args.c')
0 files changed, 0 insertions, 0 deletions