forked from OSchip/llvm-project
Add a helper function, ASTContext::toBits(), that converts sizes in
CharUnits to sizes in bits, and use it to tidy up the places where the conversion was done explicitly. llvm-svn: 125332
This commit is contained in:
parent
a759d72d7b
commit
b0fcc59e19
|
@ -1015,6 +1015,9 @@ public:
|
|||
/// toCharUnitsFromBits - Convert a size in bits to a size in characters.
|
||||
CharUnits toCharUnitsFromBits(int64_t BitSize) const;
|
||||
|
||||
/// toBits - Convert a size in characters to a size in bits.
|
||||
int64_t toBits(CharUnits CharSize) const;
|
||||
|
||||
/// getTypeSizeInChars - Return the size of the specified type, in characters.
|
||||
/// This method does not work on incomplete types.
|
||||
CharUnits getTypeSizeInChars(QualType T) const;
|
||||
|
|
|
@ -847,7 +847,7 @@ ASTContext::getTypeInfo(const Type *T) const {
|
|||
case Type::ObjCInterface: {
|
||||
const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T);
|
||||
const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
|
||||
Width = Layout.getSize().getQuantity() * getCharWidth();
|
||||
Width = toBits(Layout.getSize());
|
||||
Align = Layout.getAlignment();
|
||||
break;
|
||||
}
|
||||
|
@ -866,7 +866,7 @@ ASTContext::getTypeInfo(const Type *T) const {
|
|||
|
||||
const RecordType *RT = cast<RecordType>(TT);
|
||||
const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl());
|
||||
Width = Layout.getSize().getQuantity() * getCharWidth();
|
||||
Width = toBits(Layout.getSize());
|
||||
Align = Layout.getAlignment();
|
||||
break;
|
||||
}
|
||||
|
@ -923,6 +923,11 @@ CharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const {
|
|||
return CharUnits::fromQuantity(BitSize / getCharWidth());
|
||||
}
|
||||
|
||||
/// toBits - Convert a size in characters to a size in characters.
|
||||
int64_t ASTContext::toBits(CharUnits CharSize) const {
|
||||
return CharSize.getQuantity() * getCharWidth();
|
||||
}
|
||||
|
||||
/// getTypeSizeInChars - Return the size of the specified type, in characters.
|
||||
/// This method does not work on incomplete types.
|
||||
CharUnits ASTContext::getTypeSizeInChars(QualType T) const {
|
||||
|
|
|
@ -616,11 +616,6 @@ protected:
|
|||
DataSize(0), NonVirtualSize(0), NonVirtualAlignment(8), PrimaryBase(0),
|
||||
PrimaryBaseIsVirtual(false), FirstNearlyEmptyVBase(0) { }
|
||||
|
||||
// FIXME: Remove this.
|
||||
uint64_t toOffset(CharUnits Offset) const {
|
||||
return Offset.getQuantity() * Context.getCharWidth();
|
||||
}
|
||||
|
||||
void Layout(const RecordDecl *D);
|
||||
void Layout(const CXXRecordDecl *D);
|
||||
void Layout(const ObjCInterfaceDecl *D);
|
||||
|
@ -1091,14 +1086,13 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {
|
|||
// If we have an empty base class, try to place it at offset 0.
|
||||
if (Base->Class->isEmpty() &&
|
||||
EmptySubobjects->CanPlaceBaseAtOffset(Base, CharUnits::Zero())) {
|
||||
Size = std::max(Size,
|
||||
Layout.getSize().getQuantity() * Context.getCharWidth());
|
||||
uint64_t RecordSizeInBits = Context.toBits(Layout.getSize());
|
||||
Size = std::max(Size, RecordSizeInBits);
|
||||
|
||||
return CharUnits::Zero();
|
||||
}
|
||||
|
||||
unsigned UnpackedBaseAlign =
|
||||
Layout.getNonVirtualAlign().getQuantity() * Context.getCharWidth();
|
||||
unsigned UnpackedBaseAlign = Context.toBits(Layout.getNonVirtualAlign());
|
||||
unsigned BaseAlign = (Packed) ? 8 : UnpackedBaseAlign;
|
||||
|
||||
// The maximum field alignment overrides base align.
|
||||
|
@ -1117,13 +1111,11 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {
|
|||
|
||||
if (!Base->Class->isEmpty()) {
|
||||
// Update the data size.
|
||||
DataSize = Offset +
|
||||
(Layout.getNonVirtualSize().getQuantity() * Context.getCharWidth());
|
||||
DataSize = Offset + Context.toBits(Layout.getNonVirtualSize());
|
||||
|
||||
Size = std::max(Size, DataSize);
|
||||
} else
|
||||
Size = std::max(Size,
|
||||
Offset + (Layout.getSize().getQuantity() * Context.getCharWidth()));
|
||||
Size = std::max(Size, Offset + Context.toBits(Layout.getSize()));
|
||||
|
||||
// Remember max struct/class alignment.
|
||||
UpdateAlignment(BaseAlign, UnpackedBaseAlign);
|
||||
|
@ -1885,7 +1877,7 @@ void ASTContext::DumpRecordLayout(const RecordDecl *RD,
|
|||
RD->dump();
|
||||
OS << "\nLayout: ";
|
||||
OS << "<ASTRecordLayout\n";
|
||||
OS << " Size:" << Info.getSize().getQuantity() * getCharWidth() << "\n";
|
||||
OS << " Size:" << toBits(Info.getSize()) << "\n";
|
||||
OS << " DataSize:" << Info.getDataSize() << "\n";
|
||||
OS << " Alignment:" << Info.getAlignment() << "\n";
|
||||
OS << " FieldOffsets: [";
|
||||
|
|
|
@ -394,8 +394,7 @@ bool ConstStructBuilder::Build(InitListExpr *ILE) {
|
|||
}
|
||||
|
||||
// Append tail padding if necessary.
|
||||
AppendTailPadding(
|
||||
Layout.getSize().getQuantity() * CGM.getContext().getCharWidth());
|
||||
AppendTailPadding(CGM.getContext().toBits(Layout.getSize()));
|
||||
|
||||
assert(Layout.getSize().getQuantity() == NextFieldOffsetInBytes &&
|
||||
"Tail padding mismatch!");
|
||||
|
|
|
@ -131,8 +131,7 @@ LValue CGObjCRuntime::EmitValueForIvarAtOffset(CodeGen::CodeGenFunction &CGF,
|
|||
// a synthesized ivar can never be a bit-field, so this is safe.
|
||||
const ASTRecordLayout &RL =
|
||||
CGF.CGM.getContext().getASTObjCInterfaceLayout(OID);
|
||||
uint64_t TypeSizeInBits =
|
||||
RL.getSize().getQuantity() * CGF.CGM.getContext().getCharWidth();
|
||||
uint64_t TypeSizeInBits = CGF.CGM.getContext().toBits(RL.getSize());
|
||||
uint64_t FieldBitOffset = LookupFieldBitOffset(CGF.CGM, OID, 0, Ivar);
|
||||
uint64_t BitOffset = FieldBitOffset % 8;
|
||||
uint64_t ContainingTypeAlign = 8;
|
||||
|
|
|
@ -300,8 +300,7 @@ CGBitFieldInfo CGBitFieldInfo::MakeInfo(CodeGenTypes &Types,
|
|||
uint64_t FieldSize) {
|
||||
const RecordDecl *RD = FD->getParent();
|
||||
const ASTRecordLayout &RL = Types.getContext().getASTRecordLayout(RD);
|
||||
uint64_t ContainingTypeSizeInBits =
|
||||
RL.getSize().getQuantity() * Types.getContext().getCharWidth();
|
||||
uint64_t ContainingTypeSizeInBits = Types.getContext().toBits(RL.getSize());
|
||||
unsigned ContainingTypeAlign = RL.getAlignment();
|
||||
|
||||
return MakeInfo(Types, FD, FieldOffset, FieldSize, ContainingTypeSizeInBits,
|
||||
|
@ -689,8 +688,7 @@ bool CGRecordLayoutBuilder::LayoutFields(const RecordDecl *D) {
|
|||
}
|
||||
|
||||
// Append tail padding if necessary.
|
||||
AppendTailPadding(
|
||||
Layout.getSize().getQuantity() * Types.getContext().getCharWidth());
|
||||
AppendTailPadding(Types.getContext().toBits(Layout.getSize()));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -855,8 +853,7 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D) {
|
|||
// Verify that the computed LLVM struct size matches the AST layout size.
|
||||
const ASTRecordLayout &Layout = getContext().getASTRecordLayout(D);
|
||||
|
||||
uint64_t TypeSizeInBits =
|
||||
Layout.getSize().getQuantity() * getContext().getCharWidth();
|
||||
uint64_t TypeSizeInBits = getContext().toBits(Layout.getSize());
|
||||
assert(TypeSizeInBits == getTargetData().getTypeAllocSizeInBits(Ty) &&
|
||||
"Type size mismatch!");
|
||||
|
||||
|
@ -867,7 +864,7 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D) {
|
|||
NonVirtualSize.RoundUpToAlignment(NonVirtualAlign);
|
||||
|
||||
uint64_t AlignedNonVirtualTypeSizeInBits =
|
||||
AlignedNonVirtualTypeSize.getQuantity() * getContext().getCharWidth();
|
||||
getContext().toBits(AlignedNonVirtualTypeSize);
|
||||
|
||||
assert(AlignedNonVirtualTypeSizeInBits ==
|
||||
getTargetData().getTypeAllocSizeInBits(BaseTy) &&
|
||||
|
|
Loading…
Reference in New Issue