2011-08-23 06:03:47 +08:00
|
|
|
//===-- DataVisualization.cpp ---------------------------------------*- C++
|
|
|
|
//-*-===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2011-08-23 06:03:47 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2013-01-29 07:47:25 +08:00
|
|
|
#include "lldb/DataFormatters/DataVisualization.h"
|
2011-08-23 06:03:47 +08:00
|
|
|
|
|
|
|
|
|
|
|
using namespace lldb;
|
|
|
|
using namespace lldb_private;
|
|
|
|
|
|
|
|
static FormatManager &GetFormatManager() {
|
|
|
|
static FormatManager g_format_manager;
|
|
|
|
return g_format_manager;
|
|
|
|
}
|
|
|
|
|
2011-08-23 07:45:15 +08:00
|
|
|
void DataVisualization::ForceUpdate() { GetFormatManager().Changed(); }
|
2011-08-23 06:03:47 +08:00
|
|
|
|
|
|
|
uint32_t DataVisualization::GetCurrentRevision() {
|
|
|
|
return GetFormatManager().GetCurrentRevision();
|
|
|
|
}
|
|
|
|
|
2013-10-05 07:14:13 +08:00
|
|
|
bool DataVisualization::ShouldPrintAsOneLiner(ValueObject &valobj) {
|
|
|
|
return GetFormatManager().ShouldPrintAsOneLiner(valobj);
|
|
|
|
}
|
|
|
|
|
2012-02-15 10:34:21 +08:00
|
|
|
lldb::TypeFormatImplSP
|
2013-10-09 03:03:22 +08:00
|
|
|
DataVisualization::GetFormat(ValueObject &valobj,
|
|
|
|
lldb::DynamicValueType use_dynamic) {
|
|
|
|
return GetFormatManager().GetFormat(valobj, use_dynamic);
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2012-02-15 10:34:21 +08:00
|
|
|
lldb::TypeFormatImplSP
|
2013-10-09 03:03:22 +08:00
|
|
|
DataVisualization::GetFormatForType(lldb::TypeNameSpecifierImplSP type_sp) {
|
|
|
|
return GetFormatManager().GetFormatForType(type_sp);
|
2012-02-15 10:34:21 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
lldb::TypeSummaryImplSP
|
2013-10-09 03:03:22 +08:00
|
|
|
DataVisualization::GetSummaryFormat(ValueObject &valobj,
|
|
|
|
lldb::DynamicValueType use_dynamic) {
|
2011-09-07 06:59:55 +08:00
|
|
|
return GetFormatManager().GetSummaryFormat(valobj, use_dynamic);
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
2011-09-07 06:59:55 +08:00
|
|
|
|
2012-05-09 05:49:57 +08:00
|
|
|
lldb::TypeSummaryImplSP
|
|
|
|
DataVisualization::GetSummaryForType(lldb::TypeNameSpecifierImplSP type_sp) {
|
|
|
|
return GetFormatManager().GetSummaryForType(type_sp);
|
|
|
|
}
|
|
|
|
|
2011-09-07 06:59:55 +08:00
|
|
|
lldb::SyntheticChildrenSP
|
2011-08-23 07:45:15 +08:00
|
|
|
DataVisualization::GetSyntheticChildren(ValueObject &valobj,
|
2011-09-07 06:59:55 +08:00
|
|
|
lldb::DynamicValueType use_dynamic) {
|
|
|
|
return GetFormatManager().GetSyntheticChildren(valobj, use_dynamic);
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2012-05-09 05:49:57 +08:00
|
|
|
lldb::TypeFilterImplSP
|
|
|
|
DataVisualization::GetFilterForType(lldb::TypeNameSpecifierImplSP type_sp) {
|
|
|
|
return GetFormatManager().GetFilterForType(type_sp);
|
|
|
|
}
|
|
|
|
|
2013-01-29 07:47:25 +08:00
|
|
|
lldb::ScriptedSyntheticChildrenSP
|
2012-05-09 05:49:57 +08:00
|
|
|
DataVisualization::GetSyntheticForType(lldb::TypeNameSpecifierImplSP type_sp) {
|
|
|
|
return GetFormatManager().GetSyntheticForType(type_sp);
|
|
|
|
}
|
|
|
|
|
2011-08-23 07:45:15 +08:00
|
|
|
bool DataVisualization::AnyMatches(
|
2012-02-15 10:34:21 +08:00
|
|
|
ConstString type_name, TypeCategoryImpl::FormatCategoryItems items,
|
2011-08-23 07:45:15 +08:00
|
|
|
bool only_enabled, const char **matching_category,
|
2012-02-15 10:34:21 +08:00
|
|
|
TypeCategoryImpl::FormatCategoryItems *matching_type) {
|
2011-08-23 06:03:47 +08:00
|
|
|
return GetFormatManager().AnyMatches(type_name, items, only_enabled,
|
|
|
|
matching_category, matching_type);
|
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
bool DataVisualization::Categories::GetCategory(ConstString category,
|
2012-02-15 10:34:21 +08:00
|
|
|
lldb::TypeCategoryImplSP &entry,
|
|
|
|
bool allow_create) {
|
|
|
|
entry = GetFormatManager().GetCategory(category, allow_create);
|
[lldb] NFC modernize codebase with modernize-use-nullptr
Summary:
NFC = [[ https://llvm.org/docs/Lexicon.html#nfc | Non functional change ]]
This commit is the result of modernizing the LLDB codebase by using
`nullptr` instread of `0` or `NULL`. See
https://clang.llvm.org/extra/clang-tidy/checks/modernize-use-nullptr.html
for more information.
This is the command I ran and I to fix and format the code base:
```
run-clang-tidy.py \
-header-filter='.*' \
-checks='-*,modernize-use-nullptr' \
-fix ~/dev/llvm-project/lldb/.* \
-format \
-style LLVM \
-p ~/llvm-builds/debug-ninja-gcc
```
NOTE: There were also changes to `llvm/utils/unittest` but I did not
include them because I felt that maybe this library shall be updated in
isolation somehow.
NOTE: I know this is a rather large commit but it is a nobrainer in most
parts.
Reviewers: martong, espindola, shafik, #lldb, JDevlieghere
Reviewed By: JDevlieghere
Subscribers: arsenm, jvesely, nhaehnle, hiraditya, JDevlieghere, teemperor, rnkovacs, emaste, kubamracek, nemanjai, ki.stfu, javed.absar, arichardson, kbarton, jrtc27, MaskRay, atanasyan, dexonsmith, arphaman, jfb, jsji, jdoerfert, lldb-commits, llvm-commits
Tags: #lldb, #llvm
Differential Revision: https://reviews.llvm.org/D61847
llvm-svn: 361484
2019-05-23 19:14:47 +08:00
|
|
|
return (entry.get() != nullptr);
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
|
2015-10-30 06:18:05 +08:00
|
|
|
bool DataVisualization::Categories::GetCategory(
|
|
|
|
lldb::LanguageType language, lldb::TypeCategoryImplSP &entry) {
|
|
|
|
if (LanguageCategory *lang_category =
|
|
|
|
GetFormatManager().GetCategoryForLanguage(language))
|
|
|
|
entry = lang_category->GetCategory();
|
|
|
|
return (entry.get() != nullptr);
|
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
void DataVisualization::Categories::Add(ConstString category) {
|
Redesign of the interaction between Python and frozen objects:
- introduced two new classes ValueObjectConstResultChild and ValueObjectConstResultImpl: the first one is a ValueObjectChild obtained from
a ValueObjectConstResult, the second is a common implementation backend for VOCR and VOCRCh of method calls meant to read through pointers stored
in frozen objects ; now such reads transparently move from host to target as required
- as a consequence of the above, removed code that made target-memory copies of expression results in several places throughout LLDB, and also
removed code that enabled to recognize an expression result VO as such
- introduced a new GetPointeeData() method in ValueObject that lets you read a given amount of objects of type T from a VO
representing a T* or T[], and doing dereferences transparently
in private layer it returns a DataExtractor ; in public layer it returns an instance of a newly created lldb::SBData
- as GetPointeeData() does the right thing for both frozen and non-frozen ValueObject's, reimplemented ReadPointedString() to use it
en lieu of doing the raw read itself
- introduced a new GetData() method in ValueObject that lets you get a copy of the data that backs the ValueObject (for pointers,
this returns the address without any previous dereferencing steps ; for arrays it actually reads the whole chunk of memory)
in public layer this returns an SBData, just like GetPointeeData()
- introduced a new CreateValueFromData() method in SBValue that lets you create a new SBValue from a chunk of data wrapped in an SBData
the limitation to remember for this kind of SBValue is that they have no address: extracting the address-of for these objects (with any
of GetAddress(), GetLoadAddress() and AddressOf()) will return invalid values
- added several tests to check that "p"-ing objects (STL classes, char* and char[]) will do the right thing
Solved a bug where global pointers to global variables were not dereferenced correctly for display
New target setting "max-string-summary-length" gives the maximum number of characters to show in a string when summarizing it, instead of the hardcoded 128
Solved a bug where the summary for char[] and char* would not be shown if the ValueObject's were dumped via the "p" command
Removed m_pointers_point_to_load_addrs from ValueObject. Introduced a new m_address_type_of_children, which each ValueObject can set to tell the address type
of any pointers and/or references it creates. In the current codebase, this is load address most of the time (the only notable exception being file
addresses that generate file address children UNLESS we have a live process)
Updated help text for summary-string
Fixed an issue in STL formatters where std::stlcontainer::iterator would match the container's synthetic children providers
Edited the syntax and help for some commands to have proper argument types
llvm-svn: 139160
2011-09-07 03:20:51 +08:00
|
|
|
GetFormatManager().GetCategory(category);
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
2016-09-07 04:57:50 +08:00
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
bool DataVisualization::Categories::Delete(ConstString category) {
|
2011-08-23 06:03:47 +08:00
|
|
|
GetFormatManager().DisableCategory(category);
|
2011-08-23 07:45:15 +08:00
|
|
|
return GetFormatManager().DeleteCategory(category);
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2011-08-23 07:45:15 +08:00
|
|
|
void DataVisualization::Categories::Clear() {
|
|
|
|
GetFormatManager().ClearCategories();
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
void DataVisualization::Categories::Clear(ConstString category) {
|
Redesign of the interaction between Python and frozen objects:
- introduced two new classes ValueObjectConstResultChild and ValueObjectConstResultImpl: the first one is a ValueObjectChild obtained from
a ValueObjectConstResult, the second is a common implementation backend for VOCR and VOCRCh of method calls meant to read through pointers stored
in frozen objects ; now such reads transparently move from host to target as required
- as a consequence of the above, removed code that made target-memory copies of expression results in several places throughout LLDB, and also
removed code that enabled to recognize an expression result VO as such
- introduced a new GetPointeeData() method in ValueObject that lets you read a given amount of objects of type T from a VO
representing a T* or T[], and doing dereferences transparently
in private layer it returns a DataExtractor ; in public layer it returns an instance of a newly created lldb::SBData
- as GetPointeeData() does the right thing for both frozen and non-frozen ValueObject's, reimplemented ReadPointedString() to use it
en lieu of doing the raw read itself
- introduced a new GetData() method in ValueObject that lets you get a copy of the data that backs the ValueObject (for pointers,
this returns the address without any previous dereferencing steps ; for arrays it actually reads the whole chunk of memory)
in public layer this returns an SBData, just like GetPointeeData()
- introduced a new CreateValueFromData() method in SBValue that lets you create a new SBValue from a chunk of data wrapped in an SBData
the limitation to remember for this kind of SBValue is that they have no address: extracting the address-of for these objects (with any
of GetAddress(), GetLoadAddress() and AddressOf()) will return invalid values
- added several tests to check that "p"-ing objects (STL classes, char* and char[]) will do the right thing
Solved a bug where global pointers to global variables were not dereferenced correctly for display
New target setting "max-string-summary-length" gives the maximum number of characters to show in a string when summarizing it, instead of the hardcoded 128
Solved a bug where the summary for char[] and char* would not be shown if the ValueObject's were dumped via the "p" command
Removed m_pointers_point_to_load_addrs from ValueObject. Introduced a new m_address_type_of_children, which each ValueObject can set to tell the address type
of any pointers and/or references it creates. In the current codebase, this is load address most of the time (the only notable exception being file
addresses that generate file address children UNLESS we have a live process)
Updated help text for summary-string
Fixed an issue in STL formatters where std::stlcontainer::iterator would match the container's synthetic children providers
Edited the syntax and help for some commands to have proper argument types
llvm-svn: 139160
2011-09-07 03:20:51 +08:00
|
|
|
GetFormatManager().GetCategory(category)->Clear(
|
|
|
|
eFormatCategoryItemSummary | eFormatCategoryItemRegexSummary);
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
void DataVisualization::Categories::Enable(ConstString category,
|
2013-01-29 07:47:25 +08:00
|
|
|
TypeCategoryMap::Position pos) {
|
2012-02-15 10:34:21 +08:00
|
|
|
if (GetFormatManager().GetCategory(category)->IsEnabled())
|
2011-08-23 06:03:47 +08:00
|
|
|
GetFormatManager().DisableCategory(category);
|
2019-12-04 06:54:59 +08:00
|
|
|
GetFormatManager().EnableCategory(category, pos, {});
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2015-09-05 06:07:48 +08:00
|
|
|
void DataVisualization::Categories::Enable(lldb::LanguageType lang_type) {
|
|
|
|
if (LanguageCategory *lang_category =
|
|
|
|
GetFormatManager().GetCategoryForLanguage(lang_type))
|
|
|
|
lang_category->Enable();
|
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
void DataVisualization::Categories::Disable(ConstString category) {
|
2018-12-15 08:15:33 +08:00
|
|
|
if (GetFormatManager().GetCategory(category)->IsEnabled())
|
2011-08-23 06:03:47 +08:00
|
|
|
GetFormatManager().DisableCategory(category);
|
|
|
|
}
|
|
|
|
|
2015-09-05 06:07:48 +08:00
|
|
|
void DataVisualization::Categories::Disable(lldb::LanguageType lang_type) {
|
|
|
|
if (LanguageCategory *lang_category =
|
|
|
|
GetFormatManager().GetCategoryForLanguage(lang_type))
|
|
|
|
lang_category->Disable();
|
|
|
|
}
|
|
|
|
|
2012-02-15 10:34:21 +08:00
|
|
|
void DataVisualization::Categories::Enable(
|
|
|
|
const lldb::TypeCategoryImplSP &category, TypeCategoryMap::Position pos) {
|
|
|
|
if (category.get()) {
|
|
|
|
if (category->IsEnabled())
|
|
|
|
GetFormatManager().DisableCategory(category);
|
|
|
|
GetFormatManager().EnableCategory(category, pos);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void DataVisualization::Categories::Disable(
|
|
|
|
const lldb::TypeCategoryImplSP &category) {
|
2018-12-15 08:15:33 +08:00
|
|
|
if (category.get() && category->IsEnabled())
|
2012-02-15 10:34:21 +08:00
|
|
|
GetFormatManager().DisableCategory(category);
|
|
|
|
}
|
|
|
|
|
2014-10-03 09:48:32 +08:00
|
|
|
void DataVisualization::Categories::EnableStar() {
|
|
|
|
GetFormatManager().EnableAllCategories();
|
|
|
|
}
|
|
|
|
|
|
|
|
void DataVisualization::Categories::DisableStar() {
|
|
|
|
GetFormatManager().DisableAllCategories();
|
|
|
|
}
|
|
|
|
|
2015-11-14 13:44:23 +08:00
|
|
|
void DataVisualization::Categories::ForEach(
|
|
|
|
TypeCategoryMap::ForEachCallback callback) {
|
|
|
|
GetFormatManager().ForEachCategory(callback);
|
|
|
|
}
|
|
|
|
|
2011-08-23 07:45:15 +08:00
|
|
|
uint32_t DataVisualization::Categories::GetCount() {
|
|
|
|
return GetFormatManager().GetCategoriesCount();
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2012-02-15 10:34:21 +08:00
|
|
|
lldb::TypeCategoryImplSP
|
2013-01-29 07:47:25 +08:00
|
|
|
DataVisualization::Categories::GetCategoryAtIndex(size_t index) {
|
2012-02-15 10:34:21 +08:00
|
|
|
return GetFormatManager().GetCategoryAtIndex(index);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool DataVisualization::NamedSummaryFormats::GetSummaryFormat(
|
2019-03-07 05:22:25 +08:00
|
|
|
ConstString type, lldb::TypeSummaryImplSP &entry) {
|
2013-12-20 17:38:13 +08:00
|
|
|
return GetFormatManager().GetNamedSummaryContainer().Get(type, entry);
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2012-02-15 10:34:21 +08:00
|
|
|
void DataVisualization::NamedSummaryFormats::Add(
|
2019-03-07 05:22:25 +08:00
|
|
|
ConstString type, const lldb::TypeSummaryImplSP &entry) {
|
2013-12-20 17:38:13 +08:00
|
|
|
GetFormatManager().GetNamedSummaryContainer().Add(
|
|
|
|
FormatManager::GetValidTypeName(type), entry);
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
bool DataVisualization::NamedSummaryFormats::Delete(ConstString type) {
|
2013-12-20 17:38:13 +08:00
|
|
|
return GetFormatManager().GetNamedSummaryContainer().Delete(type);
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2011-08-23 07:45:15 +08:00
|
|
|
void DataVisualization::NamedSummaryFormats::Clear() {
|
2013-12-20 17:38:13 +08:00
|
|
|
GetFormatManager().GetNamedSummaryContainer().Clear();
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2015-11-19 03:42:44 +08:00
|
|
|
void DataVisualization::NamedSummaryFormats::ForEach(
|
|
|
|
std::function<bool(ConstString, const lldb::TypeSummaryImplSP &)>
|
|
|
|
callback) {
|
|
|
|
GetFormatManager().GetNamedSummaryContainer().ForEach(callback);
|
2011-08-23 06:03:47 +08:00
|
|
|
}
|
|
|
|
|
2011-08-23 07:45:15 +08:00
|
|
|
uint32_t DataVisualization::NamedSummaryFormats::GetCount() {
|
2013-12-20 17:38:13 +08:00
|
|
|
return GetFormatManager().GetNamedSummaryContainer().GetCount();
|
2011-08-23 07:45:15 +08:00
|
|
|
}
|