diff options
-rw-r--r-- | lib/AST/ExprConstant.cpp | 21 | ||||
-rw-r--r-- | lib/AST/RecordLayoutBuilder.cpp | 7 |
2 files changed, 11 insertions, 17 deletions
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index cb73810163..f262a4acff 100644 --- a/lib/AST/ExprConstant.cpp +++ b/lib/AST/ExprConstant.cpp @@ -404,8 +404,7 @@ bool LValueExprEvaluator::VisitMemberExpr(MemberExpr *E) { break; } - Result.Offset += - CharUnits::fromQuantity(RL.getFieldOffset(i) / Info.Ctx.getCharWidth()); + Result.Offset += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i)); return true; } @@ -574,7 +573,7 @@ bool PointerExprEvaluator::VisitCastExpr(CastExpr* E) { Result.Base = BaseLV.getLValueBase(); Result.Offset = BaseLV.getLValueOffset() + - CharUnits::fromQuantity(Offset / Info.Ctx.getCharWidth()); + Info.Ctx.toCharUnitsFromBits(Offset); return true; } @@ -1481,12 +1480,9 @@ CharUnits IntExprEvaluator::GetAlignOfType(QualType T) { if (const ReferenceType *Ref = T->getAs<ReferenceType>()) T = Ref->getPointeeType(); - // Get information about the alignment. - unsigned CharSize = Info.Ctx.Target.getCharWidth(); - // __alignof is defined to return the preferred alignment. - return CharUnits::fromQuantity( - Info.Ctx.getPreferredTypeAlign(T.getTypePtr()) / CharSize); + return Info.Ctx.toCharUnitsFromBits( + Info.Ctx.getPreferredTypeAlign(T.getTypePtr())); } CharUnits IntExprEvaluator::GetAlignOfExpr(const Expr *E) { @@ -1578,8 +1574,7 @@ bool IntExprEvaluator::VisitOffsetOfExpr(const OffsetOfExpr *E) { break; } assert(i < RL.getFieldCount() && "offsetof field in wrong type"); - Result += CharUnits::fromQuantity( - RL.getFieldOffset(i) / Info.Ctx.getCharWidth()); + Result += Info.Ctx.toCharUnitsFromBits(RL.getFieldOffset(i)); CurrentType = MemberDecl->getType().getNonReferenceType(); break; } @@ -1607,9 +1602,9 @@ bool IntExprEvaluator::VisitOffsetOfExpr(const OffsetOfExpr *E) { return false; // Add the offset to the base. - Result += CharUnits::fromQuantity( - RL.getBaseClassOffsetInBits(cast<CXXRecordDecl>(BaseRT->getDecl())) - / Info.Ctx.getCharWidth()); + Result += Info.Ctx.toCharUnitsFromBits( + RL.getBaseClassOffsetInBits( + cast<CXXRecordDecl>(BaseRT->getDecl()))); break; } } diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 7b5ed4ad16..c433ca488c 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -98,7 +98,7 @@ class EmptySubobjectMap { assert(FieldOffset % CharWidth == 0 && "Field offset not at char boundary!"); - return CharUnits::fromQuantity(FieldOffset / CharWidth); + return toCharUnits(FieldOffset); } // FIXME: Remove this. @@ -623,7 +623,7 @@ protected: // FIXME: Remove these. CharUnits toCharUnits(uint64_t Offset) const { - return CharUnits::fromQuantity(Offset / Context.getCharWidth()); + return Context.toCharUnitsFromBits(Offset); } uint64_t toOffset(CharUnits Offset) const { return Offset.getQuantity() * Context.getCharWidth(); @@ -1806,8 +1806,7 @@ static void DumpCXXRecordLayout(llvm::raw_ostream &OS, E = RD->field_end(); I != E; ++I, ++FieldNo) { const FieldDecl *Field = *I; CharUnits FieldOffset = Offset + - CharUnits::fromQuantity(Layout.getFieldOffset(FieldNo) / - C.getCharWidth()); + C.toCharUnitsFromBits(Layout.getFieldOffset(FieldNo)); if (const RecordType *RT = Field->getType()->getAs<RecordType>()) { if (const CXXRecordDecl *D = dyn_cast<CXXRecordDecl>(RT->getDecl())) { |