-
Notifications
You must be signed in to change notification settings - Fork 14k
[llvm-debuginfo-analyzer] Apply various memory savings in Core/LVxxx base classes #144399
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
[llvm-debuginfo-analyzer] Apply various memory savings in Core/LVxxx base classes #144399
Conversation
@llvm/pr-subscribers-debuginfo Author: Javier Lopez-Gomez (jalopezg-git) ChangesUse underlying type of Full diff: https://github.com/llvm/llvm-project/pull/144399.diff 1 Files Affected:
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
index 01137f80c0f8b..4fb7d1d13e513 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
@@ -21,9 +21,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 +40,30 @@ 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);
+ 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.
|
30b6aeb
to
ed5fcb9
Compare
LVProperties
where possible
@CarlosAlbertoEnciso FYI 🙂. Feel free to review / leave comments. Also, could you measure peak memory usage (both, before and after this change) for the Chrome debug info case? |
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.
ed5fcb9
to
909a38e
Compare
I have also made a couple of (very trivial) changes to @CarlosAlbertoEnciso, @OCHyams, if you don't have further comments, I think this can be merged too 👍. |
This small changelist reduces memory footprint of instances of the Core classes. Specifically,
LVProperties
, use underlying type ofuint32_t
if there are at most 32 properties to keep track of. Otherwise, fallback to the genericstd::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).LVElement
s.t. padding between members is reduced.LVScopeCompileUnit
: fix a couple of members which should bestatic constexpr
instead.This effectively reduces the sizes of key classes to
sizeof(T)
before this patchsizeof(T)
after this patchT = LVObject
T = LVElement
T = LVScope
T = LVSymbol
T = LVScopeCompileUnit
This, in turn, should have a very visible effect for parsing large debug information files.