[PATCH] D16843: [Sema] Fix bug in TypeLocBuilder::pushImpl
Manman Ren via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 17 15:42:20 PST 2016
manmanren added a comment.
Hi Akira,
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;
}
} else {
unsigned Padding = NumBytesAtAlign4 % 8;
if (Padding == 0) {
if (LocalSize % 8 == 0) {
// Everything is set: there's no padding and we don't need to add
// any.
} else {
assert(LocalSize % 8 == 4);
// No existing padding; add in 4 bytes padding
memmove(&Buffer[Index - 4], &Buffer[Index], NumBytesAtAlign4);
Index -= 4;
}
} else {
assert(Padding == 4);
if (LocalSize % 8 == 0) {
// Everything is set: there's 4 bytes padding and we don't need
// to add any.
} else {
assert(LocalSize % 8 == 4);
// There are 4 bytes padding, but we don't need any; remove it.
memmove(&Buffer[Index + 4], &Buffer[Index], NumBytesAtAlign4);
Index += 4;
}
}
}
// Forget about any padding.
NumBytesAtAlign4 = 0;
NumBytesAtAlign8 += LocalSize;
}
Note that the handling of NumBytesAtAlign8 != 0 is the same for LocalAlignment == 4 vs. LocalAlignment == 8.
Also mention in the commit message that the original code seems to assume LocalSize is a multiple of 8 when LocalAlignment is 8.
Cheers,
Manman
http://reviews.llvm.org/D16843
More information about the cfe-commits
mailing list