[PATCH] D16843: [Sema] Fix bug in TypeLocBuilder::pushImpl
Akira Hatanaka via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 17 22:33:56 PST 2016
ahatanak added a comment.
OK, I now understand what you meant.
> How about the following?
>
> else if (LocalAlignment == 8) {
> if (NumBytesAtAlign8 == 0) {
> // We have not seen any 8-byte aligned element yet. There is no padding and we are either 4-byte
> // aligned or 8-byte aligned depending on NumBytesAtAlign4.
> // Add in 4 bytes padding if we are not 8-byte aligned including this element.
> if ((LocalSize + NumBytesAtAlign4) % 8 != 0) {
> memmove(&Buffer[Index - 4], &Buffer[Index], NumBytesAtAlign4);
> Index -= 4;
> }
If Capacity is not a multiple of 8, (LocalSize + NumBytesAtAlign4) % 8 doesn't tell you whether the new element will be 8-byte aligned. For example, if Capacity==36, NumBytesAtAlign4==4, and LocalSize==8, (LocalSize + NumBytesAtAlign4) equals 12 but padding is not needed as the new element can start at Index=24. Note that it's possible to have a Capacity that isn't a multiple of 8 by calling TypeLocBuilder::reserve. I think padding is needed if the new index (Index - LocalSize) is not a multiple of 8.
http://reviews.llvm.org/D16843
More information about the cfe-commits
mailing list