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