[llvm] [llvm-debuginfo-analyzer] Reduce size of `LVProperties` where possible (PR #144399)
Javier Lopez-Gomez via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 16 13:53:09 PDT 2025
https://github.com/jalopezg-git updated https://github.com/llvm/llvm-project/pull/144399
>From 4e4b961209d5474bacba009276ea06887a350f8c Mon Sep 17 00:00:00 2001
From: Javier Lopez-Gomez <javier.lopez.gomez at proton.me>
Date: Mon, 16 Jun 2025 22:52:57 +0200
Subject: [PATCH 1/2] [llvm-debuginfo-analyzer] Reduce size of `LVProperties`
where possible
Use underlying type of `uint32_t` if there are at most 32 properties
to keep track of. Otherwise, switch to `std::bitset<N>`.
This effectively reduces the size of `LVObject` from 48 to 40 bytes.
---
.../DebugInfo/LogicalView/Core/LVSupport.h | 29 +++++++++++++++----
1 file changed, 24 insertions(+), 5 deletions(-)
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 <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.
>From ed5fcb95f254a2abe261f20f341d8ae3ea373f75 Mon Sep 17 00:00:00 2001
From: Javier Lopez-Gomez <javier.lopez.gomez at proton.me>
Date: Mon, 16 Jun 2025 22:52:57 +0200
Subject: [PATCH 2/2] [llvm-debuginfo-analyzer] Reorder LVElement members in
order to minimize padding
---
.../llvm/DebugInfo/LogicalView/Core/LVElement.h | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
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<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.
More information about the llvm-commits
mailing list