This revision was automatically updated to reflect the committed changes. Closed by commit rGff9c31b23b76: [LLDB] Fix for libc++ atomic allowing modification of contained value (authored by kpdev42).
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D140623/new/ https://reviews.llvm.org/D140623 Files: lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp lldb/test/API/python_api/value/change_values/libcxx/atomic/Makefile lldb/test/API/python_api/value/change_values/libcxx/atomic/TestChangeValue.py lldb/test/API/python_api/value/change_values/libcxx/atomic/main.cpp Index: lldb/test/API/python_api/value/change_values/libcxx/atomic/main.cpp =================================================================== --- /dev/null +++ lldb/test/API/python_api/value/change_values/libcxx/atomic/main.cpp @@ -0,0 +1,7 @@ +#include <atomic> + +int main() +{ + std::atomic<int> Q(1); + return Q; // Set break point at this line. +} Index: lldb/test/API/python_api/value/change_values/libcxx/atomic/TestChangeValue.py =================================================================== --- /dev/null +++ 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)") Index: lldb/test/API/python_api/value/change_values/libcxx/atomic/Makefile =================================================================== --- /dev/null +++ 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 Index: lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp =================================================================== --- lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp +++ lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp @@ -139,7 +139,7 @@ size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { - return formatters::ExtractIndexFromString(name.GetCString()); + return name == "Value" ? 0 : UINT32_MAX; } SyntheticChildrenFrontEnd *
Index: lldb/test/API/python_api/value/change_values/libcxx/atomic/main.cpp =================================================================== --- /dev/null +++ lldb/test/API/python_api/value/change_values/libcxx/atomic/main.cpp @@ -0,0 +1,7 @@ +#include <atomic> + +int main() +{ + std::atomic<int> Q(1); + return Q; // Set break point at this line. +} Index: lldb/test/API/python_api/value/change_values/libcxx/atomic/TestChangeValue.py =================================================================== --- /dev/null +++ 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)") Index: lldb/test/API/python_api/value/change_values/libcxx/atomic/Makefile =================================================================== --- /dev/null +++ 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 Index: lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp =================================================================== --- lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp +++ lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp @@ -139,7 +139,7 @@ size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: GetIndexOfChildWithName(ConstString name) { - return formatters::ExtractIndexFromString(name.GetCString()); + return name == "Value" ? 0 : UINT32_MAX; } SyntheticChildrenFrontEnd *
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits