[llvm-debuginfo-analyzer] Apply various memory savings in Core/LVxxx base classes (#144399)

This small changelist reduces memory footprint of instances of the Core
classes. Specifically,

- For `LVProperties`, use underlying type of `uint32_t` if there are at
most 32 properties to keep track of. Otherwise, fallback to the generic
`std::bitset<N>`.
The use of `llvm::SmallBitVector` is disregarded in this case, as the
upper bound on the size of the bitset can be determined statically (no
heap alloc ever needed).
- Reorder members in `LVElement` s.t. padding between members is
reduced.
- `LVScopeCompileUnit`: fix a couple of members which should be `static
constexpr` instead.
This commit is contained in:
Javier Lopez-Gomez
2025-06-18 23:47:30 +02:00
committed by GitHub
parent d10079e305
commit c4d7ea8049
3 changed files with 31 additions and 12 deletions

View File

@@ -107,18 +107,18 @@ class LLVM_ABI LVElement : public LVObject {
IsAnonymous,
LastEntry
};
// Typed bitvector with properties for this element.
LVProperties<Property> 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<Property> 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.

View File

@@ -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<unsigned, float>;
SmallVector<LVTotalsEntry> Totals;
// Maximum seen lexical level. It is used to control how many entries
@@ -510,7 +510,7 @@ public:
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));

View File

@@ -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 <bitset>
#include <cctype>
#include <map>
#include <sstream>
#include <type_traits>
namespace llvm {
namespace logicalview {
@@ -38,14 +39,32 @@ using LVLexicalIndex =
// Used to record specific characteristics about the objects.
template <typename T> class LVProperties {
SmallBitVector Bits = SmallBitVector(static_cast<unsigned>(T::LastEntry) + 1);
static constexpr unsigned N_PROPS = static_cast<unsigned>(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<N_PROPS>, uint32_t> Bits{};
public:
LVProperties() = default;
void set(T Idx) { Bits[static_cast<unsigned>(Idx)] = 1; }
void reset(T Idx) { Bits[static_cast<unsigned>(Idx)] = 0; }
bool get(T Idx) const { return Bits[static_cast<unsigned>(Idx)]; }
void set(T Idx) {
if constexpr (std::is_same_v<decltype(Bits), uint32_t>)
Bits |= 1 << static_cast<unsigned>(Idx);
else
Bits.set(static_cast<unsigned>(Idx));
}
void reset(T Idx) {
if constexpr (std::is_same_v<decltype(Bits), uint32_t>)
Bits &= ~(1 << static_cast<unsigned>(Idx));
else
Bits.reset(static_cast<unsigned>(Idx));
}
bool get(T Idx) const {
if constexpr (std::is_same_v<decltype(Bits), uint32_t>)
return Bits & (1 << static_cast<unsigned>(Idx));
else
return Bits[static_cast<unsigned>(Idx)];
}
};
// Generate get, set and reset 'bool' functions for LVProperties instances.