12f3df613SZachary Turner //===-- ValueObjectDynamicValue.cpp ------------------------------*- C++-*-===//
278a685aaSJim Ingham //
378a685aaSJim Ingham //                     The LLVM Compiler Infrastructure
478a685aaSJim Ingham //
578a685aaSJim Ingham // This file is distributed under the University of Illinois Open Source
678a685aaSJim Ingham // License. See LICENSE.TXT for details.
778a685aaSJim Ingham //
878a685aaSJim Ingham //===----------------------------------------------------------------------===//
978a685aaSJim Ingham 
1078a685aaSJim Ingham #include "lldb/Core/ValueObjectDynamicValue.h"
1178a685aaSJim Ingham #include "lldb/Core/Value.h"
1278a685aaSJim Ingham #include "lldb/Core/ValueObject.h"
13a1e5dc86SGreg Clayton #include "lldb/Symbol/CompilerType.h"
1478a685aaSJim Ingham #include "lldb/Symbol/Type.h"
1578a685aaSJim Ingham #include "lldb/Target/ExecutionContext.h"
1678a685aaSJim Ingham #include "lldb/Target/LanguageRuntime.h"
1778a685aaSJim Ingham #include "lldb/Target/Process.h"
1878a685aaSJim Ingham #include "lldb/Target/Target.h"
192f3df613SZachary Turner #include "lldb/Utility/DataExtractor.h" // for DataExtractor
202f3df613SZachary Turner #include "lldb/Utility/Log.h"
212f3df613SZachary Turner #include "lldb/Utility/Logging.h" // for GetLogIfAllCategoriesSet
22d821c997SPavel Labath #include "lldb/Utility/Scalar.h"  // for Scalar, operator!=
2397206d57SZachary Turner #include "lldb/Utility/Status.h"  // for Status
242f3df613SZachary Turner #include "lldb/lldb-types.h"      // for addr_t, offset_t
252f3df613SZachary Turner 
262f3df613SZachary Turner #include <string.h> // for strcmp, size_t
272f3df613SZachary Turner namespace lldb_private {
282f3df613SZachary Turner class Declaration;
292f3df613SZachary Turner }
3078a685aaSJim Ingham 
3178a685aaSJim Ingham using namespace lldb_private;
3278a685aaSJim Ingham 
33b9c1b51eSKate Stone ValueObjectDynamicValue::ValueObjectDynamicValue(
34b9c1b51eSKate Stone     ValueObject &parent, lldb::DynamicValueType use_dynamic)
35b9c1b51eSKate Stone     : ValueObject(parent), m_address(), m_dynamic_type_info(),
36b9c1b51eSKate Stone       m_use_dynamic(use_dynamic) {
376f3533fbSEnrico Granata   SetName(parent.GetName());
3878a685aaSJim Ingham }
3978a685aaSJim Ingham 
40b9c1b51eSKate Stone ValueObjectDynamicValue::~ValueObjectDynamicValue() {
4178a685aaSJim Ingham   m_owning_valobj_sp.reset();
4278a685aaSJim Ingham }
4378a685aaSJim Ingham 
44b9c1b51eSKate Stone CompilerType ValueObjectDynamicValue::GetCompilerTypeImpl() {
45dc4db5a6SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
46b9c1b51eSKate Stone   if (success) {
47dc4db5a6SEnrico Granata     if (m_dynamic_type_info.HasType())
4899558cc4SGreg Clayton       return m_value.GetCompilerType();
4978a685aaSJim Ingham     else
5099558cc4SGreg Clayton       return m_parent->GetCompilerType();
5178a685aaSJim Ingham   }
5299558cc4SGreg Clayton   return m_parent->GetCompilerType();
53dc4db5a6SEnrico Granata }
5478a685aaSJim Ingham 
55b9c1b51eSKate Stone ConstString ValueObjectDynamicValue::GetTypeName() {
56c3e320a7SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
57b9c1b51eSKate Stone   if (success) {
58f7b1a34eSEnrico Granata     if (m_dynamic_type_info.HasName())
59f7b1a34eSEnrico Granata       return m_dynamic_type_info.GetName();
60f7b1a34eSEnrico Granata   }
61f7b1a34eSEnrico Granata   return m_parent->GetTypeName();
62f7b1a34eSEnrico Granata }
63f7b1a34eSEnrico Granata 
64b9c1b51eSKate Stone TypeImpl ValueObjectDynamicValue::GetTypeImpl() {
65dc4db5a6SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
66b9c1b51eSKate Stone   if (success && m_type_impl.IsValid()) {
67dc4db5a6SEnrico Granata     return m_type_impl;
68dc4db5a6SEnrico Granata   }
69dc4db5a6SEnrico Granata   return m_parent->GetTypeImpl();
70dc4db5a6SEnrico Granata }
71dc4db5a6SEnrico Granata 
72b9c1b51eSKate Stone ConstString ValueObjectDynamicValue::GetQualifiedTypeName() {
73f7b1a34eSEnrico Granata   const bool success = UpdateValueIfNeeded(false);
74b9c1b51eSKate Stone   if (success) {
75f7b1a34eSEnrico Granata     if (m_dynamic_type_info.HasName())
76f7b1a34eSEnrico Granata       return m_dynamic_type_info.GetName();
77f7b1a34eSEnrico Granata   }
78e8daa2f8SEnrico Granata   return m_parent->GetQualifiedTypeName();
79e8daa2f8SEnrico Granata }
80e8daa2f8SEnrico Granata 
81b9c1b51eSKate Stone ConstString ValueObjectDynamicValue::GetDisplayTypeName() {
82e8daa2f8SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
83b9c1b51eSKate Stone   if (success) {
84e8daa2f8SEnrico Granata     if (m_dynamic_type_info.HasType())
8599558cc4SGreg Clayton       return GetCompilerType().GetDisplayTypeName();
86e8daa2f8SEnrico Granata     if (m_dynamic_type_info.HasName())
87e8daa2f8SEnrico Granata       return m_dynamic_type_info.GetName();
88e8daa2f8SEnrico Granata   }
89e8daa2f8SEnrico Granata   return m_parent->GetDisplayTypeName();
9078a685aaSJim Ingham }
9178a685aaSJim Ingham 
92b9c1b51eSKate Stone size_t ValueObjectDynamicValue::CalculateNumChildren(uint32_t max) {
93c3e320a7SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
94b9c1b51eSKate Stone   if (success && m_dynamic_type_info.HasType()) {
95*eca07c59SAdrian Prantl     ExecutionContext exe_ctx(GetExecutionContextRef());
96*eca07c59SAdrian Prantl     auto children_count = GetCompilerType().GetNumChildren(true, &exe_ctx);
979ac7a6c5SSiva Chandra     return children_count <= max ? children_count : max;
98b9c1b51eSKate Stone   } else
999ac7a6c5SSiva Chandra     return m_parent->GetNumChildren(max);
10078a685aaSJim Ingham }
10178a685aaSJim Ingham 
102b9c1b51eSKate Stone uint64_t ValueObjectDynamicValue::GetByteSize() {
103c3e320a7SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
104b9c1b51eSKate Stone   if (success && m_dynamic_type_info.HasType()) {
10595438038SEnrico Granata     ExecutionContext exe_ctx(GetExecutionContextRef());
10695438038SEnrico Granata     return m_value.GetValueByteSize(nullptr, &exe_ctx);
107b9c1b51eSKate Stone   } else
10878a685aaSJim Ingham     return m_parent->GetByteSize();
10978a685aaSJim Ingham }
11078a685aaSJim Ingham 
111b9c1b51eSKate Stone lldb::ValueType ValueObjectDynamicValue::GetValueType() const {
11278a685aaSJim Ingham   return m_parent->GetValueType();
11378a685aaSJim Ingham }
11478a685aaSJim Ingham 
115b9c1b51eSKate Stone bool ValueObjectDynamicValue::UpdateValue() {
11678a685aaSJim Ingham   SetValueIsValid(false);
11778a685aaSJim Ingham   m_error.Clear();
11878a685aaSJim Ingham 
119b9c1b51eSKate Stone   if (!m_parent->UpdateValueIfNeeded(false)) {
120007d5be6SGreg Clayton     // The dynamic value failed to get an error, pass the error along
121007d5be6SGreg Clayton     if (m_error.Success() && m_parent->GetError().Fail())
122007d5be6SGreg Clayton       m_error = m_parent->GetError();
12378a685aaSJim Ingham     return false;
12478a685aaSJim Ingham   }
12578a685aaSJim Ingham 
12605097246SAdrian Prantl   // Setting our type_sp to NULL will route everything back through our parent
12705097246SAdrian Prantl   // which is equivalent to not using dynamic values.
128b9c1b51eSKate Stone   if (m_use_dynamic == lldb::eNoDynamicValues) {
129f7b1a34eSEnrico Granata     m_dynamic_type_info.Clear();
1302837b766SJim Ingham     return true;
1312837b766SJim Ingham   }
1322837b766SJim Ingham 
133cc4d0146SGreg Clayton   ExecutionContext exe_ctx(GetExecutionContextRef());
134c14ee32dSGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
135b9c1b51eSKate Stone   if (target) {
136c14ee32dSGreg Clayton     m_data.SetByteOrder(target->GetArchitecture().GetByteOrder());
137c14ee32dSGreg Clayton     m_data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
13878a685aaSJim Ingham   }
13978a685aaSJim Ingham 
14078a685aaSJim Ingham   // First make sure our Type and/or Address haven't changed:
141cc4d0146SGreg Clayton   Process *process = exe_ctx.GetProcessPtr();
14278a685aaSJim Ingham   if (!process)
14378a685aaSJim Ingham     return false;
14478a685aaSJim Ingham 
14561be0903SJim Ingham   TypeAndOrName class_type_or_name;
14678a685aaSJim Ingham   Address dynamic_address;
14778a685aaSJim Ingham   bool found_dynamic_type = false;
1480b6003f3SEnrico Granata   Value::ValueType value_type;
14978a685aaSJim Ingham 
150c74275bcSEnrico Granata   LanguageRuntime *runtime = nullptr;
151c74275bcSEnrico Granata 
15278a685aaSJim Ingham   lldb::LanguageType known_type = m_parent->GetObjectRuntimeLanguage();
153b9c1b51eSKate Stone   if (known_type != lldb::eLanguageTypeUnknown &&
154b9c1b51eSKate Stone       known_type != lldb::eLanguageTypeC) {
155c74275bcSEnrico Granata     runtime = process->GetLanguageRuntime(known_type);
15678a685aaSJim Ingham     if (runtime)
157b9c1b51eSKate Stone       found_dynamic_type = runtime->GetDynamicTypeAndAddress(
158b9c1b51eSKate Stone           *m_parent, m_use_dynamic, class_type_or_name, dynamic_address,
159b9c1b51eSKate Stone           value_type);
160b9c1b51eSKate Stone   } else {
161c74275bcSEnrico Granata     runtime = process->GetLanguageRuntime(lldb::eLanguageTypeC_plus_plus);
162c74275bcSEnrico Granata     if (runtime)
163b9c1b51eSKate Stone       found_dynamic_type = runtime->GetDynamicTypeAndAddress(
164b9c1b51eSKate Stone           *m_parent, m_use_dynamic, class_type_or_name, dynamic_address,
165b9c1b51eSKate Stone           value_type);
16678a685aaSJim Ingham 
167b9c1b51eSKate Stone     if (!found_dynamic_type) {
168c74275bcSEnrico Granata       runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC);
169c74275bcSEnrico Granata       if (runtime)
170b9c1b51eSKate Stone         found_dynamic_type = runtime->GetDynamicTypeAndAddress(
171b9c1b51eSKate Stone             *m_parent, m_use_dynamic, class_type_or_name, dynamic_address,
172b9c1b51eSKate Stone             value_type);
17378a685aaSJim Ingham     }
17478a685aaSJim Ingham   }
17578a685aaSJim Ingham 
176b9c1b51eSKate Stone   // Getting the dynamic value may have run the program a bit, and so marked us
17705097246SAdrian Prantl   // as needing updating, but we really don't...
17861be0903SJim Ingham 
17961be0903SJim Ingham   m_update_point.SetUpdated();
18061be0903SJim Ingham 
181b9c1b51eSKate Stone   if (runtime && found_dynamic_type) {
182b9c1b51eSKate Stone     if (class_type_or_name.HasType()) {
183b9c1b51eSKate Stone       m_type_impl =
184b9c1b51eSKate Stone           TypeImpl(m_parent->GetCompilerType(),
185b9c1b51eSKate Stone                    runtime->FixUpDynamicType(class_type_or_name, *m_parent)
186b9c1b51eSKate Stone                        .GetCompilerType());
187b9c1b51eSKate Stone     } else {
188df7c7f99SEnrico Granata       m_type_impl.Clear();
189df7c7f99SEnrico Granata     }
190b9c1b51eSKate Stone   } else {
191df7c7f99SEnrico Granata     m_type_impl.Clear();
192df7c7f99SEnrico Granata   }
193dc4db5a6SEnrico Granata 
194b9c1b51eSKate Stone   // If we don't have a dynamic type, then make ourselves just a echo of our
19505097246SAdrian Prantl   // parent. Or we could return false, and make ourselves an echo of our
19605097246SAdrian Prantl   // parent?
197b9c1b51eSKate Stone   if (!found_dynamic_type) {
198f7b1a34eSEnrico Granata     if (m_dynamic_type_info)
19975badc46SEnrico Granata       SetValueDidChange(true);
200bd83b87dSEnrico Granata     ClearDynamicTypeInformation();
201f7b1a34eSEnrico Granata     m_dynamic_type_info.Clear();
20278a685aaSJim Ingham     m_value = m_parent->GetValue();
20357ee3067SGreg Clayton     m_error = m_value.GetValueAsData(&exe_ctx, m_data, 0, GetModule().get());
20478a685aaSJim Ingham     return m_error.Success();
20578a685aaSJim Ingham   }
20678a685aaSJim Ingham 
20778a685aaSJim Ingham   Value old_value(m_value);
20878a685aaSJim Ingham 
2095160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES));
210d228483dSEnrico Granata 
211e3e91517SEnrico Granata   bool has_changed_type = false;
212e3e91517SEnrico Granata 
213b9c1b51eSKate Stone   if (!m_dynamic_type_info) {
214f7b1a34eSEnrico Granata     m_dynamic_type_info = class_type_or_name;
215e3e91517SEnrico Granata     has_changed_type = true;
216b9c1b51eSKate Stone   } else if (class_type_or_name != m_dynamic_type_info) {
21778a685aaSJim Ingham     // We are another type, we need to tear down our children...
218f7b1a34eSEnrico Granata     m_dynamic_type_info = class_type_or_name;
21978a685aaSJim Ingham     SetValueDidChange(true);
220e3e91517SEnrico Granata     has_changed_type = true;
22178a685aaSJim Ingham   }
22278a685aaSJim Ingham 
223e3e91517SEnrico Granata   if (has_changed_type)
224e3e91517SEnrico Granata     ClearDynamicTypeInformation();
225e3e91517SEnrico Granata 
226b9c1b51eSKate Stone   if (!m_address.IsValid() || m_address != dynamic_address) {
22778a685aaSJim Ingham     if (m_address.IsValid())
22878a685aaSJim Ingham       SetValueDidChange(true);
22978a685aaSJim Ingham 
23078a685aaSJim Ingham     // We've moved, so we should be fine...
23178a685aaSJim Ingham     m_address = dynamic_address;
232cc4d0146SGreg Clayton     lldb::TargetSP target_sp(GetTargetSP());
233cc4d0146SGreg Clayton     lldb::addr_t load_address = m_address.GetLoadAddress(target_sp.get());
23478a685aaSJim Ingham     m_value.GetScalar() = load_address;
23578a685aaSJim Ingham   }
23678a685aaSJim Ingham 
237c74275bcSEnrico Granata   if (runtime)
238b9c1b51eSKate Stone     m_dynamic_type_info =
239b9c1b51eSKate Stone         runtime->FixUpDynamicType(m_dynamic_type_info, *m_parent);
24078a685aaSJim Ingham 
24157ee3067SGreg Clayton   // m_value.SetContext (Value::eContextTypeClangType, corrected_type);
24299558cc4SGreg Clayton   m_value.SetCompilerType(m_dynamic_type_info.GetCompilerType());
24378a685aaSJim Ingham 
2440b6003f3SEnrico Granata   m_value.SetValueType(value_type);
24578a685aaSJim Ingham 
246e3e91517SEnrico Granata   if (has_changed_type && log)
247324a1036SSaleem Abdulrasool     log->Printf("[%s %p] has a new dynamic type %s", GetName().GetCString(),
248324a1036SSaleem Abdulrasool                 static_cast<void *>(this), GetTypeName().GetCString());
249e3e91517SEnrico Granata 
250b9c1b51eSKate Stone   if (m_address.IsValid() && m_dynamic_type_info) {
25105097246SAdrian Prantl     // The variable value is in the Scalar value inside the m_value. We can
25205097246SAdrian Prantl     // point our m_data right to it.
25357ee3067SGreg Clayton     m_error = m_value.GetValueAsData(&exe_ctx, m_data, 0, GetModule().get());
254b9c1b51eSKate Stone     if (m_error.Success()) {
255b9c1b51eSKate Stone       if (!CanProvideValue()) {
25605097246SAdrian Prantl         // this value object represents an aggregate type whose children have
25705097246SAdrian Prantl         // values, but this object does not. So we say we are changed if our
25805097246SAdrian Prantl         // location has changed.
259b9c1b51eSKate Stone         SetValueDidChange(m_value.GetValueType() != old_value.GetValueType() ||
260b9c1b51eSKate Stone                           m_value.GetScalar() != old_value.GetScalar());
26178a685aaSJim Ingham       }
26278a685aaSJim Ingham 
26378a685aaSJim Ingham       SetValueIsValid(true);
26478a685aaSJim Ingham       return true;
26578a685aaSJim Ingham     }
26678a685aaSJim Ingham   }
26778a685aaSJim Ingham 
26878a685aaSJim Ingham   // We get here if we've failed above...
26978a685aaSJim Ingham   SetValueIsValid(false);
27078a685aaSJim Ingham   return false;
27178a685aaSJim Ingham }
27278a685aaSJim Ingham 
273b9c1b51eSKate Stone bool ValueObjectDynamicValue::IsInScope() { return m_parent->IsInScope(); }
27478a685aaSJim Ingham 
275b9c1b51eSKate Stone bool ValueObjectDynamicValue::SetValueFromCString(const char *value_str,
27697206d57SZachary Turner                                                   Status &error) {
277b9c1b51eSKate Stone   if (!UpdateValueIfNeeded(false)) {
27807a4ac22SEnrico Granata     error.SetErrorString("unable to read value");
27907a4ac22SEnrico Granata     return false;
28007a4ac22SEnrico Granata   }
28107a4ac22SEnrico Granata 
28207a4ac22SEnrico Granata   uint64_t my_value = GetValueAsUnsigned(UINT64_MAX);
28307a4ac22SEnrico Granata   uint64_t parent_value = m_parent->GetValueAsUnsigned(UINT64_MAX);
28407a4ac22SEnrico Granata 
285b9c1b51eSKate Stone   if (my_value == UINT64_MAX || parent_value == UINT64_MAX) {
28607a4ac22SEnrico Granata     error.SetErrorString("unable to read value");
28707a4ac22SEnrico Granata     return false;
28807a4ac22SEnrico Granata   }
28907a4ac22SEnrico Granata 
29005097246SAdrian Prantl   // if we are at an offset from our parent, in order to set ourselves
29105097246SAdrian Prantl   // correctly we would need to change the new value so that it refers to the
29205097246SAdrian Prantl   // correct dynamic type. we choose not to deal with that - if anything more
29305097246SAdrian Prantl   // than a value overwrite is required, you should be using the expression
29405097246SAdrian Prantl   // parser instead of the value editing facility
295b9c1b51eSKate Stone   if (my_value != parent_value) {
29607a4ac22SEnrico Granata     // but NULL'ing out a value should always be allowed
297b9c1b51eSKate Stone     if (strcmp(value_str, "0")) {
298b9c1b51eSKate Stone       error.SetErrorString(
299b9c1b51eSKate Stone           "unable to modify dynamic value, use 'expression' command");
30007a4ac22SEnrico Granata       return false;
30107a4ac22SEnrico Granata     }
30207a4ac22SEnrico Granata   }
30307a4ac22SEnrico Granata 
30407a4ac22SEnrico Granata   bool ret_val = m_parent->SetValueFromCString(value_str, error);
30507a4ac22SEnrico Granata   SetNeedsUpdate();
30607a4ac22SEnrico Granata   return ret_val;
30707a4ac22SEnrico Granata }
308389823e9SSean Callanan 
30997206d57SZachary Turner bool ValueObjectDynamicValue::SetData(DataExtractor &data, Status &error) {
310b9c1b51eSKate Stone   if (!UpdateValueIfNeeded(false)) {
311389823e9SSean Callanan     error.SetErrorString("unable to read value");
312389823e9SSean Callanan     return false;
313389823e9SSean Callanan   }
314389823e9SSean Callanan 
315389823e9SSean Callanan   uint64_t my_value = GetValueAsUnsigned(UINT64_MAX);
316389823e9SSean Callanan   uint64_t parent_value = m_parent->GetValueAsUnsigned(UINT64_MAX);
317389823e9SSean Callanan 
318b9c1b51eSKate Stone   if (my_value == UINT64_MAX || parent_value == UINT64_MAX) {
319389823e9SSean Callanan     error.SetErrorString("unable to read value");
320389823e9SSean Callanan     return false;
321389823e9SSean Callanan   }
322389823e9SSean Callanan 
32305097246SAdrian Prantl   // if we are at an offset from our parent, in order to set ourselves
32405097246SAdrian Prantl   // correctly we would need to change the new value so that it refers to the
32505097246SAdrian Prantl   // correct dynamic type. we choose not to deal with that - if anything more
32605097246SAdrian Prantl   // than a value overwrite is required, you should be using the expression
32705097246SAdrian Prantl   // parser instead of the value editing facility
328b9c1b51eSKate Stone   if (my_value != parent_value) {
329389823e9SSean Callanan     // but NULL'ing out a value should always be allowed
330389823e9SSean Callanan     lldb::offset_t offset = 0;
331389823e9SSean Callanan 
332b9c1b51eSKate Stone     if (data.GetPointer(&offset) != 0) {
333b9c1b51eSKate Stone       error.SetErrorString(
334b9c1b51eSKate Stone           "unable to modify dynamic value, use 'expression' command");
335389823e9SSean Callanan       return false;
336389823e9SSean Callanan     }
337389823e9SSean Callanan   }
338389823e9SSean Callanan 
339389823e9SSean Callanan   bool ret_val = m_parent->SetData(data, error);
340389823e9SSean Callanan   SetNeedsUpdate();
341389823e9SSean Callanan   return ret_val;
342389823e9SSean Callanan }
3439851b1f6SSiva Chandra 
344b9c1b51eSKate Stone void ValueObjectDynamicValue::SetPreferredDisplayLanguage(
345b9c1b51eSKate Stone     lldb::LanguageType lang) {
34673e8c4d0SEnrico Granata   this->ValueObject::SetPreferredDisplayLanguage(lang);
34773e8c4d0SEnrico Granata   if (m_parent)
34873e8c4d0SEnrico Granata     m_parent->SetPreferredDisplayLanguage(lang);
34973e8c4d0SEnrico Granata }
35073e8c4d0SEnrico Granata 
351b9c1b51eSKate Stone lldb::LanguageType ValueObjectDynamicValue::GetPreferredDisplayLanguage() {
352b9c1b51eSKate Stone   if (m_preferred_display_language == lldb::eLanguageTypeUnknown) {
35373e8c4d0SEnrico Granata     if (m_parent)
35473e8c4d0SEnrico Granata       return m_parent->GetPreferredDisplayLanguage();
35573e8c4d0SEnrico Granata     return lldb::eLanguageTypeUnknown;
356b9c1b51eSKate Stone   } else
35773e8c4d0SEnrico Granata     return m_preferred_display_language;
35873e8c4d0SEnrico Granata }
35973e8c4d0SEnrico Granata 
360b9c1b51eSKate Stone bool ValueObjectDynamicValue::IsSyntheticChildrenGenerated() {
3613b207c66SEnrico Granata   if (m_parent)
3623b207c66SEnrico Granata     return m_parent->IsSyntheticChildrenGenerated();
3633b207c66SEnrico Granata   return false;
3643b207c66SEnrico Granata }
3653b207c66SEnrico Granata 
366b9c1b51eSKate Stone void ValueObjectDynamicValue::SetSyntheticChildrenGenerated(bool b) {
3673b207c66SEnrico Granata   if (m_parent)
3683b207c66SEnrico Granata     m_parent->SetSyntheticChildrenGenerated(b);
3693b207c66SEnrico Granata   this->ValueObject::SetSyntheticChildrenGenerated(b);
3703b207c66SEnrico Granata }
3713b207c66SEnrico Granata 
372b9c1b51eSKate Stone bool ValueObjectDynamicValue::GetDeclaration(Declaration &decl) {
3739851b1f6SSiva Chandra   if (m_parent)
3749851b1f6SSiva Chandra     return m_parent->GetDeclaration(decl);
3759851b1f6SSiva Chandra 
3769851b1f6SSiva Chandra   return ValueObject::GetDeclaration(decl);
3779851b1f6SSiva Chandra }
378dc62ffd3SEnrico Granata 
379b9c1b51eSKate Stone uint64_t ValueObjectDynamicValue::GetLanguageFlags() {
380dc62ffd3SEnrico Granata   if (m_parent)
381dc62ffd3SEnrico Granata     return m_parent->GetLanguageFlags();
382dc62ffd3SEnrico Granata   return this->ValueObject::GetLanguageFlags();
383dc62ffd3SEnrico Granata }
384dc62ffd3SEnrico Granata 
385b9c1b51eSKate Stone void ValueObjectDynamicValue::SetLanguageFlags(uint64_t flags) {
386dc62ffd3SEnrico Granata   if (m_parent)
387dc62ffd3SEnrico Granata     m_parent->SetLanguageFlags(flags);
388dc62ffd3SEnrico Granata   else
389dc62ffd3SEnrico Granata     this->ValueObject::SetLanguageFlags(flags);
390dc62ffd3SEnrico Granata }
391