diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp index 4eec79a278402c8b768f2c89e29641b76c6280d1..8b30e3fb27d95c3fde44352b58121be06af0ef94 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp @@ -139,7 +139,7 @@ lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex( size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { - return formatters::ExtractIndexFromString(name.GetCString()); + return name == "Value" ? 0 : UINT32_MAX; } SyntheticChildrenFrontEnd * diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp index ca6f92d003ad9dda7c4fbb9ca92f16351834e2e8..2edd27e804127e8ca7053138356a34aac7790f05 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp @@ -398,18 +398,9 @@ lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetChildAtIndex( // at this point we have a valid // we need to copy current_sp into a new object otherwise we will end up with // all items named __value_ - DataExtractor data; - Status error; - iterated_sp->GetData(data, error); - if (error.Fail()) { - m_tree = nullptr; - return lldb::ValueObjectSP(); - } StreamString name; name.Printf("[%" PRIu64 "]", (uint64_t)idx); - auto potential_child_sp = CreateValueObjectFromData( - name.GetString(), data, m_backend.GetExecutionContextRef(), - m_element_type); + auto potential_child_sp = iterated_sp->Clone(ConstString(name.GetString())); if (potential_child_sp) { switch (potential_child_sp->GetNumChildren()) { case 1: { diff --git a/lldb/test/API/python_api/value/change_values/libcxx/atomic/Makefile b/lldb/test/API/python_api/value/change_values/libcxx/atomic/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..564cbada74e080ec50299623dd06e3f19aa87f76 --- /dev/null +++ b/lldb/test/API/python_api/value/change_values/libcxx/atomic/Makefile @@ -0,0 +1,6 @@ +CXX_SOURCES := main.cpp + +USE_LIBCPP := 1 + +CXXFLAGS_EXTRAS := -O0 +include Makefile.rules diff --git a/lldb/test/API/python_api/value/change_values/libcxx/atomic/TestChangeValue.py b/lldb/test/API/python_api/value/change_values/libcxx/atomic/TestChangeValue.py new file mode 100644 index 0000000000000000000000000000000000000000..d2bb27d8c7df241d05d26a1efe5296b582be43be --- /dev/null +++ b/lldb/test/API/python_api/value/change_values/libcxx/atomic/TestChangeValue.py @@ -0,0 +1,48 @@ +""" +Test change libc++ std::atomic values. +""" + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class LibcxxChangeValueTestCase(TestBase): + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + + @add_test_categories(["libc++"]) + @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24772") + def test(self): + """Test that we can change values of libc++ std::atomic.""" + self.build() + self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) + + bkpt = self.target().FindBreakpointByID( + lldbutil.run_break_set_by_source_regexp( + self, "Set break point at this line.")) + + self.runCmd("run", RUN_SUCCEEDED) + + # Get Frame #0. + target = self.dbg.GetSelectedTarget() + process = target.GetProcess() + self.assertState(process.GetState(), lldb.eStateStopped) + thread = lldbutil.get_stopped_thread( + process, lldb.eStopReasonBreakpoint) + self.assertTrue( + thread.IsValid(), + "There should be a thread stopped due to breakpoint condition") + frame0 = thread.GetFrameAtIndex(0) + self.assertTrue(frame0.IsValid(), "Got a valid frame.") + + q_value = frame0.FindVariable("Q") + self.assertTrue(q_value.IsValid(), "Got the SBValue for val") + inner_val = q_value.GetChildAtIndex(0) + self.assertTrue(inner_val.IsValid(), "Got the SBValue for inner atomic val") + result = inner_val.SetValueFromCString("42") + self.assertTrue(result, "Setting val returned True.") + result = inner_val.GetValueAsUnsigned() + self.assertTrue(result == 42, "Got correct value (42)") diff --git a/lldb/test/API/python_api/value/change_values/libcxx/atomic/main.cpp b/lldb/test/API/python_api/value/change_values/libcxx/atomic/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..60dc085d7d1f6c2a8ece4c97a22d63ea770ce50b --- /dev/null +++ b/lldb/test/API/python_api/value/change_values/libcxx/atomic/main.cpp @@ -0,0 +1,7 @@ +#include + +int main() +{ + std::atomic Q(1); + return Q; // Set break point at this line. +} diff --git a/lldb/test/API/python_api/value/change_values/libcxx/map/Makefile b/lldb/test/API/python_api/value/change_values/libcxx/map/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..564cbada74e080ec50299623dd06e3f19aa87f76 --- /dev/null +++ b/lldb/test/API/python_api/value/change_values/libcxx/map/Makefile @@ -0,0 +1,6 @@ +CXX_SOURCES := main.cpp + +USE_LIBCPP := 1 + +CXXFLAGS_EXTRAS := -O0 +include Makefile.rules diff --git a/lldb/test/API/python_api/value/change_values/libcxx/map/TestChangeValue.py b/lldb/test/API/python_api/value/change_values/libcxx/map/TestChangeValue.py new file mode 100644 index 0000000000000000000000000000000000000000..087e4c8446f864e8a71f8d32ed65870fb0390284 --- /dev/null +++ b/lldb/test/API/python_api/value/change_values/libcxx/map/TestChangeValue.py @@ -0,0 +1,51 @@ +""" +Test change libc++ map values. +""" + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + +class LibcxxChangeValueTestCase(TestBase): + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + + @add_test_categories(["libc++"]) + @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24772") + def test(self): + """Test that we can change values of libc++ map.""" + self.build() + self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET) + + bkpt = self.target().FindBreakpointByID( + lldbutil.run_break_set_by_source_regexp( + self, "Set break point at this line.")) + + self.runCmd("run", RUN_SUCCEEDED) + + # Get Frame #0. + target = self.dbg.GetSelectedTarget() + process = target.GetProcess() + self.assertState(process.GetState(), lldb.eStateStopped) + thread = lldbutil.get_stopped_thread( + process, lldb.eStopReasonBreakpoint) + self.assertTrue( + thread.IsValid(), + "There should be a thread stopped due to breakpoint condition") + frame0 = thread.GetFrameAtIndex(0) + self.assertTrue(frame0.IsValid(), "Got a valid frame.") + + val_value = frame0.FindVariable("M") + self.assertTrue(val_value.IsValid(), "Got the SBValue for val") + pair0 = val_value.GetChildMemberWithName("[0]") + self.assertTrue(pair0.IsValid(), "Got the SBValue for [0]") + self.assertTrue(pair0.GetNumChildren() == 2, "Got 2 children") + pair0_second = pair0.GetChildMemberWithName("second") + self.assertTrue(pair0_second.IsValid(), "Got the SBValue for [0].second") + result = pair0_second.SetValueFromCString("12345") + self.assertTrue(result, "Setting val returned True.") + result = pair0_second.GetValueAsUnsigned() + self.assertTrue(result == 12345, "Got correct value (12345)") diff --git a/lldb/test/API/python_api/value/change_values/libcxx/map/main.cpp b/lldb/test/API/python_api/value/change_values/libcxx/map/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..4e1ee213e0f3fc268d823471355797780bfb24a7 --- /dev/null +++ b/lldb/test/API/python_api/value/change_values/libcxx/map/main.cpp @@ -0,0 +1,7 @@ +#include + +int main() +{ + std::map M = {{1,1},{2,2}}; + return M[1]; // Set break point at this line. +}