[Lldb-commits] [lldb] [lldb][test] Consolidate libstdc++ and libc++ vector formatter tests into generic test (PR #146885)
Michael Buch via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 3 06:28:12 PDT 2025
https://github.com/Michael137 created https://github.com/llvm/llvm-project/pull/146885
The libstdc++ test was a subset of the tests in libc++. This test moves the libc++ test into `generic` and removes the `libstdc++` tests. I retained the `-D_GLIBCXX_DEBUG` test cases though.
Split out from https://github.com/llvm/llvm-project/pull/146740
>From 256fa94d299e65d6e28e9bbbcf33bb2c122eec90 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Thu, 3 Jul 2025 15:04:57 +0100
Subject: [PATCH] [lldb][test] Consolidate libstdc++ and libc++ vector
formatter tests into generic test
The libstdc++ test was a subset of the tests in libc++. This test moves
the libc++ test into `generic` and removes the `libstdc++` tests. I
retained the `-D_GLIBCXX_DEBUG` test cases though.
Split out from https://github.com/llvm/llvm-project/pull/146740
---
.../{libstdcpp => generic}/vector/Makefile | 3 -
.../vector/TestDataFormatterStdVector.py} | 43 +++-
.../generic/vector/main.cpp | 40 ++++
.../data-formatter-stl/libcxx/vector/Makefile | 6 -
.../data-formatter-stl/libcxx/vector/main.cpp | 41 ----
.../vector/TestDataFormatterStdVector.py | 220 ------------------
.../libstdcpp/vector/main.cpp | 31 ---
7 files changed, 76 insertions(+), 308 deletions(-)
rename lldb/test/API/functionalities/data-formatter/data-formatter-stl/{libstdcpp => generic}/vector/Makefile (57%)
rename lldb/test/API/functionalities/data-formatter/data-formatter-stl/{libcxx/vector/TestDataFormatterLibcxxVector.py => generic/vector/TestDataFormatterStdVector.py} (84%)
create mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/main.cpp
delete mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/Makefile
delete mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/main.cpp
delete mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/TestDataFormatterStdVector.py
delete mode 100644 lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/main.cpp
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/Makefile
similarity index 57%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/Makefile
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/Makefile
index 654e4b15bd568..99998b20bcb05 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/Makefile
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/Makefile
@@ -1,6 +1,3 @@
CXX_SOURCES := main.cpp
-CXXFLAGS := -O0
-USE_LIBSTDCPP := 1
-
include Makefile.rules
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/TestDataFormatterStdVector.py
similarity index 84%
rename from lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py
rename to lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/TestDataFormatterStdVector.py
index 13341a9b274be..ba8b10450f4fc 100644
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/TestDataFormatterLibcxxVector.py
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/TestDataFormatterStdVector.py
@@ -2,14 +2,13 @@
Test lldb data formatter subsystem.
"""
-
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
-class LibcxxVectorDataFormatterTestCase(TestBase):
+class StdVectorDataFormatterTestCase(TestBase):
def check_numbers(self, var_name, show_ptr=False):
patterns = []
substrs = [
@@ -52,10 +51,8 @@ def check_numbers(self, var_name, show_ptr=False):
self.expect("frame variable " + var_name + "[2]", substrs=["123"])
self.expect("frame variable " + var_name + "[3]", substrs=["1234"])
- @add_test_categories(["libc++"])
- def test_with_run_command(self):
+ def do_test(self):
"""Test that that file and class static variables display correctly."""
- self.build()
(self.target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
self, "break here", lldb.SBFileSpec("main.cpp", False)
)
@@ -170,10 +167,25 @@ def cleanup():
self.expect("frame variable strings", substrs=["vector has 0 items"])
+ @add_test_categories(["libstdcxx"])
+ def test_libstdcxx(self):
+ self.build(dictionary={"USE_LIBSTDCPP": 1})
+ self.do_test()
+
+ @add_test_categories(["libstdcxx"])
+ def test_libstdcxx_debug(self):
+ self.build(
+ dictionary={"USE_LIBSTDCPP": 1, "CXXFLAGS_EXTRAS": "-D_GLIBCXX_DEBUG"}
+ )
+ self.do_test()
+
@add_test_categories(["libc++"])
- def test_ref_and_ptr(self):
+ def test_libcxx(self):
+ self.build(dictionary={"USE_LIBCPP": 1})
+ self.do_test()
+
+ def do_test_ref_and_ptr(self):
"""Test that that file and class static variables display correctly."""
- self.build()
(self.target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint(
self, "Stop here to check by ref", lldb.SBFileSpec("main.cpp", False)
)
@@ -186,3 +198,20 @@ def test_ref_and_ptr(self):
self.expect("frame variable ptr", substrs=["ptr =", " size=7"])
self.expect("expression ptr", substrs=["$", "size=7"])
+
+ @add_test_categories(["libstdcxx"])
+ def test_ref_and_ptr_libstdcxx(self):
+ self.build(dictionary={"USE_LIBSTDCPP": 1})
+ self.do_test_ref_and_ptr()
+
+ @add_test_categories(["libstdcxx"])
+ def test_ref_and_ptr_libstdcxx_debug(self):
+ self.build(
+ dictionary={"USE_LIBSTDCPP": 1, "CXXFLAGS_EXTRAS": "-D_GLIBCXX_DEBUG"}
+ )
+ self.do_test_ref_and_ptr()
+
+ @add_test_categories(["libc++"])
+ def test_ref_and_ptr_libcxx(self):
+ self.build(dictionary={"USE_LIBCPP": 1})
+ self.do_test_ref_and_ptr()
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/main.cpp
new file mode 100644
index 0000000000000..19cd1893bd22a
--- /dev/null
+++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/vector/main.cpp
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include <string>
+#include <vector>
+typedef std::vector<int> int_vect;
+typedef std::vector<std::string> string_vect;
+
+template <class T>
+void by_ref_and_ptr(std::vector<T> &ref, std::vector<T> *ptr) {
+ // Stop here to check by ref
+ return;
+}
+
+int main() {
+ int_vect numbers;
+ (numbers.push_back(1)); // break here
+ (numbers.push_back(12)); // break here
+ (numbers.push_back(123));
+ (numbers.push_back(1234));
+ (numbers.push_back(12345)); // break here
+ (numbers.push_back(123456));
+ (numbers.push_back(1234567));
+ by_ref_and_ptr(numbers, &numbers);
+
+ printf("break here");
+ numbers.clear();
+
+ (numbers.push_back(7)); // break here
+
+ string_vect strings;
+ (strings.push_back(std::string("goofy")));
+ (strings.push_back(std::string("is")));
+ (strings.push_back(std::string("smart")));
+ printf("break here");
+ (strings.push_back(std::string("!!!")));
+
+ printf("break here");
+ strings.clear();
+
+ return 0; // break here
+}
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/Makefile b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/Makefile
deleted file mode 100644
index 564cbada74e08..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-CXX_SOURCES := main.cpp
-
-USE_LIBCPP := 1
-
-CXXFLAGS_EXTRAS := -O0
-include Makefile.rules
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/main.cpp
deleted file mode 100644
index 0e1dbe4f03e2b..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/vector/main.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#include <stdio.h>
-#include <string>
-#include <vector>
-typedef std::vector<int> int_vect;
-typedef std::vector<std::string> string_vect;
-
-template <class T>
-void by_ref_and_ptr(std::vector<T> &ref, std::vector<T> *ptr) {
- // Stop here to check by ref
- return;
-}
-
-int main()
-{
- int_vect numbers;
- (numbers.push_back(1)); // break here
- (numbers.push_back(12)); // break here
- (numbers.push_back(123));
- (numbers.push_back(1234));
- (numbers.push_back(12345)); // break here
- (numbers.push_back(123456));
- (numbers.push_back(1234567));
- by_ref_and_ptr(numbers, &numbers);
-
- printf("break here");
- numbers.clear();
-
- (numbers.push_back(7)); // break here
-
- string_vect strings;
- (strings.push_back(std::string("goofy")));
- (strings.push_back(std::string("is")));
- (strings.push_back(std::string("smart")));
- printf("break here");
- (strings.push_back(std::string("!!!")));
-
- printf("break here");
- strings.clear();
-
- return 0; // break here
-}
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/TestDataFormatterStdVector.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/TestDataFormatterStdVector.py
deleted file mode 100644
index 6cfd17a39304e..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/TestDataFormatterStdVector.py
+++ /dev/null
@@ -1,220 +0,0 @@
-"""
-Test lldb data formatter subsystem.
-"""
-
-
-from typing import Optional
-import lldb
-from lldbsuite.test.decorators import *
-from lldbsuite.test.lldbtest import *
-from lldbsuite.test import lldbutil
-
-
-class StdVectorDataFormatterTestCase(TestBase):
- def setUp(self):
- # Call super's setUp().
- TestBase.setUp(self)
- # Find the line number to break at.
- self.line = line_number("main.cpp", "// Set break point at this line.")
-
- @add_test_categories(["libstdcxx"])
- @expectedFailureAll(bugnumber="llvm.org/pr50861", compiler="gcc")
- def test_with_run_command(self):
- self.with_run_command()
-
- @add_test_categories(["libstdcxx"])
- @expectedFailureAll(bugnumber="llvm.org/pr50861", compiler="gcc")
- def test_with_run_command_debug(self):
- build_args = {"CXXFLAGS_EXTRAS": "-D_GLIBCXX_DEBUG"}
- self.with_run_command(build_args)
-
- def with_run_command(self, dictionary: Optional[dict] = None):
- """Test that that file and class static variables display correctly."""
- self.build(dictionary=dictionary)
- self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
-
- lldbutil.run_break_set_by_source_regexp(self, "Set break point at this line.")
-
- self.runCmd("run", RUN_SUCCEEDED)
-
- # The stop reason of the thread should be breakpoint.
- self.expect(
- "thread list",
- STOPPED_DUE_TO_BREAKPOINT,
- substrs=["stopped", "stop reason = breakpoint"],
- )
-
- # This is the function to remove the custom formats in order to have a
- # clean slate for the next test case.
- def cleanup():
- self.runCmd("type format clear", check=False)
- self.runCmd("type summary clear", check=False)
- self.runCmd("type filter clear", check=False)
- self.runCmd("type synth clear", check=False)
-
- # Execute the cleanup function during test case tear down.
- self.addTearDownHook(cleanup)
-
- # empty vectors (and storage pointers SHOULD BOTH BE NULL..)
- self.expect("frame variable numbers", substrs=["numbers = size=0"])
-
- self.runCmd("c")
-
- # first value added
- self.expect(
- "frame variable numbers", substrs=["numbers = size=1", "[0] = 1", "}"]
- )
-
- # add some more data
- self.runCmd("c")
-
- self.expect(
- "frame variable numbers",
- substrs=[
- "numbers = size=4",
- "[0] = 1",
- "[1] = 12",
- "[2] = 123",
- "[3] = 1234",
- "}",
- ],
- )
-
- self.expect(
- "expression numbers",
- substrs=[
- "$",
- "size=4",
- "[0] = 1",
- "[1] = 12",
- "[2] = 123",
- "[3] = 1234",
- "}",
- ],
- )
-
- # check access to synthetic children
- self.runCmd(
- 'type summary add --summary-string "item 0 is ${var[0]}" std::int_vect int_vect'
- )
- self.expect("frame variable numbers", substrs=["item 0 is 1"])
-
- self.runCmd(
- 'type summary add --summary-string "item 0 is ${svar[0]}" std::int_vect int_vect'
- )
- # import time
- # time.sleep(19)
- self.expect("frame variable numbers", substrs=["item 0 is 1"])
- # move on with synths
- self.runCmd("type summary delete std::int_vect")
- self.runCmd("type summary delete int_vect")
-
- # add some more data
- self.runCmd("c")
-
- self.expect(
- "frame variable numbers",
- substrs=[
- "numbers = size=7",
- "[0] = 1",
- "[1] = 12",
- "[2] = 123",
- "[3] = 1234",
- "[4] = 12345",
- "[5] = 123456",
- "[6] = 1234567",
- "}",
- ],
- )
-
- self.expect(
- "expression numbers",
- substrs=[
- "$",
- "size=7",
- "[0] = 1",
- "[1] = 12",
- "[2] = 123",
- "[3] = 1234",
- "[4] = 12345",
- "[5] = 123456",
- "[6] = 1234567",
- "}",
- ],
- )
-
- # check access-by-index
- self.expect("frame variable numbers[0]", substrs=["1"])
- self.expect("frame variable numbers[1]", substrs=["12"])
- self.expect("frame variable numbers[2]", substrs=["123"])
- self.expect("frame variable numbers[3]", substrs=["1234"])
-
- # but check that expression does not rely on us
- # (when expression gets to call into STL code correctly, we will have to find
- # another way to check this)
- self.expect(
- "expression numbers[6]", matching=False, error=True, substrs=["1234567"]
- )
-
- # check that MightHaveChildren() gets it right
- self.assertTrue(
- self.frame().FindVariable("numbers").MightHaveChildren(),
- "numbers.MightHaveChildren() says False for non empty!",
- )
-
- # clear out the vector and see that we do the right thing once again
- self.runCmd("c")
-
- self.expect("frame variable numbers", substrs=["numbers = size=0"])
-
- self.runCmd("c")
-
- # first value added
- self.expect(
- "frame variable numbers", substrs=["numbers = size=1", "[0] = 7", "}"]
- )
-
- # check if we can display strings
- self.runCmd("c")
-
- self.expect("frame variable strings", substrs=["goofy", "is", "smart"])
-
- self.expect("expression strings", substrs=["goofy", "is", "smart"])
-
- # test summaries based on synthetic children
- self.runCmd(
- 'type summary add std::string_vect string_vect --summary-string "vector has ${svar%#} items" -e'
- )
- self.expect(
- "frame variable strings",
- substrs=["vector has 3 items", "goofy", "is", "smart"],
- )
-
- self.expect(
- "expression strings", substrs=["vector has 3 items", "goofy", "is", "smart"]
- )
-
- self.runCmd("c")
-
- self.expect("frame variable strings", substrs=["vector has 4 items"])
-
- # check access-by-index
- self.expect("frame variable strings[0]", substrs=["goofy"])
- self.expect("frame variable strings[1]", substrs=["is"])
-
- # but check that expression does not rely on us
- # (when expression gets to call into STL code correctly, we will have to find
- # another way to check this)
- self.expect(
- "expression strings[0]", matching=False, error=True, substrs=["goofy"]
- )
-
- # check that MightHaveChildren() gets it right
- self.assertTrue(
- self.frame().FindVariable("strings").MightHaveChildren(),
- "strings.MightHaveChildren() says False for non empty!",
- )
-
- self.runCmd("c")
-
- self.expect("frame variable strings", substrs=["vector has 0 items"])
diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/main.cpp b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/main.cpp
deleted file mode 100644
index 010917995e401..0000000000000
--- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libstdcpp/vector/main.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <string>
-#include <vector>
-typedef std::vector<int> int_vect;
-typedef std::vector<std::string> string_vect;
-
-int main()
-{
- int_vect numbers;
- numbers.push_back(1); // Set break point at this line.
- numbers.push_back(12); // Set break point at this line.
- numbers.push_back(123);
- numbers.push_back(1234);
- numbers.push_back(12345); // Set break point at this line.
- numbers.push_back(123456);
- numbers.push_back(1234567);
-
- numbers.clear(); // Set break point at this line.
-
- numbers.push_back(7); // Set break point at this line.
-
- string_vect strings; // Set break point at this line.
- strings.push_back(std::string("goofy"));
- strings.push_back(std::string("is"));
- strings.push_back(std::string("smart"));
-
- strings.push_back(std::string("!!!")); // Set break point at this line.
-
- strings.clear(); // Set break point at this line.
-
- return 0;// Set break point at this line.
-}
More information about the lldb-commits
mailing list