//===- TypeSize.h - Wrapper around type sizes -------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file provides a struct that can be used to query the size of IR types // which may be scalable vectors. It provides convenience operators so that // it can be used in much the same way as a single scalar value. // //===----------------------------------------------------------------------===// #ifndef LLVM_SUPPORT_TYPESIZE_H #define LLVM_SUPPORT_TYPESIZE_H #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> #include <cassert> #include <cstdint> #include <type_traits> namespace llvm { /// Reports a diagnostic message to indicate an invalid size request has been /// done on a scalable vector. This function may not return. void reportInvalidSizeRequest(const char *Msg); /// StackOffset holds a fixed and a scalable offset in bytes. class StackOffset { … }; namespace details { // Base class for ElementCount and TypeSize below. template <typename LeafTy, typename ValueTy> class FixedOrScalableQuantity { … }; } // namespace details // Stores the number of elements for a type and whether this type is fixed // (N-Elements) or scalable (e.g., SVE). // - ElementCount::getFixed(1) : A scalar value. // - ElementCount::getFixed(2) : A vector type holding 2 values. // - ElementCount::getScalable(4) : A scalable vector type holding 4 values. class ElementCount : public details::FixedOrScalableQuantity<ElementCount, unsigned> { … }; // Stores the size of a type. If the type is of fixed size, it will represent // the exact size. If the type is a scalable vector, it will represent the known // minimum size. class TypeSize : public details::FixedOrScalableQuantity<TypeSize, uint64_t> { … }; //===----------------------------------------------------------------------===// // Utilities //===----------------------------------------------------------------------===// /// Returns a TypeSize with a known minimum size that is the next integer /// (mod 2**64) that is greater than or equal to \p Quantity and is a multiple /// of \p Align. \p Align must be non-zero. /// /// Similar to the alignTo functions in MathExtras.h inline constexpr TypeSize alignTo(TypeSize Size, uint64_t Align) { … } /// Stream operator function for `FixedOrScalableQuantity`. template <typename LeafTy, typename ScalarTy> inline raw_ostream & operator<<(raw_ostream &OS, const details::FixedOrScalableQuantity<LeafTy, ScalarTy> &PS) { … } template <> struct DenseMapInfo<ElementCount, void> { … }; } // end namespace llvm #endif // LLVM_SUPPORT_TYPESIZE_H