180814287SRaphael Isemann //===-- ValueObjectDynamicValue.cpp ---------------------------------------===//
278a685aaSJim Ingham //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
678a685aaSJim Ingham //
778a685aaSJim Ingham //===----------------------------------------------------------------------===//
878a685aaSJim Ingham 
978a685aaSJim Ingham #include "lldb/Core/ValueObjectDynamicValue.h"
1078a685aaSJim Ingham #include "lldb/Core/Value.h"
1178a685aaSJim Ingham #include "lldb/Core/ValueObject.h"
12a1e5dc86SGreg Clayton #include "lldb/Symbol/CompilerType.h"
1378a685aaSJim Ingham #include "lldb/Symbol/Type.h"
1478a685aaSJim Ingham #include "lldb/Target/ExecutionContext.h"
1578a685aaSJim Ingham #include "lldb/Target/LanguageRuntime.h"
1678a685aaSJim Ingham #include "lldb/Target/Process.h"
1778a685aaSJim Ingham #include "lldb/Target/Target.h"
18672d2c12SJonas Devlieghere #include "lldb/Utility/DataExtractor.h"
19c34698a8SPavel Labath #include "lldb/Utility/LLDBLog.h"
202f3df613SZachary Turner #include "lldb/Utility/Log.h"
21672d2c12SJonas Devlieghere #include "lldb/Utility/Scalar.h"
22672d2c12SJonas Devlieghere #include "lldb/Utility/Status.h"
23672d2c12SJonas Devlieghere #include "lldb/lldb-types.h"
242f3df613SZachary Turner 
2576e47d48SRaphael Isemann #include <cstring>
262f3df613SZachary Turner namespace lldb_private {
272f3df613SZachary Turner class Declaration;
282f3df613SZachary Turner }
2978a685aaSJim Ingham 
3078a685aaSJim Ingham using namespace lldb_private;
3178a685aaSJim Ingham 
ValueObjectDynamicValue(ValueObject & parent,lldb::DynamicValueType use_dynamic)32b9c1b51eSKate Stone ValueObjectDynamicValue::ValueObjectDynamicValue(
33b9c1b51eSKate Stone     ValueObject &parent, lldb::DynamicValueType use_dynamic)
34b9c1b51eSKate Stone     : ValueObject(parent), m_address(), m_dynamic_type_info(),
35b9c1b51eSKate Stone       m_use_dynamic(use_dynamic) {
366f3533fbSEnrico Granata   SetName(parent.GetName());
3778a685aaSJim Ingham }
3878a685aaSJim Ingham 
GetCompilerTypeImpl()39b9c1b51eSKate Stone CompilerType ValueObjectDynamicValue::GetCompilerTypeImpl() {
40dc4db5a6SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
41b9c1b51eSKate Stone   if (success) {
42dc4db5a6SEnrico Granata     if (m_dynamic_type_info.HasType())
4399558cc4SGreg Clayton       return m_value.GetCompilerType();
4478a685aaSJim Ingham     else
4599558cc4SGreg Clayton       return m_parent->GetCompilerType();
4678a685aaSJim Ingham   }
4799558cc4SGreg Clayton   return m_parent->GetCompilerType();
48dc4db5a6SEnrico Granata }
4978a685aaSJim Ingham 
GetTypeName()50b9c1b51eSKate Stone ConstString ValueObjectDynamicValue::GetTypeName() {
51c3e320a7SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
52b9c1b51eSKate Stone   if (success) {
53f7b1a34eSEnrico Granata     if (m_dynamic_type_info.HasName())
54f7b1a34eSEnrico Granata       return m_dynamic_type_info.GetName();
55f7b1a34eSEnrico Granata   }
56f7b1a34eSEnrico Granata   return m_parent->GetTypeName();
57f7b1a34eSEnrico Granata }
58f7b1a34eSEnrico Granata 
GetTypeImpl()59b9c1b51eSKate Stone TypeImpl ValueObjectDynamicValue::GetTypeImpl() {
60dc4db5a6SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
61b9c1b51eSKate Stone   if (success && m_type_impl.IsValid()) {
62dc4db5a6SEnrico Granata     return m_type_impl;
63dc4db5a6SEnrico Granata   }
64dc4db5a6SEnrico Granata   return m_parent->GetTypeImpl();
65dc4db5a6SEnrico Granata }
66dc4db5a6SEnrico Granata 
GetQualifiedTypeName()67b9c1b51eSKate Stone ConstString ValueObjectDynamicValue::GetQualifiedTypeName() {
68f7b1a34eSEnrico Granata   const bool success = UpdateValueIfNeeded(false);
69b9c1b51eSKate Stone   if (success) {
70f7b1a34eSEnrico Granata     if (m_dynamic_type_info.HasName())
71f7b1a34eSEnrico Granata       return m_dynamic_type_info.GetName();
72f7b1a34eSEnrico Granata   }
73e8daa2f8SEnrico Granata   return m_parent->GetQualifiedTypeName();
74e8daa2f8SEnrico Granata }
75e8daa2f8SEnrico Granata 
GetDisplayTypeName()76b9c1b51eSKate Stone ConstString ValueObjectDynamicValue::GetDisplayTypeName() {
77e8daa2f8SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
78b9c1b51eSKate Stone   if (success) {
79e8daa2f8SEnrico Granata     if (m_dynamic_type_info.HasType())
8099558cc4SGreg Clayton       return GetCompilerType().GetDisplayTypeName();
81e8daa2f8SEnrico Granata     if (m_dynamic_type_info.HasName())
82e8daa2f8SEnrico Granata       return m_dynamic_type_info.GetName();
83e8daa2f8SEnrico Granata   }
84e8daa2f8SEnrico Granata   return m_parent->GetDisplayTypeName();
8578a685aaSJim Ingham }
8678a685aaSJim Ingham 
CalculateNumChildren(uint32_t max)87b9c1b51eSKate Stone size_t ValueObjectDynamicValue::CalculateNumChildren(uint32_t max) {
88c3e320a7SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
89b9c1b51eSKate Stone   if (success && m_dynamic_type_info.HasType()) {
90eca07c59SAdrian Prantl     ExecutionContext exe_ctx(GetExecutionContextRef());
91eca07c59SAdrian Prantl     auto children_count = GetCompilerType().GetNumChildren(true, &exe_ctx);
929ac7a6c5SSiva Chandra     return children_count <= max ? children_count : max;
93b9c1b51eSKate Stone   } else
949ac7a6c5SSiva Chandra     return m_parent->GetNumChildren(max);
9578a685aaSJim Ingham }
9678a685aaSJim Ingham 
GetByteSize()97113f56fbSAdrian Prantl llvm::Optional<uint64_t> ValueObjectDynamicValue::GetByteSize() {
98c3e320a7SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
99b9c1b51eSKate Stone   if (success && m_dynamic_type_info.HasType()) {
10095438038SEnrico Granata     ExecutionContext exe_ctx(GetExecutionContextRef());
10195438038SEnrico Granata     return m_value.GetValueByteSize(nullptr, &exe_ctx);
102b9c1b51eSKate Stone   } else
10378a685aaSJim Ingham     return m_parent->GetByteSize();
10478a685aaSJim Ingham }
10578a685aaSJim Ingham 
GetValueType() const106b9c1b51eSKate Stone lldb::ValueType ValueObjectDynamicValue::GetValueType() const {
10778a685aaSJim Ingham   return m_parent->GetValueType();
10878a685aaSJim Ingham }
10978a685aaSJim Ingham 
UpdateValue()110b9c1b51eSKate Stone bool ValueObjectDynamicValue::UpdateValue() {
11178a685aaSJim Ingham   SetValueIsValid(false);
11278a685aaSJim Ingham   m_error.Clear();
11378a685aaSJim Ingham 
114b9c1b51eSKate Stone   if (!m_parent->UpdateValueIfNeeded(false)) {
115007d5be6SGreg Clayton     // The dynamic value failed to get an error, pass the error along
116007d5be6SGreg Clayton     if (m_error.Success() && m_parent->GetError().Fail())
117007d5be6SGreg Clayton       m_error = m_parent->GetError();
11878a685aaSJim Ingham     return false;
11978a685aaSJim Ingham   }
12078a685aaSJim Ingham 
12105097246SAdrian Prantl   // Setting our type_sp to NULL will route everything back through our parent
12205097246SAdrian Prantl   // which is equivalent to not using dynamic values.
123b9c1b51eSKate Stone   if (m_use_dynamic == lldb::eNoDynamicValues) {
124f7b1a34eSEnrico Granata     m_dynamic_type_info.Clear();
1252837b766SJim Ingham     return true;
1262837b766SJim Ingham   }
1272837b766SJim Ingham 
128cc4d0146SGreg Clayton   ExecutionContext exe_ctx(GetExecutionContextRef());
129c14ee32dSGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
130b9c1b51eSKate Stone   if (target) {
131c14ee32dSGreg Clayton     m_data.SetByteOrder(target->GetArchitecture().GetByteOrder());
132c14ee32dSGreg Clayton     m_data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
13378a685aaSJim Ingham   }
13478a685aaSJim Ingham 
13578a685aaSJim Ingham   // First make sure our Type and/or Address haven't changed:
136cc4d0146SGreg Clayton   Process *process = exe_ctx.GetProcessPtr();
13778a685aaSJim Ingham   if (!process)
13878a685aaSJim Ingham     return false;
13978a685aaSJim Ingham 
14061be0903SJim Ingham   TypeAndOrName class_type_or_name;
14178a685aaSJim Ingham   Address dynamic_address;
14278a685aaSJim Ingham   bool found_dynamic_type = false;
1430b6003f3SEnrico Granata   Value::ValueType value_type;
14478a685aaSJim Ingham 
145c74275bcSEnrico Granata   LanguageRuntime *runtime = nullptr;
146c74275bcSEnrico Granata 
14778a685aaSJim Ingham   lldb::LanguageType known_type = m_parent->GetObjectRuntimeLanguage();
148b9c1b51eSKate Stone   if (known_type != lldb::eLanguageTypeUnknown &&
149b9c1b51eSKate Stone       known_type != lldb::eLanguageTypeC) {
150c74275bcSEnrico Granata     runtime = process->GetLanguageRuntime(known_type);
15178a685aaSJim Ingham     if (runtime)
152b9c1b51eSKate Stone       found_dynamic_type = runtime->GetDynamicTypeAndAddress(
153b9c1b51eSKate Stone           *m_parent, m_use_dynamic, class_type_or_name, dynamic_address,
154b9c1b51eSKate Stone           value_type);
155b9c1b51eSKate Stone   } else {
156c74275bcSEnrico Granata     runtime = process->GetLanguageRuntime(lldb::eLanguageTypeC_plus_plus);
157c74275bcSEnrico Granata     if (runtime)
158b9c1b51eSKate Stone       found_dynamic_type = runtime->GetDynamicTypeAndAddress(
159b9c1b51eSKate Stone           *m_parent, m_use_dynamic, class_type_or_name, dynamic_address,
160b9c1b51eSKate Stone           value_type);
16178a685aaSJim Ingham 
162b9c1b51eSKate Stone     if (!found_dynamic_type) {
163c74275bcSEnrico Granata       runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC);
164c74275bcSEnrico Granata       if (runtime)
165b9c1b51eSKate Stone         found_dynamic_type = runtime->GetDynamicTypeAndAddress(
166b9c1b51eSKate Stone             *m_parent, m_use_dynamic, class_type_or_name, dynamic_address,
167b9c1b51eSKate Stone             value_type);
16878a685aaSJim Ingham     }
16978a685aaSJim Ingham   }
17078a685aaSJim Ingham 
171b9c1b51eSKate Stone   // Getting the dynamic value may have run the program a bit, and so marked us
17205097246SAdrian Prantl   // as needing updating, but we really don't...
17361be0903SJim Ingham 
17461be0903SJim Ingham   m_update_point.SetUpdated();
17561be0903SJim Ingham 
176b9c1b51eSKate Stone   if (runtime && found_dynamic_type) {
177b9c1b51eSKate Stone     if (class_type_or_name.HasType()) {
178b9c1b51eSKate Stone       m_type_impl =
179b9c1b51eSKate Stone           TypeImpl(m_parent->GetCompilerType(),
180b9c1b51eSKate Stone                    runtime->FixUpDynamicType(class_type_or_name, *m_parent)
181b9c1b51eSKate Stone                        .GetCompilerType());
182b9c1b51eSKate Stone     } else {
183df7c7f99SEnrico Granata       m_type_impl.Clear();
184df7c7f99SEnrico Granata     }
185b9c1b51eSKate Stone   } else {
186df7c7f99SEnrico Granata     m_type_impl.Clear();
187df7c7f99SEnrico Granata   }
188dc4db5a6SEnrico Granata 
189b9c1b51eSKate Stone   // If we don't have a dynamic type, then make ourselves just a echo of our
19005097246SAdrian Prantl   // parent. Or we could return false, and make ourselves an echo of our
19105097246SAdrian Prantl   // parent?
192b9c1b51eSKate Stone   if (!found_dynamic_type) {
193f7b1a34eSEnrico Granata     if (m_dynamic_type_info)
19475badc46SEnrico Granata       SetValueDidChange(true);
195bd83b87dSEnrico Granata     ClearDynamicTypeInformation();
196f7b1a34eSEnrico Granata     m_dynamic_type_info.Clear();
19778a685aaSJim Ingham     m_value = m_parent->GetValue();
198d9cbd2acSAdrian Prantl     m_error = m_value.GetValueAsData(&exe_ctx, m_data, GetModule().get());
19978a685aaSJim Ingham     return m_error.Success();
20078a685aaSJim Ingham   }
20178a685aaSJim Ingham 
20278a685aaSJim Ingham   Value old_value(m_value);
20378a685aaSJim Ingham 
204*ccba163dSPavel Labath   Log *log = GetLog(LLDBLog::Types);
205d228483dSEnrico Granata 
206e3e91517SEnrico Granata   bool has_changed_type = false;
207e3e91517SEnrico Granata 
208b9c1b51eSKate Stone   if (!m_dynamic_type_info) {
209f7b1a34eSEnrico Granata     m_dynamic_type_info = class_type_or_name;
210e3e91517SEnrico Granata     has_changed_type = true;
211b9c1b51eSKate Stone   } else if (class_type_or_name != m_dynamic_type_info) {
21278a685aaSJim Ingham     // We are another type, we need to tear down our children...
213f7b1a34eSEnrico Granata     m_dynamic_type_info = class_type_or_name;
21478a685aaSJim Ingham     SetValueDidChange(true);
215e3e91517SEnrico Granata     has_changed_type = true;
21678a685aaSJim Ingham   }
21778a685aaSJim Ingham 
218e3e91517SEnrico Granata   if (has_changed_type)
219e3e91517SEnrico Granata     ClearDynamicTypeInformation();
220e3e91517SEnrico Granata 
221b9c1b51eSKate Stone   if (!m_address.IsValid() || m_address != dynamic_address) {
22278a685aaSJim Ingham     if (m_address.IsValid())
22378a685aaSJim Ingham       SetValueDidChange(true);
22478a685aaSJim Ingham 
22578a685aaSJim Ingham     // We've moved, so we should be fine...
22678a685aaSJim Ingham     m_address = dynamic_address;
227cc4d0146SGreg Clayton     lldb::TargetSP target_sp(GetTargetSP());
228cc4d0146SGreg Clayton     lldb::addr_t load_address = m_address.GetLoadAddress(target_sp.get());
22978a685aaSJim Ingham     m_value.GetScalar() = load_address;
23078a685aaSJim Ingham   }
23178a685aaSJim Ingham 
232c74275bcSEnrico Granata   if (runtime)
233b9c1b51eSKate Stone     m_dynamic_type_info =
234b9c1b51eSKate Stone         runtime->FixUpDynamicType(m_dynamic_type_info, *m_parent);
23578a685aaSJim Ingham 
23699558cc4SGreg Clayton   m_value.SetCompilerType(m_dynamic_type_info.GetCompilerType());
23778a685aaSJim Ingham 
2380b6003f3SEnrico Granata   m_value.SetValueType(value_type);
23978a685aaSJim Ingham 
240e3e91517SEnrico Granata   if (has_changed_type && log)
24163e5fb76SJonas Devlieghere     LLDB_LOGF(log, "[%s %p] has a new dynamic type %s", GetName().GetCString(),
242324a1036SSaleem Abdulrasool               static_cast<void *>(this), GetTypeName().GetCString());
243e3e91517SEnrico Granata 
244b9c1b51eSKate Stone   if (m_address.IsValid() && m_dynamic_type_info) {
24505097246SAdrian Prantl     // The variable value is in the Scalar value inside the m_value. We can
24605097246SAdrian Prantl     // point our m_data right to it.
247d9cbd2acSAdrian Prantl     m_error = m_value.GetValueAsData(&exe_ctx, m_data, GetModule().get());
248b9c1b51eSKate Stone     if (m_error.Success()) {
249b9c1b51eSKate Stone       if (!CanProvideValue()) {
25005097246SAdrian Prantl         // this value object represents an aggregate type whose children have
25105097246SAdrian Prantl         // values, but this object does not. So we say we are changed if our
25205097246SAdrian Prantl         // location has changed.
253b9c1b51eSKate Stone         SetValueDidChange(m_value.GetValueType() != old_value.GetValueType() ||
254b9c1b51eSKate Stone                           m_value.GetScalar() != old_value.GetScalar());
25578a685aaSJim Ingham       }
25678a685aaSJim Ingham 
25778a685aaSJim Ingham       SetValueIsValid(true);
25878a685aaSJim Ingham       return true;
25978a685aaSJim Ingham     }
26078a685aaSJim Ingham   }
26178a685aaSJim Ingham 
26278a685aaSJim Ingham   // We get here if we've failed above...
26378a685aaSJim Ingham   SetValueIsValid(false);
26478a685aaSJim Ingham   return false;
26578a685aaSJim Ingham }
26678a685aaSJim Ingham 
IsInScope()267b9c1b51eSKate Stone bool ValueObjectDynamicValue::IsInScope() { return m_parent->IsInScope(); }
26878a685aaSJim Ingham 
SetValueFromCString(const char * value_str,Status & error)269b9c1b51eSKate Stone bool ValueObjectDynamicValue::SetValueFromCString(const char *value_str,
27097206d57SZachary Turner                                                   Status &error) {
271b9c1b51eSKate Stone   if (!UpdateValueIfNeeded(false)) {
27207a4ac22SEnrico Granata     error.SetErrorString("unable to read value");
27307a4ac22SEnrico Granata     return false;
27407a4ac22SEnrico Granata   }
27507a4ac22SEnrico Granata 
27607a4ac22SEnrico Granata   uint64_t my_value = GetValueAsUnsigned(UINT64_MAX);
27707a4ac22SEnrico Granata   uint64_t parent_value = m_parent->GetValueAsUnsigned(UINT64_MAX);
27807a4ac22SEnrico Granata 
279b9c1b51eSKate Stone   if (my_value == UINT64_MAX || parent_value == UINT64_MAX) {
28007a4ac22SEnrico Granata     error.SetErrorString("unable to read value");
28107a4ac22SEnrico Granata     return false;
28207a4ac22SEnrico Granata   }
28307a4ac22SEnrico Granata 
28405097246SAdrian Prantl   // if we are at an offset from our parent, in order to set ourselves
28505097246SAdrian Prantl   // correctly we would need to change the new value so that it refers to the
28605097246SAdrian Prantl   // correct dynamic type. we choose not to deal with that - if anything more
28705097246SAdrian Prantl   // than a value overwrite is required, you should be using the expression
28805097246SAdrian Prantl   // parser instead of the value editing facility
289b9c1b51eSKate Stone   if (my_value != parent_value) {
29007a4ac22SEnrico Granata     // but NULL'ing out a value should always be allowed
291b9c1b51eSKate Stone     if (strcmp(value_str, "0")) {
292b9c1b51eSKate Stone       error.SetErrorString(
293b9c1b51eSKate Stone           "unable to modify dynamic value, use 'expression' command");
29407a4ac22SEnrico Granata       return false;
29507a4ac22SEnrico Granata     }
29607a4ac22SEnrico Granata   }
29707a4ac22SEnrico Granata 
29807a4ac22SEnrico Granata   bool ret_val = m_parent->SetValueFromCString(value_str, error);
29907a4ac22SEnrico Granata   SetNeedsUpdate();
30007a4ac22SEnrico Granata   return ret_val;
30107a4ac22SEnrico Granata }
302389823e9SSean Callanan 
SetData(DataExtractor & data,Status & error)30397206d57SZachary Turner bool ValueObjectDynamicValue::SetData(DataExtractor &data, Status &error) {
304b9c1b51eSKate Stone   if (!UpdateValueIfNeeded(false)) {
305389823e9SSean Callanan     error.SetErrorString("unable to read value");
306389823e9SSean Callanan     return false;
307389823e9SSean Callanan   }
308389823e9SSean Callanan 
309389823e9SSean Callanan   uint64_t my_value = GetValueAsUnsigned(UINT64_MAX);
310389823e9SSean Callanan   uint64_t parent_value = m_parent->GetValueAsUnsigned(UINT64_MAX);
311389823e9SSean Callanan 
312b9c1b51eSKate Stone   if (my_value == UINT64_MAX || parent_value == UINT64_MAX) {
313389823e9SSean Callanan     error.SetErrorString("unable to read value");
314389823e9SSean Callanan     return false;
315389823e9SSean Callanan   }
316389823e9SSean Callanan 
31705097246SAdrian Prantl   // if we are at an offset from our parent, in order to set ourselves
31805097246SAdrian Prantl   // correctly we would need to change the new value so that it refers to the
31905097246SAdrian Prantl   // correct dynamic type. we choose not to deal with that - if anything more
32005097246SAdrian Prantl   // than a value overwrite is required, you should be using the expression
32105097246SAdrian Prantl   // parser instead of the value editing facility
322b9c1b51eSKate Stone   if (my_value != parent_value) {
323389823e9SSean Callanan     // but NULL'ing out a value should always be allowed
324389823e9SSean Callanan     lldb::offset_t offset = 0;
325389823e9SSean Callanan 
3260863f675SPavel Labath     if (data.GetAddress(&offset) != 0) {
327b9c1b51eSKate Stone       error.SetErrorString(
328b9c1b51eSKate Stone           "unable to modify dynamic value, use 'expression' command");
329389823e9SSean Callanan       return false;
330389823e9SSean Callanan     }
331389823e9SSean Callanan   }
332389823e9SSean Callanan 
333389823e9SSean Callanan   bool ret_val = m_parent->SetData(data, error);
334389823e9SSean Callanan   SetNeedsUpdate();
335389823e9SSean Callanan   return ret_val;
336389823e9SSean Callanan }
3379851b1f6SSiva Chandra 
SetPreferredDisplayLanguage(lldb::LanguageType lang)338b9c1b51eSKate Stone void ValueObjectDynamicValue::SetPreferredDisplayLanguage(
339b9c1b51eSKate Stone     lldb::LanguageType lang) {
34073e8c4d0SEnrico Granata   this->ValueObject::SetPreferredDisplayLanguage(lang);
34173e8c4d0SEnrico Granata   if (m_parent)
34273e8c4d0SEnrico Granata     m_parent->SetPreferredDisplayLanguage(lang);
34373e8c4d0SEnrico Granata }
34473e8c4d0SEnrico Granata 
GetPreferredDisplayLanguage()345b9c1b51eSKate Stone lldb::LanguageType ValueObjectDynamicValue::GetPreferredDisplayLanguage() {
346b9c1b51eSKate Stone   if (m_preferred_display_language == lldb::eLanguageTypeUnknown) {
34773e8c4d0SEnrico Granata     if (m_parent)
34873e8c4d0SEnrico Granata       return m_parent->GetPreferredDisplayLanguage();
34973e8c4d0SEnrico Granata     return lldb::eLanguageTypeUnknown;
350b9c1b51eSKate Stone   } else
35173e8c4d0SEnrico Granata     return m_preferred_display_language;
35273e8c4d0SEnrico Granata }
35373e8c4d0SEnrico Granata 
IsSyntheticChildrenGenerated()354b9c1b51eSKate Stone bool ValueObjectDynamicValue::IsSyntheticChildrenGenerated() {
3553b207c66SEnrico Granata   if (m_parent)
3563b207c66SEnrico Granata     return m_parent->IsSyntheticChildrenGenerated();
3573b207c66SEnrico Granata   return false;
3583b207c66SEnrico Granata }
3593b207c66SEnrico Granata 
SetSyntheticChildrenGenerated(bool b)360b9c1b51eSKate Stone void ValueObjectDynamicValue::SetSyntheticChildrenGenerated(bool b) {
3613b207c66SEnrico Granata   if (m_parent)
3623b207c66SEnrico Granata     m_parent->SetSyntheticChildrenGenerated(b);
3633b207c66SEnrico Granata   this->ValueObject::SetSyntheticChildrenGenerated(b);
3643b207c66SEnrico Granata }
3653b207c66SEnrico Granata 
GetDeclaration(Declaration & decl)366b9c1b51eSKate Stone bool ValueObjectDynamicValue::GetDeclaration(Declaration &decl) {
3679851b1f6SSiva Chandra   if (m_parent)
3689851b1f6SSiva Chandra     return m_parent->GetDeclaration(decl);
3699851b1f6SSiva Chandra 
3709851b1f6SSiva Chandra   return ValueObject::GetDeclaration(decl);
3719851b1f6SSiva Chandra }
372dc62ffd3SEnrico Granata 
GetLanguageFlags()373b9c1b51eSKate Stone uint64_t ValueObjectDynamicValue::GetLanguageFlags() {
374dc62ffd3SEnrico Granata   if (m_parent)
375dc62ffd3SEnrico Granata     return m_parent->GetLanguageFlags();
376dc62ffd3SEnrico Granata   return this->ValueObject::GetLanguageFlags();
377dc62ffd3SEnrico Granata }
378dc62ffd3SEnrico Granata 
SetLanguageFlags(uint64_t flags)379b9c1b51eSKate Stone void ValueObjectDynamicValue::SetLanguageFlags(uint64_t flags) {
380dc62ffd3SEnrico Granata   if (m_parent)
381dc62ffd3SEnrico Granata     m_parent->SetLanguageFlags(flags);
382dc62ffd3SEnrico Granata   else
383dc62ffd3SEnrico Granata     this->ValueObject::SetLanguageFlags(flags);
384dc62ffd3SEnrico Granata }
385