forked from OSchip/llvm-project
Add support for language plugins to provide data formatters
Historically, data formatters all exist in a global repository (the category map) On top of that, some formatters can be "hardcoded" when the conditions under which they apply are not expressible as a typename (or typename regex) This change paves the way to move formatters into per-language buckets such that the C++ plugin is responsible for ownership of the C++ formatters, and so on The advantages of this are: a) language formatters only get created when they might apply b) formatters for a language are clearly owned by the matching language plugin The current model is one of static instantiation, that is a language knows the full set of formatters it vends and that is only asked-for once, and then handed off to the FormatManager In a future revision it might be interesting to add similar ability to the language runtimes, and monitor for certain shared library events to add even more library-specific formatters No formatters are moved as part of this change, so practically speaking this is NFC llvm-svn: 246515
This commit is contained in:
parent
989364c101
commit
2233895a3b
|
@ -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 <atomic>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
|
||||
namespace lldb_private {
|
||||
|
||||
|
@ -48,6 +50,8 @@ public:
|
|||
template <typename FormatterType>
|
||||
using HardcodedFormatterFinders = std::vector<HardcodedFormatterFinder<FormatterType>>;
|
||||
|
||||
typedef std::map<lldb::LanguageType, LanguageCategory::UniquePointer> 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<uint32_t> m_last_revision;
|
||||
TypeCategoryMap m_categories_map;
|
||||
LanguageCategories m_language_categories_map;
|
||||
|
||||
ConstString m_default_category_name;
|
||||
ConstString m_system_category_name;
|
||||
|
|
|
@ -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 <memory>
|
||||
|
||||
namespace lldb_private {
|
||||
|
||||
class LanguageCategory
|
||||
{
|
||||
public:
|
||||
typedef std::unique_ptr<LanguageCategory> 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_
|
|
@ -314,6 +314,7 @@ namespace lldb_private {
|
|||
m_enabled_position = p;
|
||||
}
|
||||
|
||||
friend class LanguageCategory;
|
||||
friend class TypeCategoryMap;
|
||||
|
||||
friend class FormattersContainer<ConstString, TypeFormatImpl>;
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -115,6 +115,7 @@ class IRExecutionUnit;
|
|||
class JITLoader;
|
||||
class JITLoaderList;
|
||||
class Language;
|
||||
class LanguageCategory;
|
||||
class LanguageRuntime;
|
||||
class MemoryRegionInfo;
|
||||
class LineTable;
|
||||
|
|
|
@ -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 = "<group>"; };
|
||||
94235B9B1A8D5FF300EB2EED /* SBVariablesOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBVariablesOptions.cpp; path = source/API/SBVariablesOptions.cpp; sourceTree = "<group>"; };
|
||||
94235B9D1A8D601A00EB2EED /* SBVariablesOptions.i */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c.preprocessed; path = SBVariablesOptions.i; sourceTree = "<group>"; };
|
||||
942612F51B94FFE900EF842E /* LanguageCategory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LanguageCategory.h; path = include/lldb/DataFormatters/LanguageCategory.h; sourceTree = "<group>"; };
|
||||
942612F61B95000000EF842E /* LanguageCategory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LanguageCategory.cpp; path = source/DataFormatters/LanguageCategory.cpp; sourceTree = "<group>"; };
|
||||
942829541A89614000521B30 /* JSON.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JSON.h; path = include/lldb/Utility/JSON.h; sourceTree = "<group>"; };
|
||||
942829551A89614C00521B30 /* JSON.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JSON.cpp; path = source/Utility/JSON.cpp; sourceTree = "<group>"; };
|
||||
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 */,
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -9,6 +9,7 @@ add_lldb_library(lldbDataFormatters
|
|||
FormatCache.cpp
|
||||
FormatClasses.cpp
|
||||
FormatManager.cpp
|
||||
LanguageCategory.cpp
|
||||
LibCxx.cpp
|
||||
LibCxxInitializerList.cpp
|
||||
LibCxxList.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 <initializer_list>
|
||||
|
||||
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<lldb::LanguageType>
|
||||
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<char, std::__1::char_traits<char>, std::__1::allocator<char> >"),
|
||||
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<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >"),
|
||||
std_wstring_summary_sp);
|
||||
|
||||
SyntheticChildren::Flags stl_synth_flags;
|
||||
stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -87,6 +87,12 @@ Language::ForEach (std::function<bool(Language*)> callback)
|
|||
}
|
||||
}
|
||||
|
||||
lldb::TypeCategoryImplSP
|
||||
Language::GetFormatters ()
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
// Constructor
|
||||
//----------------------------------------------------------------------
|
||||
|
|
Loading…
Reference in New Issue