From: Ken Dyck Date: Thu, 20 Jan 2011 01:59:55 +0000 (+0000) Subject: Add CharUnits::RoundUpToAlignment() to simplify rounding in character units. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3dbdb58e2e920ad69fecbd56c25b58577ab693e8;p=clang Add CharUnits::RoundUpToAlignment() to simplify rounding in character units. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123868 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/CharUnits.h b/include/clang/AST/CharUnits.h index 1044fb742a..cf909e8822 100644 --- a/include/clang/AST/CharUnits.h +++ b/include/clang/AST/CharUnits.h @@ -16,6 +16,7 @@ #include "llvm/ADT/DenseMapInfo.h" #include "llvm/Support/DataTypes.h" +#include "llvm/Support/MathExtras.h" namespace clang { @@ -142,6 +143,14 @@ namespace clang { /// getQuantity - Get the raw integer representation of this quantity. QuantityType getQuantity() const { return Quantity; } + /// RoundUpToAlignment - Returns the next integer (mod 2**64) that is + /// greater than or equal to this quantity and is a multiple of \arg + /// Align. Align must be non-zero. + CharUnits RoundUpToAlignment(const CharUnits &Align) { + return CharUnits(llvm::RoundUpToAlignment(Quantity, + Align.Quantity)); + } + }; // class CharUnit } // namespace clang diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index 3cf128b8c6..a594a0bb9e 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -900,9 +900,7 @@ CodeGenFunction::GenerateBlockFunction(GlobalDecl GD, const BlockExpr *BExpr, // The runtime needs a minimum alignment of a void *. CharUnits MinAlign = getContext().getTypeAlignInChars(getContext().VoidPtrTy); - BlockOffset = CharUnits::fromQuantity( - llvm::RoundUpToAlignment(BlockOffset.getQuantity(), - MinAlign.getQuantity())); + BlockOffset = BlockOffset.RoundUpToAlignment(MinAlign); Info.BlockSize = BlockOffset; Info.BlockAlign = BlockAlign; @@ -917,8 +915,7 @@ CharUnits BlockFunction::getBlockOffset(CharUnits Size, CharUnits Align) { CharUnits OldOffset = BlockOffset; // Ensure proper alignment, even if it means we have to have a gap - BlockOffset = CharUnits::fromQuantity( - llvm::RoundUpToAlignment(BlockOffset.getQuantity(), Align.getQuantity())); + BlockOffset = BlockOffset.RoundUpToAlignment(Align); BlockAlign = std::max(Align, BlockAlign); CharUnits Pad = BlockOffset - OldOffset;