-
Notifications
You must be signed in to change notification settings - Fork 13.5k
[lldb] Fix ForwardListFrontEnd::CalculateNumChildren #139805
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?
[lldb] Fix ForwardListFrontEnd::CalculateNumChildren #139805
Conversation
Fixes the calculation of the number of children for `std::forward_list` to no longer be capped. The calculation was capped by the value of `target.max-children-count`. This resulted in at least the following problems: 1. The summary formatter would display the incorrect size when the size was greater than `max-child-count`. 2. The elision marker (`...`) would not be shown when the number of elements was greater than `max-child-count`.
@llvm/pr-subscribers-lldb Author: Dave Lee (kastiglione) ChangesFixes the calculation of the number of children for This resulted in at least the following problems:
Full diff: https://github.com/llvm/llvm-project/pull/139805.diff 2 Files Affected:
diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp
index 30db5f15c388f..e3c200da6a0f5 100644
--- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp
+++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp
@@ -251,7 +251,7 @@ llvm::Expected<uint32_t> ForwardListFrontEnd::CalculateNumChildren() {
ListEntry current(m_head);
m_count = 0;
- while (current && m_count < m_list_capping_size) {
+ while (current) {
++m_count;
current = current.next();
}
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/forward_list/TestDataFormatterGenericForwardList.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/forward_list/TestDataFormatterGenericForwardList.py
index 185a24cf6dce3..1639d7275b407 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/forward_list/TestDataFormatterGenericForwardList.py
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/forward_list/TestDataFormatterGenericForwardList.py
@@ -53,13 +53,14 @@ def do_test(self, stdlib_type):
substrs=["target.max-children-count (unsigned) = 256"],
)
+ self.runCmd("settings set target.max-children-count 256", check=False)
self.expect(
"frame variable thousand_elts",
matching=False,
- substrs=["[256]", "[333]", "[444]", "[555]", "[666]", "..."],
+ substrs=["[256]", "[333]", "[444]", "[555]", "[666]"],
)
- self.runCmd("settings set target.max-children-count 3", check=False)
+ self.runCmd("settings set target.max-children-count 3", check=False)
self.expect(
"frame variable thousand_elts",
matching=False,
@@ -73,7 +74,7 @@ def do_test(self, stdlib_type):
self.expect(
"frame variable thousand_elts",
matching=True,
- substrs=["size=256", "[0]", "[1]", "[2]", "..."],
+ substrs=["size=1000", "[0]", "[1]", "[2]", "..."],
)
def do_test_ptr_and_ref(self, stdlib_type):
@@ -138,7 +139,7 @@ def do_test_ptr_and_ref(self, stdlib_type):
"frame variable ref",
matching=True,
substrs=[
- "size=256",
+ "size=1000",
"[0] = 999",
"[1] = 998",
"[2] = 997",
@@ -149,7 +150,7 @@ def do_test_ptr_and_ref(self, stdlib_type):
"frame variable *ptr",
matching=True,
substrs=[
- "size=256",
+ "size=1000",
"[0] = 999",
"[1] = 998",
"[2] = 997",
|
I'm very much in favor of removing this dependence on the setting value, as I think it should be handled at a higher level. However, I fear this is going to make printing large std::forward_list very slow. Since computing the size of the list requires iterating through all the elements, which is a lot of pointer chasing, printing of large lists (like, 10k elements or more) could take a very long time (and I think that's the reason this limit was originally introduced). Fortunately, we already have a mechanism to prevent this -- we mave For this, I think the fix is to change the formatter to not print the exact size (all the time). For example, it could call The value of |
Fixes the calculation of the number of children for
std::forward_list
to no longer becapped. The calculation was capped by the value of
target.max-children-count
.This resulted in at least the following problems:
max-child-count
....
) would not be shown when the number of elements was greaterthan
max-child-count
.