1*fe6060f1SDimitry Andric //===-- ValueObjectUpdater.cpp --------------------------------------------===//
2*fe6060f1SDimitry Andric //
3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*fe6060f1SDimitry Andric //
7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8*fe6060f1SDimitry Andric 
9*fe6060f1SDimitry Andric #include "lldb/Core/ValueObjectUpdater.h"
10*fe6060f1SDimitry Andric 
11*fe6060f1SDimitry Andric using namespace lldb_private;
12*fe6060f1SDimitry Andric 
ValueObjectUpdater(lldb::ValueObjectSP in_valobj_sp)13*fe6060f1SDimitry Andric ValueObjectUpdater::ValueObjectUpdater(lldb::ValueObjectSP in_valobj_sp) {
14*fe6060f1SDimitry Andric   if (!in_valobj_sp)
15*fe6060f1SDimitry Andric     return;
16*fe6060f1SDimitry Andric   // If the user passes in a value object that is dynamic or synthetic, then
17*fe6060f1SDimitry Andric   // water it down to the static type.
18*fe6060f1SDimitry Andric   m_root_valobj_sp = in_valobj_sp->GetQualifiedRepresentationIfAvailable(
19*fe6060f1SDimitry Andric       lldb::eNoDynamicValues, false);
20*fe6060f1SDimitry Andric }
21*fe6060f1SDimitry Andric 
GetSP()22*fe6060f1SDimitry Andric lldb::ValueObjectSP ValueObjectUpdater::GetSP() {
23*fe6060f1SDimitry Andric   lldb::ProcessSP process_sp = GetProcessSP();
24*fe6060f1SDimitry Andric   if (!process_sp)
25*fe6060f1SDimitry Andric     return lldb::ValueObjectSP();
26*fe6060f1SDimitry Andric 
27*fe6060f1SDimitry Andric   const uint32_t current_stop_id = process_sp->GetLastNaturalStopID();
28*fe6060f1SDimitry Andric   if (current_stop_id == m_stop_id)
29*fe6060f1SDimitry Andric     return m_user_valobj_sp;
30*fe6060f1SDimitry Andric 
31*fe6060f1SDimitry Andric   m_stop_id = current_stop_id;
32*fe6060f1SDimitry Andric 
33*fe6060f1SDimitry Andric   if (!m_root_valobj_sp) {
34*fe6060f1SDimitry Andric     m_user_valobj_sp.reset();
35*fe6060f1SDimitry Andric     return m_root_valobj_sp;
36*fe6060f1SDimitry Andric   }
37*fe6060f1SDimitry Andric 
38*fe6060f1SDimitry Andric   m_user_valobj_sp = m_root_valobj_sp;
39*fe6060f1SDimitry Andric 
40*fe6060f1SDimitry Andric   lldb::ValueObjectSP dynamic_sp =
41*fe6060f1SDimitry Andric       m_user_valobj_sp->GetDynamicValue(lldb::eDynamicDontRunTarget);
42*fe6060f1SDimitry Andric   if (dynamic_sp)
43*fe6060f1SDimitry Andric     m_user_valobj_sp = dynamic_sp;
44*fe6060f1SDimitry Andric 
45*fe6060f1SDimitry Andric   lldb::ValueObjectSP synthetic_sp = m_user_valobj_sp->GetSyntheticValue();
46*fe6060f1SDimitry Andric   if (synthetic_sp)
47*fe6060f1SDimitry Andric     m_user_valobj_sp = synthetic_sp;
48*fe6060f1SDimitry Andric 
49*fe6060f1SDimitry Andric   return m_user_valobj_sp;
50*fe6060f1SDimitry Andric }
51*fe6060f1SDimitry Andric 
GetProcessSP() const52*fe6060f1SDimitry Andric lldb::ProcessSP ValueObjectUpdater::GetProcessSP() const {
53*fe6060f1SDimitry Andric   if (m_root_valobj_sp)
54*fe6060f1SDimitry Andric     return m_root_valobj_sp->GetProcessSP();
55*fe6060f1SDimitry Andric   return lldb::ProcessSP();
56*fe6060f1SDimitry Andric }
57