178a685aaSJim Ingham //===-- 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 1178a685aaSJim Ingham #include "lldb/Core/ValueObjectDynamicValue.h" 1278a685aaSJim Ingham 1378a685aaSJim Ingham // C Includes 1478a685aaSJim Ingham // C++ Includes 1578a685aaSJim Ingham // Other libraries and framework includes 1678a685aaSJim Ingham // Project includes 17d228483dSEnrico Granata #include "lldb/Core/Log.h" 1878a685aaSJim Ingham #include "lldb/Core/Module.h" 1978a685aaSJim Ingham #include "lldb/Core/ValueObjectList.h" 2078a685aaSJim Ingham #include "lldb/Core/Value.h" 2178a685aaSJim Ingham #include "lldb/Core/ValueObject.h" 2278a685aaSJim Ingham 23a1e5dc86SGreg Clayton #include "lldb/Symbol/CompilerType.h" 2478a685aaSJim Ingham #include "lldb/Symbol/ObjectFile.h" 2578a685aaSJim Ingham #include "lldb/Symbol/SymbolContext.h" 2678a685aaSJim Ingham #include "lldb/Symbol/Type.h" 2778a685aaSJim Ingham #include "lldb/Symbol/Variable.h" 2878a685aaSJim Ingham 2978a685aaSJim Ingham #include "lldb/Target/ExecutionContext.h" 3078a685aaSJim Ingham #include "lldb/Target/LanguageRuntime.h" 3178a685aaSJim Ingham #include "lldb/Target/Process.h" 3278a685aaSJim Ingham #include "lldb/Target/RegisterContext.h" 3378a685aaSJim Ingham #include "lldb/Target/Target.h" 3478a685aaSJim Ingham #include "lldb/Target/Thread.h" 3578a685aaSJim Ingham 3678a685aaSJim Ingham using namespace lldb_private; 3778a685aaSJim Ingham 382837b766SJim Ingham ValueObjectDynamicValue::ValueObjectDynamicValue (ValueObject &parent, lldb::DynamicValueType use_dynamic) : 3978a685aaSJim Ingham ValueObject(parent), 4078a685aaSJim Ingham m_address (), 41f7b1a34eSEnrico Granata m_dynamic_type_info(), 422837b766SJim Ingham m_use_dynamic (use_dynamic) 4378a685aaSJim Ingham { 446f3533fbSEnrico Granata SetName (parent.GetName()); 4578a685aaSJim Ingham } 4678a685aaSJim Ingham 4778a685aaSJim Ingham ValueObjectDynamicValue::~ValueObjectDynamicValue() 4878a685aaSJim Ingham { 4978a685aaSJim Ingham m_owning_valobj_sp.reset(); 5078a685aaSJim Ingham } 5178a685aaSJim Ingham 52a1e5dc86SGreg Clayton CompilerType 5399558cc4SGreg Clayton ValueObjectDynamicValue::GetCompilerTypeImpl () 5478a685aaSJim Ingham { 55dc4db5a6SEnrico Granata const bool success = UpdateValueIfNeeded(false); 56dc4db5a6SEnrico Granata if (success) 57dc4db5a6SEnrico Granata { 58dc4db5a6SEnrico Granata if (m_dynamic_type_info.HasType()) 5999558cc4SGreg Clayton return m_value.GetCompilerType(); 6078a685aaSJim Ingham else 6199558cc4SGreg Clayton return m_parent->GetCompilerType(); 6278a685aaSJim Ingham } 6399558cc4SGreg Clayton return m_parent->GetCompilerType(); 64dc4db5a6SEnrico Granata } 6578a685aaSJim Ingham 6678a685aaSJim Ingham ConstString 6778a685aaSJim Ingham ValueObjectDynamicValue::GetTypeName() 6878a685aaSJim Ingham { 69c3e320a7SEnrico Granata const bool success = UpdateValueIfNeeded(false); 70f7b1a34eSEnrico Granata if (success) 71f7b1a34eSEnrico Granata { 72f7b1a34eSEnrico Granata if (m_dynamic_type_info.HasName()) 73f7b1a34eSEnrico Granata return m_dynamic_type_info.GetName(); 74f7b1a34eSEnrico Granata } 75f7b1a34eSEnrico Granata return m_parent->GetTypeName(); 76f7b1a34eSEnrico Granata } 77f7b1a34eSEnrico Granata 78dc4db5a6SEnrico Granata TypeImpl 79dc4db5a6SEnrico Granata ValueObjectDynamicValue::GetTypeImpl () 80dc4db5a6SEnrico Granata { 81dc4db5a6SEnrico Granata const bool success = UpdateValueIfNeeded(false); 82df7c7f99SEnrico Granata if (success && m_type_impl.IsValid()) 83dc4db5a6SEnrico Granata { 84dc4db5a6SEnrico Granata return m_type_impl; 85dc4db5a6SEnrico Granata } 86dc4db5a6SEnrico Granata return m_parent->GetTypeImpl(); 87dc4db5a6SEnrico Granata } 88dc4db5a6SEnrico Granata 89f7b1a34eSEnrico Granata ConstString 90f7b1a34eSEnrico Granata ValueObjectDynamicValue::GetQualifiedTypeName() 91f7b1a34eSEnrico Granata { 92f7b1a34eSEnrico Granata const bool success = UpdateValueIfNeeded(false); 93f7b1a34eSEnrico Granata if (success) 94f7b1a34eSEnrico Granata { 95f7b1a34eSEnrico Granata if (m_dynamic_type_info.HasName()) 96f7b1a34eSEnrico Granata return m_dynamic_type_info.GetName(); 97f7b1a34eSEnrico Granata } 98e8daa2f8SEnrico Granata return m_parent->GetQualifiedTypeName(); 99e8daa2f8SEnrico Granata } 100e8daa2f8SEnrico Granata 101e8daa2f8SEnrico Granata ConstString 102e8daa2f8SEnrico Granata ValueObjectDynamicValue::GetDisplayTypeName() 103e8daa2f8SEnrico Granata { 104e8daa2f8SEnrico Granata const bool success = UpdateValueIfNeeded(false); 105e8daa2f8SEnrico Granata if (success) 106e8daa2f8SEnrico Granata { 107e8daa2f8SEnrico Granata if (m_dynamic_type_info.HasType()) 10899558cc4SGreg Clayton return GetCompilerType().GetDisplayTypeName(); 109e8daa2f8SEnrico Granata if (m_dynamic_type_info.HasName()) 110e8daa2f8SEnrico Granata return m_dynamic_type_info.GetName(); 111e8daa2f8SEnrico Granata } 112e8daa2f8SEnrico Granata return m_parent->GetDisplayTypeName(); 11378a685aaSJim Ingham } 11478a685aaSJim Ingham 115c7bece56SGreg Clayton size_t 1169ac7a6c5SSiva Chandra ValueObjectDynamicValue::CalculateNumChildren(uint32_t max) 11778a685aaSJim Ingham { 118c3e320a7SEnrico Granata const bool success = UpdateValueIfNeeded(false); 119dc4db5a6SEnrico Granata if (success && m_dynamic_type_info.HasType()) 1209ac7a6c5SSiva Chandra { 1219ac7a6c5SSiva Chandra auto children_count = GetCompilerType().GetNumChildren (true); 1229ac7a6c5SSiva Chandra return children_count <= max ? children_count : max; 1239ac7a6c5SSiva Chandra } 12478a685aaSJim Ingham else 1259ac7a6c5SSiva Chandra return m_parent->GetNumChildren(max); 12678a685aaSJim Ingham } 12778a685aaSJim Ingham 128faac1118SGreg Clayton uint64_t 12978a685aaSJim Ingham ValueObjectDynamicValue::GetByteSize() 13078a685aaSJim Ingham { 131c3e320a7SEnrico Granata const bool success = UpdateValueIfNeeded(false); 132dc4db5a6SEnrico Granata if (success && m_dynamic_type_info.HasType()) 13395438038SEnrico Granata { 13495438038SEnrico Granata ExecutionContext exe_ctx (GetExecutionContextRef()); 13595438038SEnrico Granata return m_value.GetValueByteSize(nullptr, &exe_ctx); 13695438038SEnrico Granata } 13778a685aaSJim Ingham else 13878a685aaSJim Ingham return m_parent->GetByteSize(); 13978a685aaSJim Ingham } 14078a685aaSJim Ingham 14178a685aaSJim Ingham lldb::ValueType 14278a685aaSJim Ingham ValueObjectDynamicValue::GetValueType() const 14378a685aaSJim Ingham { 14478a685aaSJim Ingham return m_parent->GetValueType(); 14578a685aaSJim Ingham } 14678a685aaSJim Ingham 14778a685aaSJim Ingham bool 14878a685aaSJim Ingham ValueObjectDynamicValue::UpdateValue () 14978a685aaSJim Ingham { 15078a685aaSJim Ingham SetValueIsValid (false); 15178a685aaSJim Ingham m_error.Clear(); 15278a685aaSJim Ingham 153c3e320a7SEnrico Granata if (!m_parent->UpdateValueIfNeeded(false)) 15478a685aaSJim Ingham { 155007d5be6SGreg Clayton // The dynamic value failed to get an error, pass the error along 156007d5be6SGreg Clayton if (m_error.Success() && m_parent->GetError().Fail()) 157007d5be6SGreg Clayton m_error = m_parent->GetError(); 15878a685aaSJim Ingham return false; 15978a685aaSJim Ingham } 16078a685aaSJim Ingham 1612837b766SJim Ingham // Setting our type_sp to NULL will route everything back through our 1622837b766SJim Ingham // parent which is equivalent to not using dynamic values. 1632837b766SJim Ingham if (m_use_dynamic == lldb::eNoDynamicValues) 1642837b766SJim Ingham { 165f7b1a34eSEnrico Granata m_dynamic_type_info.Clear(); 1662837b766SJim Ingham return true; 1672837b766SJim Ingham } 1682837b766SJim Ingham 169cc4d0146SGreg Clayton ExecutionContext exe_ctx (GetExecutionContextRef()); 170c14ee32dSGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 171c14ee32dSGreg Clayton if (target) 17278a685aaSJim Ingham { 173c14ee32dSGreg Clayton m_data.SetByteOrder(target->GetArchitecture().GetByteOrder()); 174c14ee32dSGreg Clayton m_data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize()); 17578a685aaSJim Ingham } 17678a685aaSJim Ingham 17778a685aaSJim Ingham // First make sure our Type and/or Address haven't changed: 178cc4d0146SGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 17978a685aaSJim Ingham if (!process) 18078a685aaSJim Ingham return false; 18178a685aaSJim Ingham 18261be0903SJim Ingham TypeAndOrName class_type_or_name; 18378a685aaSJim Ingham Address dynamic_address; 18478a685aaSJim Ingham bool found_dynamic_type = false; 1850b6003f3SEnrico Granata Value::ValueType value_type; 18678a685aaSJim Ingham 187c74275bcSEnrico Granata LanguageRuntime *runtime = nullptr; 188c74275bcSEnrico Granata 18978a685aaSJim Ingham lldb::LanguageType known_type = m_parent->GetObjectRuntimeLanguage(); 19078a685aaSJim Ingham if (known_type != lldb::eLanguageTypeUnknown && known_type != lldb::eLanguageTypeC) 19178a685aaSJim Ingham { 192c74275bcSEnrico Granata runtime = process->GetLanguageRuntime (known_type); 19378a685aaSJim Ingham if (runtime) 1940b6003f3SEnrico Granata found_dynamic_type = runtime->GetDynamicTypeAndAddress (*m_parent, m_use_dynamic, class_type_or_name, dynamic_address, value_type); 19578a685aaSJim Ingham } 19678a685aaSJim Ingham else 19778a685aaSJim Ingham { 198c74275bcSEnrico Granata runtime = process->GetLanguageRuntime (lldb::eLanguageTypeC_plus_plus); 199c74275bcSEnrico Granata if (runtime) 200c74275bcSEnrico Granata found_dynamic_type = runtime->GetDynamicTypeAndAddress (*m_parent, m_use_dynamic, class_type_or_name, dynamic_address, value_type); 20178a685aaSJim Ingham 20278a685aaSJim Ingham if (!found_dynamic_type) 20378a685aaSJim Ingham { 204c74275bcSEnrico Granata runtime = process->GetLanguageRuntime (lldb::eLanguageTypeObjC); 205c74275bcSEnrico Granata if (runtime) 206c74275bcSEnrico Granata found_dynamic_type = runtime->GetDynamicTypeAndAddress (*m_parent, m_use_dynamic, class_type_or_name, dynamic_address, value_type); 20778a685aaSJim Ingham } 20878a685aaSJim Ingham } 20978a685aaSJim Ingham 21061be0903SJim Ingham // Getting the dynamic value may have run the program a bit, and so marked us as needing updating, but we really 21161be0903SJim Ingham // don't... 21261be0903SJim Ingham 21361be0903SJim Ingham m_update_point.SetUpdated(); 21461be0903SJim Ingham 215c74275bcSEnrico Granata if (runtime && found_dynamic_type) 216df7c7f99SEnrico Granata { 217df7c7f99SEnrico Granata if (class_type_or_name.HasType()) 218df7c7f99SEnrico Granata { 219c74275bcSEnrico Granata m_type_impl = TypeImpl(m_parent->GetCompilerType(), 2207eed4877SEnrico Granata runtime->FixUpDynamicType(class_type_or_name, *m_parent).GetCompilerType()); 221df7c7f99SEnrico Granata } 222df7c7f99SEnrico Granata else 223df7c7f99SEnrico Granata { 224df7c7f99SEnrico Granata m_type_impl.Clear(); 225df7c7f99SEnrico Granata } 226df7c7f99SEnrico Granata } 227df7c7f99SEnrico Granata else 228df7c7f99SEnrico Granata { 229df7c7f99SEnrico Granata m_type_impl.Clear(); 230df7c7f99SEnrico Granata } 231dc4db5a6SEnrico Granata 23278a685aaSJim Ingham // If we don't have a dynamic type, then make ourselves just a echo of our parent. 23378a685aaSJim Ingham // Or we could return false, and make ourselves an echo of our parent? 23478a685aaSJim Ingham if (!found_dynamic_type) 23578a685aaSJim Ingham { 236f7b1a34eSEnrico Granata if (m_dynamic_type_info) 23775badc46SEnrico Granata SetValueDidChange(true); 238bd83b87dSEnrico Granata ClearDynamicTypeInformation(); 239f7b1a34eSEnrico Granata m_dynamic_type_info.Clear(); 24078a685aaSJim Ingham m_value = m_parent->GetValue(); 24157ee3067SGreg Clayton m_error = m_value.GetValueAsData (&exe_ctx, m_data, 0, GetModule().get()); 24278a685aaSJim Ingham return m_error.Success(); 24378a685aaSJim Ingham } 24478a685aaSJim Ingham 24578a685aaSJim Ingham Value old_value(m_value); 24678a685aaSJim Ingham 2475160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 248d228483dSEnrico Granata 249e3e91517SEnrico Granata bool has_changed_type = false; 250e3e91517SEnrico Granata 251f7b1a34eSEnrico Granata if (!m_dynamic_type_info) 25278a685aaSJim Ingham { 253f7b1a34eSEnrico Granata m_dynamic_type_info = class_type_or_name; 254e3e91517SEnrico Granata has_changed_type = true; 25578a685aaSJim Ingham } 256f7b1a34eSEnrico Granata else if (class_type_or_name != m_dynamic_type_info) 25778a685aaSJim Ingham { 25878a685aaSJim Ingham // We are another type, we need to tear down our children... 259f7b1a34eSEnrico Granata m_dynamic_type_info = class_type_or_name; 26078a685aaSJim Ingham SetValueDidChange (true); 261e3e91517SEnrico Granata has_changed_type = true; 26278a685aaSJim Ingham } 26378a685aaSJim Ingham 264e3e91517SEnrico Granata if (has_changed_type) 265e3e91517SEnrico Granata ClearDynamicTypeInformation (); 266e3e91517SEnrico Granata 26778a685aaSJim Ingham if (!m_address.IsValid() || m_address != dynamic_address) 26878a685aaSJim Ingham { 26978a685aaSJim Ingham if (m_address.IsValid()) 27078a685aaSJim Ingham SetValueDidChange (true); 27178a685aaSJim Ingham 27278a685aaSJim Ingham // We've moved, so we should be fine... 27378a685aaSJim Ingham m_address = dynamic_address; 274cc4d0146SGreg Clayton lldb::TargetSP target_sp (GetTargetSP()); 275cc4d0146SGreg Clayton lldb::addr_t load_address = m_address.GetLoadAddress(target_sp.get()); 27678a685aaSJim Ingham m_value.GetScalar() = load_address; 27778a685aaSJim Ingham } 27878a685aaSJim Ingham 279c74275bcSEnrico Granata if (runtime) 2807eed4877SEnrico Granata m_dynamic_type_info = runtime->FixUpDynamicType(m_dynamic_type_info, *m_parent); 28178a685aaSJim Ingham 28257ee3067SGreg Clayton //m_value.SetContext (Value::eContextTypeClangType, corrected_type); 28399558cc4SGreg Clayton m_value.SetCompilerType (m_dynamic_type_info.GetCompilerType()); 28478a685aaSJim Ingham 2850b6003f3SEnrico Granata m_value.SetValueType(value_type); 28678a685aaSJim Ingham 287e3e91517SEnrico Granata if (has_changed_type && log) 288324a1036SSaleem Abdulrasool log->Printf("[%s %p] has a new dynamic type %s", GetName().GetCString(), 289324a1036SSaleem Abdulrasool static_cast<void*>(this), GetTypeName().GetCString()); 290e3e91517SEnrico Granata 291f7b1a34eSEnrico Granata if (m_address.IsValid() && m_dynamic_type_info) 29278a685aaSJim Ingham { 29378a685aaSJim Ingham // The variable value is in the Scalar value inside the m_value. 29478a685aaSJim Ingham // We can point our m_data right to it. 29557ee3067SGreg Clayton m_error = m_value.GetValueAsData (&exe_ctx, m_data, 0, GetModule().get()); 29678a685aaSJim Ingham if (m_error.Success()) 29778a685aaSJim Ingham { 298d07cfd3aSEnrico Granata if (!CanProvideValue()) 29978a685aaSJim Ingham { 30078a685aaSJim Ingham // this value object represents an aggregate type whose 30178a685aaSJim Ingham // children have values, but this object does not. So we 30278a685aaSJim Ingham // say we are changed if our location has changed. 30378a685aaSJim Ingham SetValueDidChange (m_value.GetValueType() != old_value.GetValueType() || m_value.GetScalar() != old_value.GetScalar()); 30478a685aaSJim Ingham } 30578a685aaSJim Ingham 30678a685aaSJim Ingham SetValueIsValid (true); 30778a685aaSJim Ingham return true; 30878a685aaSJim Ingham } 30978a685aaSJim Ingham } 31078a685aaSJim Ingham 31178a685aaSJim Ingham // We get here if we've failed above... 31278a685aaSJim Ingham SetValueIsValid (false); 31378a685aaSJim Ingham return false; 31478a685aaSJim Ingham } 31578a685aaSJim Ingham 31678a685aaSJim Ingham 31778a685aaSJim Ingham 31878a685aaSJim Ingham bool 31978a685aaSJim Ingham ValueObjectDynamicValue::IsInScope () 32078a685aaSJim Ingham { 32178a685aaSJim Ingham return m_parent->IsInScope(); 32278a685aaSJim Ingham } 32378a685aaSJim Ingham 32407a4ac22SEnrico Granata bool 32507a4ac22SEnrico Granata ValueObjectDynamicValue::SetValueFromCString (const char *value_str, Error& error) 32607a4ac22SEnrico Granata { 32707a4ac22SEnrico Granata if (!UpdateValueIfNeeded(false)) 32807a4ac22SEnrico Granata { 32907a4ac22SEnrico Granata error.SetErrorString("unable to read value"); 33007a4ac22SEnrico Granata return false; 33107a4ac22SEnrico Granata } 33207a4ac22SEnrico Granata 33307a4ac22SEnrico Granata uint64_t my_value = GetValueAsUnsigned(UINT64_MAX); 33407a4ac22SEnrico Granata uint64_t parent_value = m_parent->GetValueAsUnsigned(UINT64_MAX); 33507a4ac22SEnrico Granata 33607a4ac22SEnrico Granata if (my_value == UINT64_MAX || parent_value == UINT64_MAX) 33707a4ac22SEnrico Granata { 33807a4ac22SEnrico Granata error.SetErrorString("unable to read value"); 33907a4ac22SEnrico Granata return false; 34007a4ac22SEnrico Granata } 34107a4ac22SEnrico Granata 34207a4ac22SEnrico Granata // if we are at an offset from our parent, in order to set ourselves correctly we would need 34307a4ac22SEnrico Granata // to change the new value so that it refers to the correct dynamic type. we choose not to deal 34407a4ac22SEnrico Granata // with that - if anything more than a value overwrite is required, you should be using the 34507a4ac22SEnrico Granata // expression parser instead of the value editing facility 34607a4ac22SEnrico Granata if (my_value != parent_value) 34707a4ac22SEnrico Granata { 34807a4ac22SEnrico Granata // but NULL'ing out a value should always be allowed 34907a4ac22SEnrico Granata if (strcmp(value_str,"0")) 35007a4ac22SEnrico Granata { 35107a4ac22SEnrico Granata error.SetErrorString("unable to modify dynamic value, use 'expression' command"); 35207a4ac22SEnrico Granata return false; 35307a4ac22SEnrico Granata } 35407a4ac22SEnrico Granata } 35507a4ac22SEnrico Granata 35607a4ac22SEnrico Granata bool ret_val = m_parent->SetValueFromCString(value_str,error); 35707a4ac22SEnrico Granata SetNeedsUpdate(); 35807a4ac22SEnrico Granata return ret_val; 35907a4ac22SEnrico Granata } 360389823e9SSean Callanan 361389823e9SSean Callanan bool 362389823e9SSean Callanan ValueObjectDynamicValue::SetData (DataExtractor &data, Error &error) 363389823e9SSean Callanan { 364389823e9SSean Callanan if (!UpdateValueIfNeeded(false)) 365389823e9SSean Callanan { 366389823e9SSean Callanan error.SetErrorString("unable to read value"); 367389823e9SSean Callanan return false; 368389823e9SSean Callanan } 369389823e9SSean Callanan 370389823e9SSean Callanan uint64_t my_value = GetValueAsUnsigned(UINT64_MAX); 371389823e9SSean Callanan uint64_t parent_value = m_parent->GetValueAsUnsigned(UINT64_MAX); 372389823e9SSean Callanan 373389823e9SSean Callanan if (my_value == UINT64_MAX || parent_value == UINT64_MAX) 374389823e9SSean Callanan { 375389823e9SSean Callanan error.SetErrorString("unable to read value"); 376389823e9SSean Callanan return false; 377389823e9SSean Callanan } 378389823e9SSean Callanan 379389823e9SSean Callanan // if we are at an offset from our parent, in order to set ourselves correctly we would need 380389823e9SSean Callanan // to change the new value so that it refers to the correct dynamic type. we choose not to deal 381389823e9SSean Callanan // with that - if anything more than a value overwrite is required, you should be using the 382389823e9SSean Callanan // expression parser instead of the value editing facility 383389823e9SSean Callanan if (my_value != parent_value) 384389823e9SSean Callanan { 385389823e9SSean Callanan // but NULL'ing out a value should always be allowed 386389823e9SSean Callanan lldb::offset_t offset = 0; 387389823e9SSean Callanan 388389823e9SSean Callanan if (data.GetPointer(&offset) != 0) 389389823e9SSean Callanan { 390389823e9SSean Callanan error.SetErrorString("unable to modify dynamic value, use 'expression' command"); 391389823e9SSean Callanan return false; 392389823e9SSean Callanan } 393389823e9SSean Callanan } 394389823e9SSean Callanan 395389823e9SSean Callanan bool ret_val = m_parent->SetData(data, error); 396389823e9SSean Callanan SetNeedsUpdate(); 397389823e9SSean Callanan return ret_val; 398389823e9SSean Callanan } 3999851b1f6SSiva Chandra 40073e8c4d0SEnrico Granata void 40173e8c4d0SEnrico Granata ValueObjectDynamicValue::SetPreferredDisplayLanguage (lldb::LanguageType lang) 40273e8c4d0SEnrico Granata { 40373e8c4d0SEnrico Granata this->ValueObject::SetPreferredDisplayLanguage(lang); 40473e8c4d0SEnrico Granata if (m_parent) 40573e8c4d0SEnrico Granata m_parent->SetPreferredDisplayLanguage(lang); 40673e8c4d0SEnrico Granata } 40773e8c4d0SEnrico Granata 40873e8c4d0SEnrico Granata lldb::LanguageType 40973e8c4d0SEnrico Granata ValueObjectDynamicValue::GetPreferredDisplayLanguage () 41073e8c4d0SEnrico Granata { 41173e8c4d0SEnrico Granata if (m_preferred_display_language == lldb::eLanguageTypeUnknown) 41273e8c4d0SEnrico Granata { 41373e8c4d0SEnrico Granata if (m_parent) 41473e8c4d0SEnrico Granata return m_parent->GetPreferredDisplayLanguage(); 41573e8c4d0SEnrico Granata return lldb::eLanguageTypeUnknown; 41673e8c4d0SEnrico Granata } 41773e8c4d0SEnrico Granata else 41873e8c4d0SEnrico Granata return m_preferred_display_language; 41973e8c4d0SEnrico Granata } 42073e8c4d0SEnrico Granata 4219851b1f6SSiva Chandra bool 4229851b1f6SSiva Chandra ValueObjectDynamicValue::GetDeclaration (Declaration &decl) 4239851b1f6SSiva Chandra { 4249851b1f6SSiva Chandra if (m_parent) 4259851b1f6SSiva Chandra return m_parent->GetDeclaration(decl); 4269851b1f6SSiva Chandra 4279851b1f6SSiva Chandra return ValueObject::GetDeclaration(decl); 4289851b1f6SSiva Chandra } 429*dc62ffd3SEnrico Granata 430*dc62ffd3SEnrico Granata uint64_t 431*dc62ffd3SEnrico Granata ValueObjectDynamicValue::GetLanguageFlags () 432*dc62ffd3SEnrico Granata { 433*dc62ffd3SEnrico Granata if (m_parent) 434*dc62ffd3SEnrico Granata return m_parent->GetLanguageFlags(); 435*dc62ffd3SEnrico Granata return this->ValueObject::GetLanguageFlags(); 436*dc62ffd3SEnrico Granata } 437*dc62ffd3SEnrico Granata 438*dc62ffd3SEnrico Granata void 439*dc62ffd3SEnrico Granata ValueObjectDynamicValue::SetLanguageFlags (uint64_t flags) 440*dc62ffd3SEnrico Granata { 441*dc62ffd3SEnrico Granata if (m_parent) 442*dc62ffd3SEnrico Granata m_parent->SetLanguageFlags(flags); 443*dc62ffd3SEnrico Granata else 444*dc62ffd3SEnrico Granata this->ValueObject::SetLanguageFlags(flags); 445*dc62ffd3SEnrico Granata } 446