diff --git a/lldb/include/lldb/DataFormatters/FormatManager.h b/lldb/include/lldb/DataFormatters/FormatManager.h index ebc00bddd6e9..8abd33d343a3 100644 --- a/lldb/include/lldb/DataFormatters/FormatManager.h +++ b/lldb/include/lldb/DataFormatters/FormatManager.h @@ -21,11 +21,13 @@ #include "lldb/DataFormatters/FormatCache.h" #include "lldb/DataFormatters/FormatClasses.h" #include "lldb/DataFormatters/FormattersContainer.h" +#include "lldb/DataFormatters/LanguageCategory.h" #include "lldb/DataFormatters/TypeCategory.h" #include "lldb/DataFormatters/TypeCategoryMap.h" #include #include +#include namespace lldb_private { @@ -48,6 +50,8 @@ public: template using HardcodedFormatterFinders = std::vector>; + typedef std::map LanguageCategories; + typedef TypeCategoryMap::CallbackType CategoryCallback; FormatManager (); @@ -123,11 +127,8 @@ public: } void - LoopThroughCategories (CategoryCallback callback, void* param) - { - m_categories_map.LoopThrough(callback, param); - } - + LoopThroughCategories (CategoryCallback callback, void* param); + lldb::TypeCategoryImplSP GetCategory (const char* category_name = NULL, bool can_create = true) @@ -258,6 +259,9 @@ public: true); return matches; } + + static ConstString + GetTypeForCache (ValueObject&, lldb::DynamicValueType); private: @@ -272,10 +276,14 @@ private: bool did_strip_typedef, bool root_level = false); + LanguageCategory* + GetCategoryForLanguage (lldb::LanguageType lang_type); + FormatCache m_format_cache; NamedSummariesMap m_named_summaries_map; std::atomic m_last_revision; TypeCategoryMap m_categories_map; + LanguageCategories m_language_categories_map; ConstString m_default_category_name; ConstString m_system_category_name; diff --git a/lldb/include/lldb/DataFormatters/LanguageCategory.h b/lldb/include/lldb/DataFormatters/LanguageCategory.h new file mode 100644 index 000000000000..a3940f2a3c7e --- /dev/null +++ b/lldb/include/lldb/DataFormatters/LanguageCategory.h @@ -0,0 +1,67 @@ +//===-- LanguageCategory.h----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef lldb_LanguageCategory_h_ +#define lldb_LanguageCategory_h_ + +// C Includes +// C++ Includes + +// Other libraries and framework includes +// Project includes +#include "lldb/lldb-public.h" +#include "lldb/DataFormatters/FormatCache.h" +#include "lldb/DataFormatters/FormatClasses.h" + +#include + +namespace lldb_private { + +class LanguageCategory +{ +public: + typedef std::unique_ptr UniquePointer; + + LanguageCategory (lldb::LanguageType lang_type); + + bool + Get (ValueObject& valobj, + lldb::DynamicValueType dynamic, + FormattersMatchVector matches, + lldb::TypeFormatImplSP& format_sp); + + bool + Get (ValueObject& valobj, + lldb::DynamicValueType dynamic, + FormattersMatchVector matches, + lldb::TypeSummaryImplSP& format_sp); + + bool + Get (ValueObject& valobj, + lldb::DynamicValueType dynamic, + FormattersMatchVector matches, + lldb::SyntheticChildrenSP& format_sp); + + bool + Get (ValueObject& valobj, + lldb::DynamicValueType dynamic, + FormattersMatchVector matches, + lldb::TypeValidatorImplSP& format_sp); + + lldb::TypeCategoryImplSP + GetCategory () const; + +private: + lldb::TypeCategoryImplSP m_category_sp; + lldb_private::FormatCache m_format_cache; +}; + +} // namespace lldb_private + +#endif // lldb_LanguageCategory_h_ diff --git a/lldb/include/lldb/DataFormatters/TypeCategory.h b/lldb/include/lldb/DataFormatters/TypeCategory.h index e32efa420a55..b05fc5244b65 100644 --- a/lldb/include/lldb/DataFormatters/TypeCategory.h +++ b/lldb/include/lldb/DataFormatters/TypeCategory.h @@ -314,6 +314,7 @@ namespace lldb_private { m_enabled_position = p; } + friend class LanguageCategory; friend class TypeCategoryMap; friend class FormattersContainer; diff --git a/lldb/include/lldb/DataFormatters/TypeCategoryMap.h b/lldb/include/lldb/DataFormatters/TypeCategoryMap.h index 41b170d5335e..e957934d4786 100644 --- a/lldb/include/lldb/DataFormatters/TypeCategoryMap.h +++ b/lldb/include/lldb/DataFormatters/TypeCategoryMap.h @@ -102,21 +102,25 @@ namespace lldb_private { lldb::TypeFormatImplSP GetFormat (ValueObject& valobj, - lldb::DynamicValueType use_dynamic); + lldb::DynamicValueType use_dynamic, + FormattersMatchVector matches); lldb::TypeSummaryImplSP GetSummaryFormat (ValueObject& valobj, - lldb::DynamicValueType use_dynamic); + lldb::DynamicValueType use_dynamic, + FormattersMatchVector matches); #ifndef LLDB_DISABLE_PYTHON lldb::SyntheticChildrenSP GetSyntheticChildren (ValueObject& valobj, - lldb::DynamicValueType use_dynamic); + lldb::DynamicValueType use_dynamic, + FormattersMatchVector matches); #endif lldb::TypeValidatorImplSP GetValidator (ValueObject& valobj, - lldb::DynamicValueType use_dynamic); + lldb::DynamicValueType use_dynamic, + FormattersMatchVector matches); private: diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h index 2c6c1da8c12f..e2512c66ea7d 100644 --- a/lldb/include/lldb/Target/Language.h +++ b/lldb/include/lldb/Target/Language.h @@ -39,6 +39,9 @@ namespace lldb_private { virtual lldb::LanguageType GetLanguageType () const = 0; + virtual lldb::TypeCategoryImplSP + GetFormatters (); + protected: //------------------------------------------------------------------ // Classes that inherit from Language can see and modify these diff --git a/lldb/include/lldb/lldb-forward.h b/lldb/include/lldb/lldb-forward.h index a0e0f491ab6f..ec6641a500bd 100644 --- a/lldb/include/lldb/lldb-forward.h +++ b/lldb/include/lldb/lldb-forward.h @@ -115,6 +115,7 @@ class IRExecutionUnit; class JITLoader; class JITLoaderList; class Language; +class LanguageCategory; class LanguageRuntime; class MemoryRegionInfo; class LineTable; diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index b3b236a9f07f..df91febc2022 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -726,6 +726,8 @@ 941BCC8214E48C4000BB969C /* SBTypeSynthetic.h in Headers */ = {isa = PBXBuildFile; fileRef = 9461568914E355F2003A195C /* SBTypeSynthetic.h */; settings = {ATTRIBUTES = (Public, ); }; }; 94235B9E1A8D667400EB2EED /* SBVariablesOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94235B9B1A8D5FF300EB2EED /* SBVariablesOptions.cpp */; }; 94235B9F1A8D66D600EB2EED /* SBVariablesOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 94235B9A1A8D5FD800EB2EED /* SBVariablesOptions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 942612F71B95000000EF842E /* LanguageCategory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 942612F61B95000000EF842E /* LanguageCategory.cpp */; settings = {ASSET_TAGS = (); }; }; + 942612F81B952C9B00EF842E /* ObjCLanguage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B6385E1B8FB7A2004FE1E4 /* ObjCLanguage.cpp */; settings = {ASSET_TAGS = (); }; }; 942829561A89614C00521B30 /* JSON.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 942829551A89614C00521B30 /* JSON.cpp */; }; 942829CC1A89839300521B30 /* liblldb-core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2689FFCA13353D7A00698AC0 /* liblldb-core.a */; }; 942AFF0519F84ABF007B43B4 /* LibCxxVector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 942AFF0419F84ABF007B43B4 /* LibCxxVector.cpp */; }; @@ -2407,6 +2409,8 @@ 94235B9A1A8D5FD800EB2EED /* SBVariablesOptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SBVariablesOptions.h; path = include/lldb/API/SBVariablesOptions.h; sourceTree = ""; }; 94235B9B1A8D5FF300EB2EED /* SBVariablesOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBVariablesOptions.cpp; path = source/API/SBVariablesOptions.cpp; sourceTree = ""; }; 94235B9D1A8D601A00EB2EED /* SBVariablesOptions.i */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c.preprocessed; path = SBVariablesOptions.i; sourceTree = ""; }; + 942612F51B94FFE900EF842E /* LanguageCategory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LanguageCategory.h; path = include/lldb/DataFormatters/LanguageCategory.h; sourceTree = ""; }; + 942612F61B95000000EF842E /* LanguageCategory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LanguageCategory.cpp; path = source/DataFormatters/LanguageCategory.cpp; sourceTree = ""; }; 942829541A89614000521B30 /* JSON.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JSON.h; path = include/lldb/Utility/JSON.h; sourceTree = ""; }; 942829551A89614C00521B30 /* JSON.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JSON.cpp; path = source/Utility/JSON.cpp; sourceTree = ""; }; 942829C01A89835300521B30 /* argdumper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = argdumper; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -5296,6 +5300,8 @@ 94CB256216B069800059775D /* FormatManager.h */, 94CB255A16B069770059775D /* FormatManager.cpp */, 94EE33F218643C6900CD703B /* FormattersContainer.h */, + 942612F51B94FFE900EF842E /* LanguageCategory.h */, + 942612F61B95000000EF842E /* LanguageCategory.cpp */, 94D0B10A16D5535900EA9C70 /* LibCxx.cpp */, 942AFF0619F84C02007B43B4 /* LibCxxInitializerList.cpp */, 94CD704F16F8DF1C00CF1E42 /* LibCxxList.cpp */, @@ -6197,6 +6203,7 @@ 2689005C13353E0400698AC0 /* ValueObjectVariable.cpp in Sources */, 264A58EE1A7DBCAD00A6B1B0 /* OptionValueFormatEntity.cpp in Sources */, 8C2D6A53197A1EAF006989C9 /* MemoryHistory.cpp in Sources */, + 942612F71B95000000EF842E /* LanguageCategory.cpp in Sources */, 2689005D13353E0400698AC0 /* VMRange.cpp in Sources */, 2689005E13353E0E00698AC0 /* ClangASTSource.cpp in Sources */, 3FDFED0F19B7D269009756A7 /* ThisThread.cpp in Sources */, @@ -6231,6 +6238,7 @@ 2689007213353E1A00698AC0 /* Mutex.cpp in Sources */, 25420ED21A649D88009ADBCB /* PipeBase.cpp in Sources */, AF20F7661AF18F8500751A6E /* ABISysV_arm.cpp in Sources */, + 942612F81B952C9B00EF842E /* ObjCLanguage.cpp in Sources */, 2689007313353E1A00698AC0 /* Symbols.cpp in Sources */, 26474CBC18D0CB2D0073DEBA /* RegisterContextMach_arm.cpp in Sources */, 257E47171AA56C2000A62F81 /* ModuleCache.cpp in Sources */, diff --git a/lldb/source/API/SystemInitializerFull.cpp b/lldb/source/API/SystemInitializerFull.cpp index 4ba4a420b2af..5711d0fc5845 100644 --- a/lldb/source/API/SystemInitializerFull.cpp +++ b/lldb/source/API/SystemInitializerFull.cpp @@ -41,6 +41,9 @@ #include "Plugins/Instruction/ARM64/EmulateInstructionARM64.h" #include "Plugins/InstrumentationRuntime/AddressSanitizer/AddressSanitizerRuntime.h" #include "Plugins/JITLoader/GDB/JITLoaderGDB.h" +#include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h" +#include "Plugins/Language/ObjC/ObjCLanguage.h" +#include "Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h" #include "Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h" #include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.h" #include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h" @@ -281,6 +284,10 @@ SystemInitializerFull::Initialize() AppleObjCRuntimeV1::Initialize(); SystemRuntimeMacOSX::Initialize(); RenderScriptRuntime::Initialize(); + + CPlusPlusLanguage::Initialize(); + ObjCLanguage::Initialize(); + ObjCPlusPlusLanguage::Initialize(); #if defined(_MSC_VER) ProcessWindows::Initialize(); @@ -385,6 +392,10 @@ SystemInitializerFull::Terminate() SystemRuntimeMacOSX::Terminate(); RenderScriptRuntime::Terminate(); + CPlusPlusLanguage::Terminate(); + ObjCLanguage::Terminate(); + ObjCPlusPlusLanguage::Terminate(); + #if defined(__APPLE__) ProcessMachCore::Terminate(); ProcessKDP::Terminate(); diff --git a/lldb/source/DataFormatters/CMakeLists.txt b/lldb/source/DataFormatters/CMakeLists.txt index ad29369b7301..691190a57684 100644 --- a/lldb/source/DataFormatters/CMakeLists.txt +++ b/lldb/source/DataFormatters/CMakeLists.txt @@ -9,6 +9,7 @@ add_lldb_library(lldbDataFormatters FormatCache.cpp FormatClasses.cpp FormatManager.cpp + LanguageCategory.cpp LibCxx.cpp LibCxxInitializerList.cpp LibCxxList.cpp diff --git a/lldb/source/DataFormatters/FormatManager.cpp b/lldb/source/DataFormatters/FormatManager.cpp index e41d341a21e0..52209cae3be7 100644 --- a/lldb/source/DataFormatters/FormatManager.cpp +++ b/lldb/source/DataFormatters/FormatManager.cpp @@ -16,10 +16,13 @@ #include "lldb/Core/Debugger.h" #include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/LanguageCategory.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/Platform.h" #include "llvm/ADT/STLExtras.h" +#include + using namespace lldb; using namespace lldb_private; @@ -472,6 +475,20 @@ FormatManager::GetValidatorForType (lldb::TypeNameSpecifierImplSP type_sp) return validator_chosen_sp; } +void +FormatManager::LoopThroughCategories (CategoryCallback callback, void* param) +{ + m_categories_map.LoopThrough(callback, param); + for (const auto& entry : m_language_categories_map) + { + if (auto category_sp = entry.second->GetCategory()) + { + if (!callback(param, category_sp)) + break; + } + } +} + lldb::TypeCategoryImplSP FormatManager::GetCategory (const ConstString& category_name, bool can_create) @@ -596,8 +613,8 @@ FormatManager::GetValidTypeName (const ConstString& type) } ConstString -GetTypeForCache (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) +FormatManager::GetTypeForCache (ValueObject& valobj, + lldb::DynamicValueType use_dynamic) { if (use_dynamic == lldb::eNoDynamicValues) { @@ -618,6 +635,28 @@ GetTypeForCache (ValueObject& valobj, return ConstString(); } +static std::initializer_list +GetCandidateLanguages (ValueObject& valobj) +{ + lldb::LanguageType lang_type = valobj.GetObjectRuntimeLanguage(); + switch (lang_type) + { + default: + return {lang_type}; + } +} + +LanguageCategory* +FormatManager::GetCategoryForLanguage (lldb::LanguageType lang_type) +{ + auto iter = m_language_categories_map.find(lang_type), end = m_language_categories_map.end(); + if (iter != end) + return iter->second.get(); + LanguageCategory* lang_category = new LanguageCategory(lang_type); + m_language_categories_map[lang_type] = LanguageCategory::UniquePointer(lang_category); + return lang_category; +} + lldb::TypeFormatImplSP FormatManager::GetHardcodedFormat (ValueObject& valobj, lldb::DynamicValueType use_dynamic) @@ -655,7 +694,29 @@ FormatManager::GetFormat (ValueObject& valobj, if (log) log->Printf("[FormatManager::GetFormat] Cache search failed. Going normal route"); } - retval = m_categories_map.GetFormat(valobj, use_dynamic); + + FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic); + + retval = m_categories_map.GetFormat(valobj, use_dynamic, matches); + if (!retval) + { + if (log) + log->Printf("[FormatManager::GetFormat] Search failed. Giving language a chance."); + for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj)) + { + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->Get(valobj, use_dynamic, matches, retval)) + break; + } + } + if (retval) + { + if (log) + log->Printf("[FormatManager::GetFormat] Language search success. Returning."); + return retval; + } + } if (!retval) { if (log) @@ -713,7 +774,29 @@ FormatManager::GetSummaryFormat (ValueObject& valobj, if (log) log->Printf("[FormatManager::GetSummaryFormat] Cache search failed. Going normal route"); } - retval = m_categories_map.GetSummaryFormat(valobj, use_dynamic); + + FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic); + + retval = m_categories_map.GetSummaryFormat(valobj, use_dynamic, matches); + if (!retval) + { + if (log) + log->Printf("[FormatManager::GetSummaryFormat] Search failed. Giving language a chance."); + for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj)) + { + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->Get(valobj, use_dynamic, matches, retval)) + break; + } + } + if (retval) + { + if (log) + log->Printf("[FormatManager::GetSummaryFormat] Language search success. Returning."); + return retval; + } + } if (!retval) { if (log) @@ -772,7 +855,29 @@ FormatManager::GetSyntheticChildren (ValueObject& valobj, if (log) log->Printf("[FormatManager::GetSyntheticChildren] Cache search failed. Going normal route"); } - retval = m_categories_map.GetSyntheticChildren(valobj, use_dynamic); + + FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic); + + retval = m_categories_map.GetSyntheticChildren(valobj, use_dynamic, matches); + if (!retval) + { + if (log) + log->Printf("[FormatManager::GetSyntheticChildren] Search failed. Giving language a chance."); + for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj)) + { + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->Get(valobj, use_dynamic, matches, retval)) + break; + } + } + if (retval) + { + if (log) + log->Printf("[FormatManager::GetSyntheticChildren] Language search success. Returning."); + return retval; + } + } if (!retval) { if (log) @@ -818,7 +923,29 @@ FormatManager::GetValidator (ValueObject& valobj, if (log) log->Printf("[FormatManager::GetValidator] Cache search failed. Going normal route"); } - retval = m_categories_map.GetValidator(valobj, use_dynamic); + + FormattersMatchVector matches = GetPossibleMatches(valobj, use_dynamic); + + retval = m_categories_map.GetValidator(valobj, use_dynamic, matches); + if (!retval) + { + if (log) + log->Printf("[FormatManager::GetValidator] Search failed. Giving language a chance."); + for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj)) + { + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->Get(valobj, use_dynamic, matches, retval)) + break; + } + } + if (retval) + { + if (log) + log->Printf("[FormatManager::GetValidator] Language search success. Returning."); + return retval; + } + } if (!retval) { if (log) @@ -857,6 +984,7 @@ FormatManager::FormatManager() : m_named_summaries_map(this), m_last_revision(0), m_categories_map(this), + m_language_categories_map(), m_default_category_name(ConstString("default")), m_system_category_name(ConstString("system")), m_gnu_cpp_category_name(ConstString("gnu-libstdc++")), @@ -1083,17 +1211,7 @@ FormatManager::LoadLibcxxFormatters() lldb::TypeSummaryImplSP std_wstring_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxWStringSummaryProvider, "std::wstring summary provider")); TypeCategoryImpl::SharedPointer libcxx_category_sp = GetCategory(m_libcxx_category_name); - - libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::string"), - std_string_summary_sp); - libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::basic_string, std::__1::allocator >"), - std_string_summary_sp); - libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::wstring"), - std_wstring_summary_sp); - libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::basic_string, std::__1::allocator >"), - std_wstring_summary_sp); - SyntheticChildren::Flags stl_synth_flags; stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false); diff --git a/lldb/source/DataFormatters/LanguageCategory.cpp b/lldb/source/DataFormatters/LanguageCategory.cpp new file mode 100644 index 000000000000..5d6d43228f86 --- /dev/null +++ b/lldb/source/DataFormatters/LanguageCategory.cpp @@ -0,0 +1,133 @@ +//===-- LanguageCategory.cpp ---------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/DataFormatters/LanguageCategory.h" + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/DataFormatters/FormatManager.h" +#include "lldb/DataFormatters/TypeCategory.h" +#include "lldb/DataFormatters/TypeFormat.h" +#include "lldb/DataFormatters/TypeSummary.h" +#include "lldb/DataFormatters/TypeSynthetic.h" +#include "lldb/DataFormatters/TypeValidator.h" +#include "lldb/Target/Language.h" + +using namespace lldb; +using namespace lldb_private; + +LanguageCategory::LanguageCategory (lldb::LanguageType lang_type) : + m_category_sp(), + m_format_cache() +{ + if (Language* language_plugin = Language::FindPlugin(lang_type)) + m_category_sp = language_plugin->GetFormatters(); + if (m_category_sp) + m_category_sp->Enable(true, 1); +} + +bool +LanguageCategory::Get (ValueObject& valobj, + lldb::DynamicValueType dynamic, + FormattersMatchVector matches, + lldb::TypeFormatImplSP& format_sp) +{ + if (!m_category_sp) + return false; + + ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); + if (type_name) + { + if (m_format_cache.GetFormat(type_name, format_sp)) + return true; + } + bool result = m_category_sp->Get(valobj, matches, format_sp); + if (type_name && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetFormat(type_name, format_sp); + } + return result; +} + +bool +LanguageCategory::Get (ValueObject& valobj, + lldb::DynamicValueType dynamic, + FormattersMatchVector matches, + lldb::TypeSummaryImplSP& format_sp) +{ + if (!m_category_sp) + return false; + + ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); + if (type_name) + { + if (m_format_cache.GetSummary(type_name, format_sp)) + return true; + } + bool result = m_category_sp->Get(valobj, matches, format_sp); + if (type_name && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetSummary(type_name, format_sp); + } + return result; +} + +bool +LanguageCategory::Get (ValueObject& valobj, + lldb::DynamicValueType dynamic, + FormattersMatchVector matches, + lldb::SyntheticChildrenSP& format_sp) +{ + if (!m_category_sp) + return false; + + ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); + if (type_name) + { + if (m_format_cache.GetSynthetic(type_name, format_sp)) + return true; + } + bool result = m_category_sp->Get(valobj, matches, format_sp); + if (type_name && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetSynthetic(type_name, format_sp); + } + return result; +} + +bool +LanguageCategory::Get (ValueObject& valobj, + lldb::DynamicValueType dynamic, + FormattersMatchVector matches, + lldb::TypeValidatorImplSP& format_sp) +{ + if (!m_category_sp) + return false; + + ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); + if (type_name) + { + if (m_format_cache.GetValidator(type_name, format_sp)) + return true; + } + bool result = m_category_sp->Get(valobj, matches, format_sp); + if (type_name && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetValidator(type_name, format_sp); + } + return result; +} + +lldb::TypeCategoryImplSP +LanguageCategory::GetCategory () const +{ + return m_category_sp; +} diff --git a/lldb/source/DataFormatters/TypeCategoryMap.cpp b/lldb/source/DataFormatters/TypeCategoryMap.cpp index 96b9e6df8a47..3494a8a68604 100644 --- a/lldb/source/DataFormatters/TypeCategoryMap.cpp +++ b/lldb/source/DataFormatters/TypeCategoryMap.cpp @@ -219,7 +219,8 @@ TypeCategoryMap::AnyMatches (ConstString type_name, lldb::TypeFormatImplSP TypeCategoryMap::GetFormat (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) + lldb::DynamicValueType use_dynamic, + FormattersMatchVector matches) { Mutex::Locker locker(m_map_mutex); @@ -228,8 +229,6 @@ TypeCategoryMap::GetFormat (ValueObject& valobj, Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic); - for (begin = m_active_categories.begin(); begin != end; begin++) { lldb::TypeCategoryImplSP category_sp = *begin; @@ -247,7 +246,8 @@ TypeCategoryMap::GetFormat (ValueObject& valobj, lldb::TypeSummaryImplSP TypeCategoryMap::GetSummaryFormat (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) + lldb::DynamicValueType use_dynamic, + FormattersMatchVector matches) { Mutex::Locker locker(m_map_mutex); @@ -256,8 +256,6 @@ TypeCategoryMap::GetSummaryFormat (ValueObject& valobj, Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic); - for (begin = m_active_categories.begin(); begin != end; begin++) { lldb::TypeCategoryImplSP category_sp = *begin; @@ -276,7 +274,8 @@ TypeCategoryMap::GetSummaryFormat (ValueObject& valobj, #ifndef LLDB_DISABLE_PYTHON lldb::SyntheticChildrenSP TypeCategoryMap::GetSyntheticChildren (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) + lldb::DynamicValueType use_dynamic, + FormattersMatchVector matches) { Mutex::Locker locker(m_map_mutex); @@ -286,8 +285,6 @@ TypeCategoryMap::GetSyntheticChildren (ValueObject& valobj, Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic); - for (begin = m_active_categories.begin(); begin != end; begin++) { lldb::TypeCategoryImplSP category_sp = *begin; @@ -306,7 +303,8 @@ TypeCategoryMap::GetSyntheticChildren (ValueObject& valobj, lldb::TypeValidatorImplSP TypeCategoryMap::GetValidator (ValueObject& valobj, - lldb::DynamicValueType use_dynamic) + lldb::DynamicValueType use_dynamic, + FormattersMatchVector matches) { Mutex::Locker locker(m_map_mutex); @@ -315,8 +313,6 @@ TypeCategoryMap::GetValidator (ValueObject& valobj, Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); - FormattersMatchVector matches = FormatManager::GetPossibleMatches(valobj, use_dynamic); - for (begin = m_active_categories.begin(); begin != end; begin++) { lldb::TypeCategoryImplSP category_sp = *begin; diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp index d14690739937..dd80f7c92007 100644 --- a/lldb/source/Target/Language.cpp +++ b/lldb/source/Target/Language.cpp @@ -87,6 +87,12 @@ Language::ForEach (std::function callback) } } +lldb::TypeCategoryImplSP +Language::GetFormatters () +{ + return nullptr; +} + //---------------------------------------------------------------------- // Constructor //----------------------------------------------------------------------