diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h index b4501db190fe5..0e7be45abfef4 100644 --- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h +++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h @@ -107,18 +107,18 @@ class LLVM_ABI LVElement : public LVObject { IsAnonymous, LastEntry }; - // Typed bitvector with properties for this element. - LVProperties Properties; static LVElementDispatch Dispatch; - /// RTTI. - const LVSubclassID SubclassID; - // Indexes in the String Pool. size_t NameIndex = 0; size_t QualifiedNameIndex = 0; size_t FilenameIndex = 0; + // Typed bitvector with properties for this element. + LVProperties Properties; + /// RTTI. + const LVSubclassID SubclassID; + uint16_t AccessibilityCode : 2; // DW_AT_accessibility. uint16_t InlineCode : 2; // DW_AT_inline. uint16_t VirtualityCode : 2; // DW_AT_virtuality. diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVScope.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVScope.h index 5715a37185b2b..a453923d032e4 100644 --- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVScope.h +++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVScope.h @@ -473,7 +473,7 @@ class LLVM_ABI LVScopeCompileUnit final : public LVScope { // Record scope sizes indexed by lexical level. // Setting an initial size that will cover a very deep nested scopes. - const size_t TotalInitialSize = 8; + static constexpr size_t TotalInitialSize = 8; using LVTotalsEntry = std::pair; SmallVector Totals; // Maximum seen lexical level. It is used to control how many entries @@ -510,7 +510,7 @@ class LLVM_ABI LVScopeCompileUnit final : public LVScope { void addMapping(LVLine *Line, LVSectionIndex SectionIndex); LVLineRange lineRange(LVLocation *Location) const; - LVNameInfo NameNone = {UINT64_MAX, 0}; + static constexpr LVNameInfo NameNone = {UINT64_MAX, 0}; void addPublicName(LVScope *Scope, LVAddress LowPC, LVAddress HighPC) { PublicNames.emplace(std::piecewise_construct, std::forward_as_tuple(Scope), std::forward_as_tuple(LowPC, HighPC - LowPC)); diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h index 01137f80c0f8b..058ca2da9a960 100644 --- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h +++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h @@ -13,7 +13,6 @@ #ifndef LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVSUPPORT_H #define LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVSUPPORT_H -#include "llvm/ADT/SmallBitVector.h" #include "llvm/ADT/Twine.h" #include "llvm/DebugInfo/LogicalView/Core/LVStringPool.h" #include "llvm/Support/Compiler.h" @@ -21,9 +20,11 @@ #include "llvm/Support/Format.h" #include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" +#include #include #include #include +#include namespace llvm { namespace logicalview { @@ -38,14 +39,32 @@ using LVLexicalIndex = // Used to record specific characteristics about the objects. template class LVProperties { - SmallBitVector Bits = SmallBitVector(static_cast(T::LastEntry) + 1); + static constexpr unsigned N_PROPS = static_cast(T::LastEntry); + // Use uint32_t as the underlying type if the `T` enum has at most 32 + // enumerators; otherwise, fallback to the generic `std::bitset` case. + std::conditional_t<(N_PROPS > 32), std::bitset, uint32_t> Bits{}; public: LVProperties() = default; - void set(T Idx) { Bits[static_cast(Idx)] = 1; } - void reset(T Idx) { Bits[static_cast(Idx)] = 0; } - bool get(T Idx) const { return Bits[static_cast(Idx)]; } + void set(T Idx) { + if constexpr (std::is_same_v) + Bits |= 1 << static_cast(Idx); + else + Bits.set(static_cast(Idx)); + } + void reset(T Idx) { + if constexpr (std::is_same_v) + Bits &= ~(1 << static_cast(Idx)); + else + Bits.reset(static_cast(Idx)); + } + bool get(T Idx) const { + if constexpr (std::is_same_v) + return Bits & (1 << static_cast(Idx)); + else + return Bits[static_cast(Idx)]; + } }; // Generate get, set and reset 'bool' functions for LVProperties instances.