Author: Sam McCall Date: 2020-03-27T22:40:21+01:00 New Revision: 6b3bedec999a57015339fa5eed276710e87cbb0f
URL: https://github.com/llvm/llvm-project/commit/6b3bedec999a57015339fa5eed276710e87cbb0f DIFF: https://github.com/llvm/llvm-project/commit/6b3bedec999a57015339fa5eed276710e87cbb0f.diff LOG: Add BitWidth trait to BitmaskEnum, and use for clang DependenceFlags. NFC Reviewers: hokein Subscribers: dexonsmith, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D76942 Added: Modified: clang/include/clang/AST/DependenceFlags.h clang/include/clang/AST/Stmt.h clang/include/clang/AST/Type.h clang/lib/Serialization/ASTReaderStmt.cpp llvm/include/llvm/ADT/BitmaskEnum.h Removed: ################################################################################ diff --git a/clang/include/clang/AST/DependenceFlags.h b/clang/include/clang/AST/DependenceFlags.h index 788227156c4d..c92b22220c65 100644 --- a/clang/include/clang/AST/DependenceFlags.h +++ b/clang/include/clang/AST/DependenceFlags.h @@ -36,7 +36,6 @@ struct ExprDependenceScope { }; }; using ExprDependence = ExprDependenceScope::ExprDependence; -static constexpr unsigned ExprDependenceBits = 5; struct TypeDependenceScope { enum TypeDependence : uint8_t { @@ -62,7 +61,6 @@ struct TypeDependenceScope { }; }; using TypeDependence = TypeDependenceScope::TypeDependence; -static constexpr unsigned TypeDependenceBits = 4; #define LLVM_COMMON_DEPENDENCE(NAME) \ struct NAME##Scope { \ @@ -78,8 +76,7 @@ static constexpr unsigned TypeDependenceBits = 4; LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/Dependent) \ }; \ }; \ - using NAME = NAME##Scope::NAME; \ - static constexpr unsigned NAME##Bits = 3; + using NAME = NAME##Scope::NAME; LLVM_COMMON_DEPENDENCE(NestedNameSpecifierDependence) LLVM_COMMON_DEPENDENCE(TemplateNameDependence) diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index 87e1d7f26a16..8c7f0ecad3ef 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -21,6 +21,7 @@ #include "clang/Basic/LLVM.h" #include "clang/Basic/SourceLocation.h" #include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/BitmaskEnum.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/iterator.h" @@ -310,9 +311,9 @@ class alignas(void *) Stmt { unsigned ValueKind : 2; unsigned ObjectKind : 3; - unsigned /*ExprDependence*/ Dependent : ExprDependenceBits; + unsigned /*ExprDependence*/ Dependent : llvm::BitWidth<ExprDependence>; }; - enum { NumExprBits = NumStmtBits + 5 + ExprDependenceBits }; + enum { NumExprBits = NumStmtBits + 5 + llvm::BitWidth<ExprDependence> }; class ConstantExprBitfields { friend class ASTStmtReader; diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 6b46fc5ad312..248fbcfba98e 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -1467,7 +1467,7 @@ class alignas(8) Type : public ExtQualsTypeCommonBase { unsigned TC : 8; /// Store information on the type dependency. - /*TypeDependence*/ unsigned Dependence : TypeDependenceBits; + unsigned Dependence : llvm::BitWidth<TypeDependence>; /// True if the cache (i.e. the bitfields here starting with /// 'Cache') is valid. @@ -1496,7 +1496,7 @@ class alignas(8) Type : public ExtQualsTypeCommonBase { return CachedLocalOrUnnamed; } }; - enum { NumTypeBits = 8 + TypeDependenceBits + 6 }; + enum { NumTypeBits = 8 + llvm::BitWidth<TypeDependence> + 6 }; protected: // These classes allow subclasses to somewhat cleanly pack bitfields diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index 5d9033e37977..3f56968a51dc 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -50,6 +50,7 @@ #include "clang/Lex/Token.h" #include "clang/Serialization/ASTBitCodes.h" #include "clang/Serialization/ASTRecordReader.h" +#include "llvm/ADT/BitmaskEnum.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallVector.h" @@ -107,7 +108,7 @@ namespace clang { /// The number of record fields required for the Expr class /// itself. static const unsigned NumExprFields = - NumStmtFields + ExprDependenceBits + 3; + NumStmtFields + llvm::BitWidth<ExprDependence> + 3; /// Read and initialize a ExplicitTemplateArgumentList structure. void ReadTemplateKWAndArgsInfo(ASTTemplateKWAndArgsInfo &Args, diff --git a/llvm/include/llvm/ADT/BitmaskEnum.h b/llvm/include/llvm/ADT/BitmaskEnum.h index d5854d0de200..89e5508e08e1 100644 --- a/llvm/include/llvm/ADT/BitmaskEnum.h +++ b/llvm/include/llvm/ADT/BitmaskEnum.h @@ -94,6 +94,10 @@ template <typename E> std::underlying_type_t<E> Underlying(E Val) { return U; } +constexpr unsigned bitWidth(uint64_t Value) { + return Value ? 1 + bitWidth(Value >> 1) : 0; +} + template <typename E, typename = std::enable_if_t<is_bitmask_enum<E>::value>> E operator~(E Val) { return static_cast<E>(~Underlying(Val) & Mask<E>()); @@ -139,6 +143,10 @@ E &operator^=(E &LHS, E RHS) { // Enable bitmask enums in namespace ::llvm and all nested namespaces. LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE(); +template <typename E, typename = std::enable_if_t<is_bitmask_enum<E>::value>> +constexpr unsigned BitWidth = BitmaskEnumDetail::bitWidth(uint64_t{ + static_cast<std::underlying_type_t<E>>( + E::LLVM_BITMASK_LARGEST_ENUMERATOR)}); } // namespace llvm _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits