[llvm-commits] [125850] Fix SingleSource/Regression/C/2--3=-5=21BitfieldHandling failures.
dpatel at apple.com
dpatel at apple.com
Fri Apr 6 19:43:10 PDT 2007
Revision: 125850
Author: dpatel
Date: 2007-04-06 19:43:09 -0700 (Fri, 06 Apr 2007)
Log Message:
-----------
Fix SingleSource/Regression/C/2--3=-5=21BitfieldHandling failures.
Modified Paths:
--------------
apple-local/branches/llvm/gcc/llvm-types.cpp
Modified: apple-local/branches/llvm/gcc/llvm-types.cpp
===================================================================
--- apple-local/branches/llvm/gcc/llvm-types.cpp 2007-04-06 21:26:05 UTC (rev 125849)
+++ apple-local/branches/llvm/gcc/llvm-types.cpp 2007-04-07 02:43:09 UTC (rev 125850)
@@ -846,13 +846,15 @@
const TargetData &TD;
unsigned GCCStructAlignmentInBytes;
bool Packed; // True if struct is packed
+ bool AllBitFields; // True if all struct fields are bit fields
bool LastFieldStartsAtNonByteBoundry;
unsigned ExtraBitsAvailable; // Non-zero if last field is bit field and it
// does not use all allocated bits
StructTypeConversionInfo(TargetMachine &TM, unsigned GCCAlign, bool P)
: TD(*TM.getTargetData()), GCCStructAlignmentInBytes(GCCAlign),
- Packed(P), LastFieldStartsAtNonByteBoundry(false), ExtraBitsAvailable(0) {}
+ Packed(P), AllBitFields(true), LastFieldStartsAtNonByteBoundry(false),
+ ExtraBitsAvailable(0) {}
void lastFieldStartsAtNonByteBoundry(bool value) {
LastFieldStartsAtNonByteBoundry = value;
@@ -866,6 +868,10 @@
Packed = true;
}
+ void allFieldsAreNotBitFields() {
+ AllBitFields = false;
+ }
+
unsigned getGCCStructAlignmentInBytes() const {
return GCCStructAlignmentInBytes;
}
@@ -894,7 +900,7 @@
uint64_t getSizeAsLLVMStruct() const {
if (Elements.empty()) return 0;
unsigned MaxAlign = 1;
- if (!Packed)
+ if (!Packed && !AllBitFields)
for (unsigned i = 0, e = Elements.size(); i != e; ++i)
MaxAlign = std::max(MaxAlign, getTypeAlignment(Elements[i]));
@@ -908,7 +914,7 @@
unsigned NoOfBytesToRemove = ExtraBitsAvailable/8;
- if (!Packed)
+ if (!Packed && !AllBitFields)
return;
if (NoOfBytesToRemove == 0)
@@ -1193,6 +1199,8 @@
return;
}
+ Info.allFieldsAreNotBitFields();
+
// Get the starting offset in the record.
unsigned StartOffsetInBits = getFieldOffsetInBits(Field);
assert((StartOffsetInBits & 7) == 0 && "Non-bit-field has non-byte offset!");
@@ -1289,12 +1297,17 @@
unsigned NumBitsRequired = FieldSizeInBits +
(prevFieldTypeSizeInBits/8 - 1)*8 + StartOffsetFromByteBoundry;
- // If type used to access previous field is not large enough then
- // remove previous field and insert new field that is large enough to
- // hold both fields.
- Info.RemoveFieldsAfter(Info.Elements.size() - 1);
- for (unsigned idx = 0; idx < (prevFieldTypeSizeInBits/8); ++idx)
- FirstUnallocatedByte--;
+ if (NumBitsRequired > 64) {
+ // Use bits from previous field.
+ NumBitsRequired = NumBitsRequired - FirstUnallocatedByte*8;
+ } else {
+ // If type used to access previous field is not large enough then
+ // remove previous field and insert new field that is large enough to
+ // hold both fields.
+ Info.RemoveFieldsAfter(Info.Elements.size() - 1);
+ for (unsigned idx = 0; idx < (prevFieldTypeSizeInBits/8); ++idx)
+ FirstUnallocatedByte--;
+ }
Info.addNewBitField(NumBitsRequired, FirstUnallocatedByte);
// Do this after adding Field.
Info.lastFieldStartsAtNonByteBoundry(true);
More information about the llvm-commits
mailing list