12f3df613SZachary Turner //===-- ValueObjectDynamicValue.cpp ------------------------------*- C++-*-===//
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"
192f3df613SZachary Turner #include "lldb/Utility/Log.h"
20672d2c12SJonas Devlieghere #include "lldb/Utility/Logging.h"
21672d2c12SJonas Devlieghere #include "lldb/Utility/Scalar.h"
22672d2c12SJonas Devlieghere #include "lldb/Utility/Status.h"
23672d2c12SJonas Devlieghere #include "lldb/lldb-types.h"
242f3df613SZachary Turner 
25672d2c12SJonas Devlieghere #include <string.h>
262f3df613SZachary Turner namespace lldb_private {
272f3df613SZachary Turner class Declaration;
282f3df613SZachary Turner }
2978a685aaSJim Ingham 
3078a685aaSJim Ingham using namespace lldb_private;
3178a685aaSJim Ingham 
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 
39b9c1b51eSKate Stone ValueObjectDynamicValue::~ValueObjectDynamicValue() {
4078a685aaSJim Ingham   m_owning_valobj_sp.reset();
4178a685aaSJim Ingham }
4278a685aaSJim Ingham 
43b9c1b51eSKate Stone CompilerType ValueObjectDynamicValue::GetCompilerTypeImpl() {
44dc4db5a6SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
45b9c1b51eSKate Stone   if (success) {
46dc4db5a6SEnrico Granata     if (m_dynamic_type_info.HasType())
4799558cc4SGreg Clayton       return m_value.GetCompilerType();
4878a685aaSJim Ingham     else
4999558cc4SGreg Clayton       return m_parent->GetCompilerType();
5078a685aaSJim Ingham   }
5199558cc4SGreg Clayton   return m_parent->GetCompilerType();
52dc4db5a6SEnrico Granata }
5378a685aaSJim Ingham 
54b9c1b51eSKate Stone ConstString ValueObjectDynamicValue::GetTypeName() {
55c3e320a7SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
56b9c1b51eSKate Stone   if (success) {
57f7b1a34eSEnrico Granata     if (m_dynamic_type_info.HasName())
58f7b1a34eSEnrico Granata       return m_dynamic_type_info.GetName();
59f7b1a34eSEnrico Granata   }
60f7b1a34eSEnrico Granata   return m_parent->GetTypeName();
61f7b1a34eSEnrico Granata }
62f7b1a34eSEnrico Granata 
63b9c1b51eSKate Stone TypeImpl ValueObjectDynamicValue::GetTypeImpl() {
64dc4db5a6SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
65b9c1b51eSKate Stone   if (success && m_type_impl.IsValid()) {
66dc4db5a6SEnrico Granata     return m_type_impl;
67dc4db5a6SEnrico Granata   }
68dc4db5a6SEnrico Granata   return m_parent->GetTypeImpl();
69dc4db5a6SEnrico Granata }
70dc4db5a6SEnrico Granata 
71b9c1b51eSKate Stone ConstString ValueObjectDynamicValue::GetQualifiedTypeName() {
72f7b1a34eSEnrico Granata   const bool success = UpdateValueIfNeeded(false);
73b9c1b51eSKate Stone   if (success) {
74f7b1a34eSEnrico Granata     if (m_dynamic_type_info.HasName())
75f7b1a34eSEnrico Granata       return m_dynamic_type_info.GetName();
76f7b1a34eSEnrico Granata   }
77e8daa2f8SEnrico Granata   return m_parent->GetQualifiedTypeName();
78e8daa2f8SEnrico Granata }
79e8daa2f8SEnrico Granata 
80b9c1b51eSKate Stone ConstString ValueObjectDynamicValue::GetDisplayTypeName() {
81e8daa2f8SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
82b9c1b51eSKate Stone   if (success) {
83e8daa2f8SEnrico Granata     if (m_dynamic_type_info.HasType())
8499558cc4SGreg Clayton       return GetCompilerType().GetDisplayTypeName();
85e8daa2f8SEnrico Granata     if (m_dynamic_type_info.HasName())
86e8daa2f8SEnrico Granata       return m_dynamic_type_info.GetName();
87e8daa2f8SEnrico Granata   }
88e8daa2f8SEnrico Granata   return m_parent->GetDisplayTypeName();
8978a685aaSJim Ingham }
9078a685aaSJim Ingham 
91b9c1b51eSKate Stone size_t ValueObjectDynamicValue::CalculateNumChildren(uint32_t max) {
92c3e320a7SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
93b9c1b51eSKate Stone   if (success && m_dynamic_type_info.HasType()) {
94eca07c59SAdrian Prantl     ExecutionContext exe_ctx(GetExecutionContextRef());
95eca07c59SAdrian Prantl     auto children_count = GetCompilerType().GetNumChildren(true, &exe_ctx);
969ac7a6c5SSiva Chandra     return children_count <= max ? children_count : max;
97b9c1b51eSKate Stone   } else
989ac7a6c5SSiva Chandra     return m_parent->GetNumChildren(max);
9978a685aaSJim Ingham }
10078a685aaSJim Ingham 
101b9c1b51eSKate Stone uint64_t ValueObjectDynamicValue::GetByteSize() {
102c3e320a7SEnrico Granata   const bool success = UpdateValueIfNeeded(false);
103b9c1b51eSKate Stone   if (success && m_dynamic_type_info.HasType()) {
10495438038SEnrico Granata     ExecutionContext exe_ctx(GetExecutionContextRef());
10595438038SEnrico Granata     return m_value.GetValueByteSize(nullptr, &exe_ctx);
106b9c1b51eSKate Stone   } else
10778a685aaSJim Ingham     return m_parent->GetByteSize();
10878a685aaSJim Ingham }
10978a685aaSJim Ingham 
110b9c1b51eSKate Stone lldb::ValueType ValueObjectDynamicValue::GetValueType() const {
11178a685aaSJim Ingham   return m_parent->GetValueType();
11278a685aaSJim Ingham }
11378a685aaSJim Ingham 
114b9c1b51eSKate Stone bool ValueObjectDynamicValue::UpdateValue() {
11578a685aaSJim Ingham   SetValueIsValid(false);
11678a685aaSJim Ingham   m_error.Clear();
11778a685aaSJim Ingham 
118b9c1b51eSKate Stone   if (!m_parent->UpdateValueIfNeeded(false)) {
119007d5be6SGreg Clayton     // The dynamic value failed to get an error, pass the error along
120007d5be6SGreg Clayton     if (m_error.Success() && m_parent->GetError().Fail())
121007d5be6SGreg Clayton       m_error = m_parent->GetError();
12278a685aaSJim Ingham     return false;
12378a685aaSJim Ingham   }
12478a685aaSJim Ingham 
12505097246SAdrian Prantl   // Setting our type_sp to NULL will route everything back through our parent
12605097246SAdrian Prantl   // which is equivalent to not using dynamic values.
127b9c1b51eSKate Stone   if (m_use_dynamic == lldb::eNoDynamicValues) {
128f7b1a34eSEnrico Granata     m_dynamic_type_info.Clear();
1292837b766SJim Ingham     return true;
1302837b766SJim Ingham   }
1312837b766SJim Ingham 
132cc4d0146SGreg Clayton   ExecutionContext exe_ctx(GetExecutionContextRef());
133c14ee32dSGreg Clayton   Target *target = exe_ctx.GetTargetPtr();
134b9c1b51eSKate Stone   if (target) {
135c14ee32dSGreg Clayton     m_data.SetByteOrder(target->GetArchitecture().GetByteOrder());
136c14ee32dSGreg Clayton     m_data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
13778a685aaSJim Ingham   }
13878a685aaSJim Ingham 
13978a685aaSJim Ingham   // First make sure our Type and/or Address haven't changed:
140cc4d0146SGreg Clayton   Process *process = exe_ctx.GetProcessPtr();
14178a685aaSJim Ingham   if (!process)
14278a685aaSJim Ingham     return false;
14378a685aaSJim Ingham 
14461be0903SJim Ingham   TypeAndOrName class_type_or_name;
14578a685aaSJim Ingham   Address dynamic_address;
14678a685aaSJim Ingham   bool found_dynamic_type = false;
1470b6003f3SEnrico Granata   Value::ValueType value_type;
14878a685aaSJim Ingham 
149c74275bcSEnrico Granata   LanguageRuntime *runtime = nullptr;
150c74275bcSEnrico Granata 
15178a685aaSJim Ingham   lldb::LanguageType known_type = m_parent->GetObjectRuntimeLanguage();
152b9c1b51eSKate Stone   if (known_type != lldb::eLanguageTypeUnknown &&
153b9c1b51eSKate Stone       known_type != lldb::eLanguageTypeC) {
154c74275bcSEnrico Granata     runtime = process->GetLanguageRuntime(known_type);
15578a685aaSJim Ingham     if (runtime)
156b9c1b51eSKate Stone       found_dynamic_type = runtime->GetDynamicTypeAndAddress(
157b9c1b51eSKate Stone           *m_parent, m_use_dynamic, class_type_or_name, dynamic_address,
158b9c1b51eSKate Stone           value_type);
159b9c1b51eSKate Stone   } else {
160c74275bcSEnrico Granata     runtime = process->GetLanguageRuntime(lldb::eLanguageTypeC_plus_plus);
161c74275bcSEnrico Granata     if (runtime)
162b9c1b51eSKate Stone       found_dynamic_type = runtime->GetDynamicTypeAndAddress(
163b9c1b51eSKate Stone           *m_parent, m_use_dynamic, class_type_or_name, dynamic_address,
164b9c1b51eSKate Stone           value_type);
16578a685aaSJim Ingham 
166b9c1b51eSKate Stone     if (!found_dynamic_type) {
167c74275bcSEnrico Granata       runtime = process->GetLanguageRuntime(lldb::eLanguageTypeObjC);
168c74275bcSEnrico Granata       if (runtime)
169b9c1b51eSKate Stone         found_dynamic_type = runtime->GetDynamicTypeAndAddress(
170b9c1b51eSKate Stone             *m_parent, m_use_dynamic, class_type_or_name, dynamic_address,
171b9c1b51eSKate Stone             value_type);
17278a685aaSJim Ingham     }
17378a685aaSJim Ingham   }
17478a685aaSJim Ingham 
175b9c1b51eSKate Stone   // Getting the dynamic value may have run the program a bit, and so marked us
17605097246SAdrian Prantl   // as needing updating, but we really don't...
17761be0903SJim Ingham 
17861be0903SJim Ingham   m_update_point.SetUpdated();
17961be0903SJim Ingham 
180b9c1b51eSKate Stone   if (runtime && found_dynamic_type) {
181b9c1b51eSKate Stone     if (class_type_or_name.HasType()) {
182b9c1b51eSKate Stone       m_type_impl =
183b9c1b51eSKate Stone           TypeImpl(m_parent->GetCompilerType(),
184b9c1b51eSKate Stone                    runtime->FixUpDynamicType(class_type_or_name, *m_parent)
185b9c1b51eSKate Stone                        .GetCompilerType());
186b9c1b51eSKate Stone     } else {
187df7c7f99SEnrico Granata       m_type_impl.Clear();
188df7c7f99SEnrico Granata     }
189b9c1b51eSKate Stone   } else {
190df7c7f99SEnrico Granata     m_type_impl.Clear();
191df7c7f99SEnrico Granata   }
192dc4db5a6SEnrico Granata 
193b9c1b51eSKate Stone   // If we don't have a dynamic type, then make ourselves just a echo of our
19405097246SAdrian Prantl   // parent. Or we could return false, and make ourselves an echo of our
19505097246SAdrian Prantl   // parent?
196b9c1b51eSKate Stone   if (!found_dynamic_type) {
197f7b1a34eSEnrico Granata     if (m_dynamic_type_info)
19875badc46SEnrico Granata       SetValueDidChange(true);
199bd83b87dSEnrico Granata     ClearDynamicTypeInformation();
200f7b1a34eSEnrico Granata     m_dynamic_type_info.Clear();
20178a685aaSJim Ingham     m_value = m_parent->GetValue();
202*d9cbd2acSAdrian Prantl     m_error = m_value.GetValueAsData(&exe_ctx, m_data, GetModule().get());
20378a685aaSJim Ingham     return m_error.Success();
20478a685aaSJim Ingham   }
20578a685aaSJim Ingham 
20678a685aaSJim Ingham   Value old_value(m_value);
20778a685aaSJim Ingham 
2085160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TYPES));
209d228483dSEnrico Granata 
210e3e91517SEnrico Granata   bool has_changed_type = false;
211e3e91517SEnrico Granata 
212b9c1b51eSKate Stone   if (!m_dynamic_type_info) {
213f7b1a34eSEnrico Granata     m_dynamic_type_info = class_type_or_name;
214e3e91517SEnrico Granata     has_changed_type = true;
215b9c1b51eSKate Stone   } else if (class_type_or_name != m_dynamic_type_info) {
21678a685aaSJim Ingham     // We are another type, we need to tear down our children...
217f7b1a34eSEnrico Granata     m_dynamic_type_info = class_type_or_name;
21878a685aaSJim Ingham     SetValueDidChange(true);
219e3e91517SEnrico Granata     has_changed_type = true;
22078a685aaSJim Ingham   }
22178a685aaSJim Ingham 
222e3e91517SEnrico Granata   if (has_changed_type)
223e3e91517SEnrico Granata     ClearDynamicTypeInformation();
224e3e91517SEnrico Granata 
225b9c1b51eSKate Stone   if (!m_address.IsValid() || m_address != dynamic_address) {
22678a685aaSJim Ingham     if (m_address.IsValid())
22778a685aaSJim Ingham       SetValueDidChange(true);
22878a685aaSJim Ingham 
22978a685aaSJim Ingham     // We've moved, so we should be fine...
23078a685aaSJim Ingham     m_address = dynamic_address;
231cc4d0146SGreg Clayton     lldb::TargetSP target_sp(GetTargetSP());
232cc4d0146SGreg Clayton     lldb::addr_t load_address = m_address.GetLoadAddress(target_sp.get());
23378a685aaSJim Ingham     m_value.GetScalar() = load_address;
23478a685aaSJim Ingham   }
23578a685aaSJim Ingham 
236c74275bcSEnrico Granata   if (runtime)
237b9c1b51eSKate Stone     m_dynamic_type_info =
238b9c1b51eSKate Stone         runtime->FixUpDynamicType(m_dynamic_type_info, *m_parent);
23978a685aaSJim Ingham 
24057ee3067SGreg Clayton   // m_value.SetContext (Value::eContextTypeClangType, corrected_type);
24199558cc4SGreg Clayton   m_value.SetCompilerType(m_dynamic_type_info.GetCompilerType());
24278a685aaSJim Ingham 
2430b6003f3SEnrico Granata   m_value.SetValueType(value_type);
24478a685aaSJim Ingham 
245e3e91517SEnrico Granata   if (has_changed_type && log)
24663e5fb76SJonas Devlieghere     LLDB_LOGF(log, "[%s %p] has a new dynamic type %s", GetName().GetCString(),
247324a1036SSaleem Abdulrasool               static_cast<void *>(this), GetTypeName().GetCString());
248e3e91517SEnrico Granata 
249b9c1b51eSKate Stone   if (m_address.IsValid() && m_dynamic_type_info) {
25005097246SAdrian Prantl     // The variable value is in the Scalar value inside the m_value. We can
25105097246SAdrian Prantl     // point our m_data right to it.
252*d9cbd2acSAdrian Prantl     m_error = m_value.GetValueAsData(&exe_ctx, m_data, GetModule().get());
253b9c1b51eSKate Stone     if (m_error.Success()) {
254b9c1b51eSKate Stone       if (!CanProvideValue()) {
25505097246SAdrian Prantl         // this value object represents an aggregate type whose children have
25605097246SAdrian Prantl         // values, but this object does not. So we say we are changed if our
25705097246SAdrian Prantl         // location has changed.
258b9c1b51eSKate Stone         SetValueDidChange(m_value.GetValueType() != old_value.GetValueType() ||
259b9c1b51eSKate Stone                           m_value.GetScalar() != old_value.GetScalar());
26078a685aaSJim Ingham       }
26178a685aaSJim Ingham 
26278a685aaSJim Ingham       SetValueIsValid(true);
26378a685aaSJim Ingham       return true;
26478a685aaSJim Ingham     }
26578a685aaSJim Ingham   }
26678a685aaSJim Ingham 
26778a685aaSJim Ingham   // We get here if we've failed above...
26878a685aaSJim Ingham   SetValueIsValid(false);
26978a685aaSJim Ingham   return false;
27078a685aaSJim Ingham }
27178a685aaSJim Ingham 
272b9c1b51eSKate Stone bool ValueObjectDynamicValue::IsInScope() { return m_parent->IsInScope(); }
27378a685aaSJim Ingham 
274b9c1b51eSKate Stone bool ValueObjectDynamicValue::SetValueFromCString(const char *value_str,
27597206d57SZachary Turner                                                   Status &error) {
276b9c1b51eSKate Stone   if (!UpdateValueIfNeeded(false)) {
27707a4ac22SEnrico Granata     error.SetErrorString("unable to read value");
27807a4ac22SEnrico Granata     return false;
27907a4ac22SEnrico Granata   }
28007a4ac22SEnrico Granata 
28107a4ac22SEnrico Granata   uint64_t my_value = GetValueAsUnsigned(UINT64_MAX);
28207a4ac22SEnrico Granata   uint64_t parent_value = m_parent->GetValueAsUnsigned(UINT64_MAX);
28307a4ac22SEnrico Granata 
284b9c1b51eSKate Stone   if (my_value == UINT64_MAX || parent_value == UINT64_MAX) {
28507a4ac22SEnrico Granata     error.SetErrorString("unable to read value");
28607a4ac22SEnrico Granata     return false;
28707a4ac22SEnrico Granata   }
28807a4ac22SEnrico Granata 
28905097246SAdrian Prantl   // if we are at an offset from our parent, in order to set ourselves
29005097246SAdrian Prantl   // correctly we would need to change the new value so that it refers to the
29105097246SAdrian Prantl   // correct dynamic type. we choose not to deal with that - if anything more
29205097246SAdrian Prantl   // than a value overwrite is required, you should be using the expression
29305097246SAdrian Prantl   // parser instead of the value editing facility
294b9c1b51eSKate Stone   if (my_value != parent_value) {
29507a4ac22SEnrico Granata     // but NULL'ing out a value should always be allowed
296b9c1b51eSKate Stone     if (strcmp(value_str, "0")) {
297b9c1b51eSKate Stone       error.SetErrorString(
298b9c1b51eSKate Stone           "unable to modify dynamic value, use 'expression' command");
29907a4ac22SEnrico Granata       return false;
30007a4ac22SEnrico Granata     }
30107a4ac22SEnrico Granata   }
30207a4ac22SEnrico Granata 
30307a4ac22SEnrico Granata   bool ret_val = m_parent->SetValueFromCString(value_str, error);
30407a4ac22SEnrico Granata   SetNeedsUpdate();
30507a4ac22SEnrico Granata   return ret_val;
30607a4ac22SEnrico Granata }
307389823e9SSean Callanan 
30897206d57SZachary Turner bool ValueObjectDynamicValue::SetData(DataExtractor &data, Status &error) {
309b9c1b51eSKate Stone   if (!UpdateValueIfNeeded(false)) {
310389823e9SSean Callanan     error.SetErrorString("unable to read value");
311389823e9SSean Callanan     return false;
312389823e9SSean Callanan   }
313389823e9SSean Callanan 
314389823e9SSean Callanan   uint64_t my_value = GetValueAsUnsigned(UINT64_MAX);
315389823e9SSean Callanan   uint64_t parent_value = m_parent->GetValueAsUnsigned(UINT64_MAX);
316389823e9SSean Callanan 
317b9c1b51eSKate Stone   if (my_value == UINT64_MAX || parent_value == UINT64_MAX) {
318389823e9SSean Callanan     error.SetErrorString("unable to read value");
319389823e9SSean Callanan     return false;
320389823e9SSean Callanan   }
321389823e9SSean Callanan 
32205097246SAdrian Prantl   // if we are at an offset from our parent, in order to set ourselves
32305097246SAdrian Prantl   // correctly we would need to change the new value so that it refers to the
32405097246SAdrian Prantl   // correct dynamic type. we choose not to deal with that - if anything more
32505097246SAdrian Prantl   // than a value overwrite is required, you should be using the expression
32605097246SAdrian Prantl   // parser instead of the value editing facility
327b9c1b51eSKate Stone   if (my_value != parent_value) {
328389823e9SSean Callanan     // but NULL'ing out a value should always be allowed
329389823e9SSean Callanan     lldb::offset_t offset = 0;
330389823e9SSean Callanan 
331b9c1b51eSKate Stone     if (data.GetPointer(&offset) != 0) {
332b9c1b51eSKate Stone       error.SetErrorString(
333b9c1b51eSKate Stone           "unable to modify dynamic value, use 'expression' command");
334389823e9SSean Callanan       return false;
335389823e9SSean Callanan     }
336389823e9SSean Callanan   }
337389823e9SSean Callanan 
338389823e9SSean Callanan   bool ret_val = m_parent->SetData(data, error);
339389823e9SSean Callanan   SetNeedsUpdate();
340389823e9SSean Callanan   return ret_val;
341389823e9SSean Callanan }
3429851b1f6SSiva Chandra 
343b9c1b51eSKate Stone void ValueObjectDynamicValue::SetPreferredDisplayLanguage(
344b9c1b51eSKate Stone     lldb::LanguageType lang) {
34573e8c4d0SEnrico Granata   this->ValueObject::SetPreferredDisplayLanguage(lang);
34673e8c4d0SEnrico Granata   if (m_parent)
34773e8c4d0SEnrico Granata     m_parent->SetPreferredDisplayLanguage(lang);
34873e8c4d0SEnrico Granata }
34973e8c4d0SEnrico Granata 
350b9c1b51eSKate Stone lldb::LanguageType ValueObjectDynamicValue::GetPreferredDisplayLanguage() {
351b9c1b51eSKate Stone   if (m_preferred_display_language == lldb::eLanguageTypeUnknown) {
35273e8c4d0SEnrico Granata     if (m_parent)
35373e8c4d0SEnrico Granata       return m_parent->GetPreferredDisplayLanguage();
35473e8c4d0SEnrico Granata     return lldb::eLanguageTypeUnknown;
355b9c1b51eSKate Stone   } else
35673e8c4d0SEnrico Granata     return m_preferred_display_language;
35773e8c4d0SEnrico Granata }
35873e8c4d0SEnrico Granata 
359b9c1b51eSKate Stone bool ValueObjectDynamicValue::IsSyntheticChildrenGenerated() {
3603b207c66SEnrico Granata   if (m_parent)
3613b207c66SEnrico Granata     return m_parent->IsSyntheticChildrenGenerated();
3623b207c66SEnrico Granata   return false;
3633b207c66SEnrico Granata }
3643b207c66SEnrico Granata 
365b9c1b51eSKate Stone void ValueObjectDynamicValue::SetSyntheticChildrenGenerated(bool b) {
3663b207c66SEnrico Granata   if (m_parent)
3673b207c66SEnrico Granata     m_parent->SetSyntheticChildrenGenerated(b);
3683b207c66SEnrico Granata   this->ValueObject::SetSyntheticChildrenGenerated(b);
3693b207c66SEnrico Granata }
3703b207c66SEnrico Granata 
371b9c1b51eSKate Stone bool ValueObjectDynamicValue::GetDeclaration(Declaration &decl) {
3729851b1f6SSiva Chandra   if (m_parent)
3739851b1f6SSiva Chandra     return m_parent->GetDeclaration(decl);
3749851b1f6SSiva Chandra 
3759851b1f6SSiva Chandra   return ValueObject::GetDeclaration(decl);
3769851b1f6SSiva Chandra }
377dc62ffd3SEnrico Granata 
378b9c1b51eSKate Stone uint64_t ValueObjectDynamicValue::GetLanguageFlags() {
379dc62ffd3SEnrico Granata   if (m_parent)
380dc62ffd3SEnrico Granata     return m_parent->GetLanguageFlags();
381dc62ffd3SEnrico Granata   return this->ValueObject::GetLanguageFlags();
382dc62ffd3SEnrico Granata }
383dc62ffd3SEnrico Granata 
384b9c1b51eSKate Stone void ValueObjectDynamicValue::SetLanguageFlags(uint64_t flags) {
385dc62ffd3SEnrico Granata   if (m_parent)
386dc62ffd3SEnrico Granata     m_parent->SetLanguageFlags(flags);
387dc62ffd3SEnrico Granata   else
388dc62ffd3SEnrico Granata     this->ValueObject::SetLanguageFlags(flags);
389dc62ffd3SEnrico Granata }
390