[llvm-commits] [126245] Fix http://lists.cs.uiuc.edu/pipermail/llvm-commits/ Week-of-Mon-20070416/047943.html
Duncan Sands
baldrick at free.fr
Tue Apr 17 13:42:06 PDT 2007
Hi Devang, I just posted a fix which fixes some other issues too.
A few lines earlier:
if (StartOffsetFromByteBoundry != 0) {
// New field does not start at byte boundry.
PadBits = StartOffsetInBits - (FirstUnallocatedByte*8);
PadBytes = PadBits/8 + 1;
}
PadBytes += StartOffsetInBits/8-FirstUnallocatedByte;
If StartOffsetFromByteBoundry != 0, then PadBytes gets added to twice,
setting it to 2*PadBits/8 + 1.
> Pad = ArrayType::get(Pad, PadBytes);
> Info.addElement(Pad, FirstUnallocatedByte, PadBytes);
> FirstUnallocatedByte = StartOffsetInBits/8;
> - // This field will use some of the bits from this PadBytes.
> - FieldSizeInBits = FieldSizeInBits - (PadBytes*8 - PadBits);
> + // This field will use some of the bits from this PadBytes, if
> + // starting offset is not at byte boundry.
> + if (StartOffsetFromByteBoundry != 0)
> + FieldSizeInBits = FieldSizeInBits - (8 - PadBits);
Here PadBits can be bigger than 8, which will lead to a bad result :)
Even if it is less than 8 this can create a negative FieldSizeInBits.
For example, if FieldSizeInBits=1, StartOffsetFromByteBoundry=1, then
typically PadBits=1, meaning you are setting FieldSizeInBits to -6 here!
> }
>
> // Now, Field starts at FirstUnallocatedByte and everything is aligned.
Best wishes,
Duncan.
More information about the llvm-commits
mailing list