Data formatters now cache themselves. This commit provides a new formatter cache mechanism. Upon resolving a formatter (summary or synthetic), LLDB remembers the resolution for later faster retrieval. Also moved the data formatters subsystem from the core to its own group and folder for easier management, and done some code reorganization. The ObjC runtime v1 now returns a class name if asked for the dynamic type of an object. This is required for formatters caching to work with the v1 runtime. Lastly, this commit disposes of the old hack where ValueObjects had to remember whether they were queried for formatters with their static or dynamic type. Now the ValueObjectDynamicValue class works well enough that we can use its dynamic value setting for the same purpose. llvm-svn: 173728
252 lines
7.1 KiB
C++
252 lines
7.1 KiB
C++
//===-- FormatManager.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_FormatManager_h_
|
|
#define lldb_FormatManager_h_
|
|
|
|
// C Includes
|
|
// C++ Includes
|
|
|
|
// Other libraries and framework includes
|
|
// Project includes
|
|
#include "lldb/lldb-public.h"
|
|
#include "lldb/lldb-enumerations.h"
|
|
|
|
#include "lldb/DataFormatters/FormatCache.h"
|
|
#include "lldb/DataFormatters/FormatNavigator.h"
|
|
#include "lldb/DataFormatters/TypeCategory.h"
|
|
#include "lldb/DataFormatters/TypeCategoryMap.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
// this file (and its. cpp) contain the low-level implementation of LLDB Data Visualization
|
|
// class DataVisualization is the high-level front-end of this feature
|
|
// clients should refer to that class as the entry-point into the data formatters
|
|
// unless they have a good reason to bypass it and prefer to use this file's objects directly
|
|
|
|
class FormatManager : public IFormatChangeListener
|
|
{
|
|
typedef FormatNavigator<ConstString, TypeFormatImpl> ValueNavigator;
|
|
typedef ValueNavigator::MapType ValueMap;
|
|
typedef FormatMap<ConstString, TypeSummaryImpl> NamedSummariesMap;
|
|
typedef TypeCategoryMap::MapType::iterator CategoryMapIterator;
|
|
public:
|
|
|
|
typedef TypeCategoryMap::CallbackType CategoryCallback;
|
|
|
|
FormatManager ();
|
|
|
|
ValueNavigator&
|
|
GetValueNavigator ()
|
|
{
|
|
return m_value_nav;
|
|
}
|
|
|
|
NamedSummariesMap&
|
|
GetNamedSummaryNavigator ()
|
|
{
|
|
return m_named_summaries_map;
|
|
}
|
|
|
|
void
|
|
EnableCategory (const ConstString& category_name,
|
|
TypeCategoryMap::Position pos = TypeCategoryMap::Default)
|
|
{
|
|
m_categories_map.Enable(category_name,
|
|
pos);
|
|
}
|
|
|
|
void
|
|
DisableCategory (const ConstString& category_name)
|
|
{
|
|
m_categories_map.Disable(category_name);
|
|
}
|
|
|
|
void
|
|
EnableCategory (const lldb::TypeCategoryImplSP& category,
|
|
TypeCategoryMap::Position pos = TypeCategoryMap::Default)
|
|
{
|
|
m_categories_map.Enable(category,
|
|
pos);
|
|
}
|
|
|
|
void
|
|
DisableCategory (const lldb::TypeCategoryImplSP& category)
|
|
{
|
|
m_categories_map.Disable(category);
|
|
}
|
|
|
|
bool
|
|
DeleteCategory (const ConstString& category_name)
|
|
{
|
|
return m_categories_map.Delete(category_name);
|
|
}
|
|
|
|
void
|
|
ClearCategories ()
|
|
{
|
|
return m_categories_map.Clear();
|
|
}
|
|
|
|
uint32_t
|
|
GetCategoriesCount ()
|
|
{
|
|
return m_categories_map.GetCount();
|
|
}
|
|
|
|
lldb::TypeCategoryImplSP
|
|
GetCategoryAtIndex (size_t index)
|
|
{
|
|
return m_categories_map.GetAtIndex(index);
|
|
}
|
|
|
|
void
|
|
LoopThroughCategories (CategoryCallback callback, void* param)
|
|
{
|
|
m_categories_map.LoopThrough(callback, param);
|
|
}
|
|
|
|
lldb::TypeCategoryImplSP
|
|
GetCategory (const char* category_name = NULL,
|
|
bool can_create = true)
|
|
{
|
|
if (!category_name)
|
|
return GetCategory(m_default_category_name);
|
|
return GetCategory(ConstString(category_name));
|
|
}
|
|
|
|
lldb::TypeCategoryImplSP
|
|
GetCategory (const ConstString& category_name,
|
|
bool can_create = true);
|
|
|
|
lldb::TypeSummaryImplSP
|
|
GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp);
|
|
|
|
lldb::TypeFilterImplSP
|
|
GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp);
|
|
|
|
#ifndef LLDB_DISABLE_PYTHON
|
|
lldb::ScriptedSyntheticChildrenSP
|
|
GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp);
|
|
#endif
|
|
|
|
#ifndef LLDB_DISABLE_PYTHON
|
|
lldb::SyntheticChildrenSP
|
|
GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp);
|
|
#endif
|
|
|
|
lldb::TypeSummaryImplSP
|
|
GetSummaryFormat (ValueObject& valobj,
|
|
lldb::DynamicValueType use_dynamic);
|
|
|
|
#ifndef LLDB_DISABLE_PYTHON
|
|
lldb::SyntheticChildrenSP
|
|
GetSyntheticChildren (ValueObject& valobj,
|
|
lldb::DynamicValueType use_dynamic);
|
|
#endif
|
|
|
|
bool
|
|
AnyMatches (ConstString type_name,
|
|
TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES,
|
|
bool only_enabled = true,
|
|
const char** matching_category = NULL,
|
|
TypeCategoryImpl::FormatCategoryItems* matching_type = NULL)
|
|
{
|
|
return m_categories_map.AnyMatches(type_name,
|
|
items,
|
|
only_enabled,
|
|
matching_category,
|
|
matching_type);
|
|
}
|
|
|
|
static bool
|
|
GetFormatFromCString (const char *format_cstr,
|
|
bool partial_match_ok,
|
|
lldb::Format &format);
|
|
|
|
static char
|
|
GetFormatAsFormatChar (lldb::Format format);
|
|
|
|
static const char *
|
|
GetFormatAsCString (lldb::Format format);
|
|
|
|
// if the user tries to add formatters for, say, "struct Foo"
|
|
// those will not match any type because of the way we strip qualifiers from typenames
|
|
// this method looks for the case where the user is adding a "class","struct","enum" or "union" Foo
|
|
// and strips the unnecessary qualifier
|
|
static ConstString
|
|
GetValidTypeName (const ConstString& type);
|
|
|
|
// when DataExtractor dumps a vectorOfT, it uses a predefined format for each item
|
|
// this method returns it, or eFormatInvalid if vector_format is not a vectorOf
|
|
static lldb::Format
|
|
GetSingleItemFormat (lldb::Format vector_format);
|
|
|
|
void
|
|
Changed ()
|
|
{
|
|
__sync_add_and_fetch(&m_last_revision, +1);
|
|
m_format_cache.Clear ();
|
|
}
|
|
|
|
uint32_t
|
|
GetCurrentRevision ()
|
|
{
|
|
return m_last_revision;
|
|
}
|
|
|
|
~FormatManager ()
|
|
{
|
|
}
|
|
|
|
private:
|
|
FormatCache m_format_cache;
|
|
ValueNavigator m_value_nav;
|
|
NamedSummariesMap m_named_summaries_map;
|
|
uint32_t m_last_revision;
|
|
TypeCategoryMap m_categories_map;
|
|
|
|
ConstString m_default_category_name;
|
|
ConstString m_system_category_name;
|
|
ConstString m_gnu_cpp_category_name;
|
|
ConstString m_libcxx_category_name;
|
|
ConstString m_objc_category_name;
|
|
ConstString m_corefoundation_category_name;
|
|
ConstString m_coregraphics_category_name;
|
|
ConstString m_coreservices_category_name;
|
|
ConstString m_vectortypes_category_name;
|
|
ConstString m_appkit_category_name;
|
|
|
|
TypeCategoryMap&
|
|
GetCategories ()
|
|
{
|
|
return m_categories_map;
|
|
}
|
|
|
|
// WARNING: these are temporary functions that setup formatters
|
|
// while a few of these actually should be globally available and setup by LLDB itself
|
|
// most would actually belong to the users' lldbinit file or to some other form of configurable
|
|
// storage
|
|
void
|
|
LoadLibStdcppFormatters ();
|
|
|
|
void
|
|
LoadLibcxxFormatters ();
|
|
|
|
void
|
|
LoadSystemFormatters ();
|
|
|
|
void
|
|
LoadObjCFormatters ();
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // lldb_FormatManager_h_
|