[cfe-commits] r70775 - /cfe/trunk/lib/CodeGen/CGObjCMac.cpp
Daniel Dunbar
daniel at zuster.org
Sun May 3 06:44:43 PDT 2009
Author: ddunbar
Date: Sun May 3 08:44:42 2009
New Revision: 70775
URL: http://llvm.org/viewvc/llvm-project?rev=70775&view=rev
Log:
Add constructors for GC_IVAR and SKIP_SCAN, tighten up uses.
Lift up a size calculation and note some asymmetries.
Modified:
cfe/trunk/lib/CodeGen/CGObjCMac.cpp
Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=70775&r1=70774&r2=70775&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Sun May 3 08:44:42 2009
@@ -709,9 +709,10 @@
// FIXME - accessibility
class GC_IVAR {
public:
- unsigned int ivar_bytepos;
- unsigned int ivar_size;
- GC_IVAR() : ivar_bytepos(0), ivar_size(0) {}
+ unsigned ivar_bytepos;
+ unsigned ivar_size;
+ GC_IVAR(unsigned bytepos = 0, unsigned size = 0)
+ : ivar_bytepos(bytepos), ivar_size(size) {}
// Allow sorting based on byte pos.
bool operator<(const GC_IVAR &b) const {
@@ -720,10 +721,11 @@
};
class SKIP_SCAN {
- public:
- unsigned int skip;
- unsigned int scan;
- SKIP_SCAN() : skip(0), scan(0) {}
+ public:
+ unsigned skip;
+ unsigned scan;
+ SKIP_SCAN(unsigned _skip = 0, unsigned _scan = 0)
+ : skip(_skip), scan(_scan) {}
};
protected:
@@ -2998,19 +3000,12 @@
for (int FirstIndex = IvarsInfo.size() - 1,
FirstSkIndex = SkipIvars.size() - 1 ;ElIx < ElCount; ElIx++) {
uint64_t Size = CGM.getContext().getTypeSize(RT)/ByteSizeInBits;
- for (int i = OldIndex+1; i <= FirstIndex; ++i) {
- GC_IVAR gcivar;
- gcivar.ivar_bytepos = IvarsInfo[i].ivar_bytepos + Size*ElIx;
- gcivar.ivar_size = IvarsInfo[i].ivar_size;
- IvarsInfo.push_back(gcivar);
- }
-
- for (int i = OldSkIndex+1; i <= FirstSkIndex; ++i) {
- GC_IVAR skivar;
- skivar.ivar_bytepos = SkipIvars[i].ivar_bytepos + Size*ElIx;
- skivar.ivar_size = SkipIvars[i].ivar_size;
- SkipIvars.push_back(skivar);
- }
+ for (int i = OldIndex+1; i <= FirstIndex; ++i)
+ IvarsInfo.push_back(GC_IVAR(IvarsInfo[i].ivar_bytepos + Size*ElIx,
+ IvarsInfo[i].ivar_size));
+ for (int i = OldSkIndex+1; i <= FirstSkIndex; ++i)
+ SkipIvars.push_back(GC_IVAR(SkipIvars[i].ivar_bytepos + Size*ElIx,
+ SkipIvars[i].ivar_size));
}
continue;
}
@@ -3032,37 +3027,36 @@
}
} while (true);
+ unsigned FieldSize = CGM.getContext().getTypeSize(Field->getType());
if ((ForStrongLayout && GCAttr == QualType::Strong)
|| (!ForStrongLayout && GCAttr == QualType::Weak)) {
if (IsUnion) {
- uint64_t UnionIvarSize = CGM.getContext().getTypeSize(Field->getType())
- / WordSizeInBits;
+ uint64_t UnionIvarSize = FieldSize / WordSizeInBits;
if (UnionIvarSize > MaxUnionIvarSize) {
MaxUnionIvarSize = UnionIvarSize;
MaxField = Field;
}
} else {
- GC_IVAR gcivar;
- gcivar.ivar_bytepos = BytePos + GetFieldBaseOffset(OI, Layout, Field);
- gcivar.ivar_size = CGM.getContext().getTypeSize(Field->getType()) /
- WordSizeInBits;
- IvarsInfo.push_back(gcivar);
+ IvarsInfo.push_back(GC_IVAR(BytePos + GetFieldBaseOffset(OI, Layout,
+ Field),
+ FieldSize / WordSizeInBits));
}
} else if ((ForStrongLayout &&
(GCAttr == QualType::GCNone || GCAttr == QualType::Weak))
|| (!ForStrongLayout && GCAttr != QualType::Weak)) {
if (IsUnion) {
- uint64_t UnionIvarSize = CGM.getContext().getTypeSize(Field->getType());
+ // FIXME: Why the asymmetry? We divide by word size in bits on
+ // other side.
+ uint64_t UnionIvarSize = FieldSize;
if (UnionIvarSize > MaxSkippedUnionIvarSize) {
MaxSkippedUnionIvarSize = UnionIvarSize;
MaxSkippedField = Field;
}
} else {
- GC_IVAR skivar;
- skivar.ivar_bytepos = BytePos + GetFieldBaseOffset(OI, Layout, Field);
- skivar.ivar_size = CGM.getContext().getTypeSize(Field->getType()) /
- ByteSizeInBits;
- SkipIvars.push_back(skivar);
+ // FIXME: Why the asymmetry, we divide by byte size in bits here?
+ SkipIvars.push_back(GC_IVAR(BytePos + GetFieldBaseOffset(OI, Layout,
+ Field),
+ FieldSize / ByteSizeInBits));
}
}
}
@@ -3079,20 +3073,14 @@
SkipIvars.push_back(skivar);
}
- if (MaxField) {
- GC_IVAR gcivar;
- gcivar.ivar_bytepos = BytePos + GetFieldBaseOffset(OI, Layout, MaxField);
- gcivar.ivar_size = MaxUnionIvarSize;
- IvarsInfo.push_back(gcivar);
- }
-
- if (MaxSkippedField) {
- GC_IVAR skivar;
- skivar.ivar_bytepos = BytePos +
- GetFieldBaseOffset(OI, Layout, MaxSkippedField);
- skivar.ivar_size = MaxSkippedUnionIvarSize;
- SkipIvars.push_back(skivar);
- }
+ if (MaxField)
+ IvarsInfo.push_back(GC_IVAR(BytePos + GetFieldBaseOffset(OI, Layout,
+ MaxField),
+ MaxUnionIvarSize));
+ if (MaxSkippedField)
+ SkipIvars.push_back(GC_IVAR(BytePos + GetFieldBaseOffset(OI, Layout,
+ MaxSkippedField),
+ MaxSkippedUnionIvarSize));
}
/// BuildIvarLayout - Builds ivar layout bitmap for the class
More information about the cfe-commits
mailing list