Author: enrico Date: Fri May 15 20:27:00 2015 New Revision: 237504 URL: http://llvm.org/viewvc/llvm-project?rev=237504&view=rev Log: Constant result ValueObjects are - well - constant And they also do not have a thread/frame attached to them
That makes dynamic and synthetic values attached to them impossible to update - which, among other things, makes it impossible to properly display persistent variables of types that could have such dynamic/persistent values Fix this by making it so that a ValueObject can control its constantness (hint: dynamic and synthetic values cannot be constant) and whether it wants to let itself be updated when an invalid thread is around Added: lldb/trunk/test/expression_command/persistent_ptr_update/ lldb/trunk/test/expression_command/persistent_ptr_update/Makefile lldb/trunk/test/expression_command/persistent_ptr_update/TestPersistentPtrUpdate.py lldb/trunk/test/expression_command/persistent_ptr_update/main.c Modified: lldb/trunk/include/lldb/Core/ValueObject.h lldb/trunk/include/lldb/Core/ValueObjectDynamicValue.h lldb/trunk/include/lldb/Core/ValueObjectSyntheticFilter.h lldb/trunk/source/Core/ValueObject.cpp Modified: lldb/trunk/include/lldb/Core/ValueObject.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObject.h?rev=237504&r1=237503&r2=237504&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/ValueObject.h (original) +++ lldb/trunk/include/lldb/Core/ValueObject.h Fri May 15 20:27:00 2015 @@ -285,18 +285,19 @@ public: SetUpdated (); bool - NeedsUpdating() + NeedsUpdating(bool accept_invalid_exe_ctx) { - SyncWithProcessState(); + SyncWithProcessState(accept_invalid_exe_ctx); return m_needs_update; } bool IsValid () { + const bool accept_invalid_exe_ctx = false; if (!m_mod_id.IsValid()) return false; - else if (SyncWithProcessState ()) + else if (SyncWithProcessState (accept_invalid_exe_ctx)) { if (!m_mod_id.IsValid()) return false; @@ -318,7 +319,7 @@ public: private: bool - SyncWithProcessState (); + SyncWithProcessState (bool accept_invalid_exe_ctx); ProcessModID m_mod_id; // This is the stop id when this ValueObject was last evaluated. ExecutionContextRef m_exe_ctx_ref; @@ -851,12 +852,19 @@ public: virtual bool SetData (DataExtractor &data, Error &error); - bool + virtual bool GetIsConstant () const { return m_update_point.IsConstant(); } + virtual bool + NeedsUpdating () + { + const bool accept_invalid_exe_ctx = false; + return m_update_point.NeedsUpdating(accept_invalid_exe_ctx); + } + void SetIsConstant () { Modified: lldb/trunk/include/lldb/Core/ValueObjectDynamicValue.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObjectDynamicValue.h?rev=237504&r1=237503&r2=237504&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/ValueObjectDynamicValue.h (original) +++ lldb/trunk/include/lldb/Core/ValueObjectDynamicValue.h Fri May 15 20:27:00 2015 @@ -56,6 +56,19 @@ public: return true; } + virtual bool + GetIsConstant () const + { + return false; + } + + virtual bool + NeedsUpdating () + { + const bool accept_invalid_exe_ctx = true; + return m_update_point.NeedsUpdating(accept_invalid_exe_ctx); + } + virtual ValueObject * GetParent() { Modified: lldb/trunk/include/lldb/Core/ValueObjectSyntheticFilter.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObjectSyntheticFilter.h?rev=237504&r1=237503&r2=237504&view=diff ============================================================================== --- lldb/trunk/include/lldb/Core/ValueObjectSyntheticFilter.h (original) +++ lldb/trunk/include/lldb/Core/ValueObjectSyntheticFilter.h Fri May 15 20:27:00 2015 @@ -141,6 +141,19 @@ public: } virtual bool + GetIsConstant () const + { + return false; + } + + virtual bool + NeedsUpdating () + { + const bool accept_invalid_exe_ctx = true; + return m_update_point.NeedsUpdating(accept_invalid_exe_ctx); + } + + virtual bool SetValueFromCString (const char *value_str, Error& error); virtual void Modified: lldb/trunk/source/Core/ValueObject.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=237504&r1=237503&r2=237504&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObject.cpp (original) +++ lldb/trunk/source/Core/ValueObject.cpp Fri May 15 20:27:00 2015 @@ -198,7 +198,7 @@ ValueObject::UpdateValueIfNeeded (bool u bool first_update = IsChecksumEmpty(); - if (m_update_point.NeedsUpdating()) + if (NeedsUpdating()) { m_update_point.SetUpdated(); @@ -3952,9 +3952,8 @@ ValueObject::EvaluationPoint::~Evaluatio // exe_scope will be set to the current execution context scope. bool -ValueObject::EvaluationPoint::SyncWithProcessState() +ValueObject::EvaluationPoint::SyncWithProcessState(bool accept_invalid_exe_ctx) { - // Start with the target, if it is NULL, then we're obviously not going to get any further: const bool thread_and_frame_only_if_stopped = true; ExecutionContext exe_ctx(m_exe_ctx_ref.Lock(thread_and_frame_only_if_stopped)); @@ -3997,30 +3996,33 @@ ValueObject::EvaluationPoint::SyncWithPr // That way we'll be sure to return a valid exe_scope. // If we used to have a thread or a frame but can't find it anymore, then mark ourselves as invalid. - if (m_exe_ctx_ref.HasThreadRef()) + if (!accept_invalid_exe_ctx) { - ThreadSP thread_sp (m_exe_ctx_ref.GetThreadSP()); - if (thread_sp) + if (m_exe_ctx_ref.HasThreadRef()) { - if (m_exe_ctx_ref.HasFrameRef()) + ThreadSP thread_sp (m_exe_ctx_ref.GetThreadSP()); + if (thread_sp) { - StackFrameSP frame_sp (m_exe_ctx_ref.GetFrameSP()); - if (!frame_sp) + if (m_exe_ctx_ref.HasFrameRef()) { - // We used to have a frame, but now it is gone - SetInvalid(); - changed = was_valid; + StackFrameSP frame_sp (m_exe_ctx_ref.GetFrameSP()); + if (!frame_sp) + { + // We used to have a frame, but now it is gone + SetInvalid(); + changed = was_valid; + } } } + else + { + // We used to have a thread, but now it is gone + SetInvalid(); + changed = was_valid; + } } - else - { - // We used to have a thread, but now it is gone - SetInvalid(); - changed = was_valid; - } - } + return changed; } Added: lldb/trunk/test/expression_command/persistent_ptr_update/Makefile URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/expression_command/persistent_ptr_update/Makefile?rev=237504&view=auto ============================================================================== --- lldb/trunk/test/expression_command/persistent_ptr_update/Makefile (added) +++ lldb/trunk/test/expression_command/persistent_ptr_update/Makefile Fri May 15 20:27:00 2015 @@ -0,0 +1,7 @@ +LEVEL = ../../make + +C_SOURCES := main.c + +include $(LEVEL)/Makefile.rules + + Added: lldb/trunk/test/expression_command/persistent_ptr_update/TestPersistentPtrUpdate.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/expression_command/persistent_ptr_update/TestPersistentPtrUpdate.py?rev=237504&view=auto ============================================================================== --- lldb/trunk/test/expression_command/persistent_ptr_update/TestPersistentPtrUpdate.py (added) +++ lldb/trunk/test/expression_command/persistent_ptr_update/TestPersistentPtrUpdate.py Fri May 15 20:27:00 2015 @@ -0,0 +1,55 @@ +""" +Test that we can have persistent pointer variables +""" + +import unittest2 +import lldb +import lldbutil +from lldbtest import * + +class PersistentPtrUpdateTestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + + @skipUnlessDarwin + @dsym_test + def test_with_dsym(self): + """Test that we can have persistent pointer variables""" + self.buildDsym() + self.do_my_test() + + @skipUnlessDarwin + @dwarf_test + def test_with_dwarf(self): + """Test that we can have persistent pointer variables""" + self.buildDwarf() + self.do_my_test() + + def do_my_test(self): + def cleanup(): + pass + + # Execute the cleanup function during test case tear down. + self.addTearDownHook(cleanup) + + self.runCmd("file a.out", CURRENT_EXECUTABLE_SET) + + self.runCmd('break set -p here') + + self.runCmd("run", RUN_SUCCEEDED) + + self.runCmd("expr void* $foo = nullptr") + + self.runCmd("continue") + + self.expect("expr $foo", substrs=['$foo','0x0']) + +if __name__ == '__main__': + import atexit + lldb.SBDebugger.Initialize() + atexit.register(lambda: lldb.SBDebugger.Terminate()) + unittest2.main() Added: lldb/trunk/test/expression_command/persistent_ptr_update/main.c URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/expression_command/persistent_ptr_update/main.c?rev=237504&view=auto ============================================================================== --- lldb/trunk/test/expression_command/persistent_ptr_update/main.c (added) +++ lldb/trunk/test/expression_command/persistent_ptr_update/main.c Fri May 15 20:27:00 2015 @@ -0,0 +1,11 @@ +void* foo(void *p) +{ + return p; // break here +} + +int main() { + while (1) { + foo(0); + } + return 0; +} _______________________________________________ lldb-commits mailing list lldb-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits