diff options
author | Kate Stone <katherine.stone@apple.com> | 2016-09-06 20:57:50 +0000 |
---|---|---|
committer | Kate Stone <katherine.stone@apple.com> | 2016-09-06 20:57:50 +0000 |
commit | b9c1b51e45b845debb76d8658edabca70ca56079 (patch) | |
tree | dfcb5a13ef2b014202340f47036da383eaee74aa /lldb/source/Plugins/Language | |
parent | d5aa73376966339caad04013510626ec2e42c760 (diff) | |
download | bcm5719-llvm-b9c1b51e45b845debb76d8658edabca70ca56079.tar.gz bcm5719-llvm-b9c1b51e45b845debb76d8658edabca70ca56079.zip |
*** This commit represents a complete reformatting of the LLDB source code
*** to conform to clang-format’s LLVM style. This kind of mass change has
*** two obvious implications:
Firstly, merging this particular commit into a downstream fork may be a huge
effort. Alternatively, it may be worth merging all changes up to this commit,
performing the same reformatting operation locally, and then discarding the
merge for this particular commit. The commands used to accomplish this
reformatting were as follows (with current working directory as the root of
the repository):
find . \( -iname "*.c" -or -iname "*.cpp" -or -iname "*.h" -or -iname "*.mm" \) -exec clang-format -i {} +
find . -iname "*.py" -exec autopep8 --in-place --aggressive --aggressive {} + ;
The version of clang-format used was 3.9.0, and autopep8 was 1.2.4.
Secondly, “blame” style tools will generally point to this commit instead of
a meaningful prior commit. There are alternatives available that will attempt
to look through this change and find the appropriate prior commit. YMMV.
llvm-svn: 280751
Diffstat (limited to 'lldb/source/Plugins/Language')
47 files changed, 8995 insertions, 9483 deletions
diff --git a/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp b/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp index 92e30d54f6e..db7c2467582 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.cpp @@ -27,199 +27,185 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -namespace lldb_private -{ -namespace formatters -{ +namespace lldb_private { +namespace formatters { -class BlockPointerSyntheticFrontEnd : public SyntheticChildrenFrontEnd -{ +class BlockPointerSyntheticFrontEnd : public SyntheticChildrenFrontEnd { public: - BlockPointerSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) - : SyntheticChildrenFrontEnd(*valobj_sp), - m_block_struct_type() - { - CompilerType block_pointer_type(m_backend.GetCompilerType()); - CompilerType function_pointer_type; - block_pointer_type.IsBlockPointerType(&function_pointer_type); - - TargetSP target_sp(m_backend.GetTargetSP()); - - if (!target_sp) - { - return; - } - - Error err; - TypeSystem *type_system = target_sp->GetScratchTypeSystemForLanguage(&err, lldb::eLanguageTypeC_plus_plus); - - if (!err.Success() || !type_system) - { - return; - } - - ClangASTContext *clang_ast_context = llvm::dyn_cast<ClangASTContext>(type_system); - - if (!clang_ast_context) - { - return; - } - - ClangASTImporterSP clang_ast_importer = target_sp->GetClangASTImporter(); - - if (!clang_ast_importer) - { - return; - } - - const char *const isa_name("__isa"); - const CompilerType isa_type = clang_ast_context->GetBasicType(lldb::eBasicTypeObjCClass); - const char *const flags_name("__flags"); - const CompilerType flags_type = clang_ast_context->GetBasicType(lldb::eBasicTypeInt); - const char *const reserved_name("__reserved"); - const CompilerType reserved_type = clang_ast_context->GetBasicType(lldb::eBasicTypeInt); - const char *const FuncPtr_name("__FuncPtr"); - const CompilerType FuncPtr_type = clang_ast_importer->CopyType(*clang_ast_context, function_pointer_type); - - m_block_struct_type = clang_ast_context->CreateStructForIdentifier(ConstString(), - { - {isa_name, isa_type}, - {flags_name, flags_type}, - {reserved_name, reserved_type}, - {FuncPtr_name, FuncPtr_type} - }); + BlockPointerSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_block_struct_type() { + CompilerType block_pointer_type(m_backend.GetCompilerType()); + CompilerType function_pointer_type; + block_pointer_type.IsBlockPointerType(&function_pointer_type); + TargetSP target_sp(m_backend.GetTargetSP()); + + if (!target_sp) { + return; + } + + Error err; + TypeSystem *type_system = target_sp->GetScratchTypeSystemForLanguage( + &err, lldb::eLanguageTypeC_plus_plus); + + if (!err.Success() || !type_system) { + return; + } + + ClangASTContext *clang_ast_context = + llvm::dyn_cast<ClangASTContext>(type_system); + + if (!clang_ast_context) { + return; } - ~BlockPointerSyntheticFrontEnd() override = default; + ClangASTImporterSP clang_ast_importer = target_sp->GetClangASTImporter(); - size_t - CalculateNumChildren() override - { - const bool omit_empty_base_classes = false; - return m_block_struct_type.GetNumChildren(omit_empty_base_classes); + if (!clang_ast_importer) { + return; } - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override - { - if (!m_block_struct_type.IsValid()) - { - return lldb::ValueObjectSP(); - } - - if (idx >= CalculateNumChildren()) - { - return lldb::ValueObjectSP(); - } - - const bool thread_and_frame_only_if_stopped = true; - ExecutionContext exe_ctx = m_backend.GetExecutionContextRef().Lock(thread_and_frame_only_if_stopped); - const bool transparent_pointers = false; - const bool omit_empty_base_classes = false; - const bool ignore_array_bounds = false; - ValueObject *value_object = nullptr; - - std::string child_name; - uint32_t child_byte_size = 0; - int32_t child_byte_offset = 0; - uint32_t child_bitfield_bit_size = 0; - uint32_t child_bitfield_bit_offset = 0; - bool child_is_base_class = false; - bool child_is_deref_of_parent = false; - uint64_t language_flags = 0; - - const CompilerType child_type = m_block_struct_type.GetChildCompilerTypeAtIndex(&exe_ctx, idx, transparent_pointers, omit_empty_base_classes, ignore_array_bounds, child_name, child_byte_size, child_byte_offset, child_bitfield_bit_size, child_bitfield_bit_offset, child_is_base_class, child_is_deref_of_parent, value_object, language_flags); - - ValueObjectSP struct_pointer_sp = m_backend.Cast(m_block_struct_type.GetPointerType()); - - if (!struct_pointer_sp) - { - return lldb::ValueObjectSP(); - } - - Error err; - ValueObjectSP struct_sp = struct_pointer_sp->Dereference(err); - - if (!struct_sp || !err.Success()) - { - return lldb::ValueObjectSP(); - } - - ValueObjectSP child_sp(struct_sp->GetSyntheticChildAtOffset(child_byte_offset, - child_type, - true, - ConstString(child_name.c_str(), child_name.size()))); - - return child_sp; + const char *const isa_name("__isa"); + const CompilerType isa_type = + clang_ast_context->GetBasicType(lldb::eBasicTypeObjCClass); + const char *const flags_name("__flags"); + const CompilerType flags_type = + clang_ast_context->GetBasicType(lldb::eBasicTypeInt); + const char *const reserved_name("__reserved"); + const CompilerType reserved_type = + clang_ast_context->GetBasicType(lldb::eBasicTypeInt); + const char *const FuncPtr_name("__FuncPtr"); + const CompilerType FuncPtr_type = + clang_ast_importer->CopyType(*clang_ast_context, function_pointer_type); + + m_block_struct_type = clang_ast_context->CreateStructForIdentifier( + ConstString(), {{isa_name, isa_type}, + {flags_name, flags_type}, + {reserved_name, reserved_type}, + {FuncPtr_name, FuncPtr_type}}); + } + + ~BlockPointerSyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override { + const bool omit_empty_base_classes = false; + return m_block_struct_type.GetNumChildren(omit_empty_base_classes); + } + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override { + if (!m_block_struct_type.IsValid()) { + return lldb::ValueObjectSP(); } - // return true if this object is now safe to use forever without - // ever updating again; the typical (and tested) answer here is - // 'false' - bool - Update() override - { - return false; + if (idx >= CalculateNumChildren()) { + return lldb::ValueObjectSP(); } - // maybe return false if the block pointer is, say, null - bool - MightHaveChildren() override - { - return true; + const bool thread_and_frame_only_if_stopped = true; + ExecutionContext exe_ctx = m_backend.GetExecutionContextRef().Lock( + thread_and_frame_only_if_stopped); + const bool transparent_pointers = false; + const bool omit_empty_base_classes = false; + const bool ignore_array_bounds = false; + ValueObject *value_object = nullptr; + + std::string child_name; + uint32_t child_byte_size = 0; + int32_t child_byte_offset = 0; + uint32_t child_bitfield_bit_size = 0; + uint32_t child_bitfield_bit_offset = 0; + bool child_is_base_class = false; + bool child_is_deref_of_parent = false; + uint64_t language_flags = 0; + + const CompilerType child_type = + m_block_struct_type.GetChildCompilerTypeAtIndex( + &exe_ctx, idx, transparent_pointers, omit_empty_base_classes, + ignore_array_bounds, child_name, child_byte_size, child_byte_offset, + child_bitfield_bit_size, child_bitfield_bit_offset, + child_is_base_class, child_is_deref_of_parent, value_object, + language_flags); + + ValueObjectSP struct_pointer_sp = + m_backend.Cast(m_block_struct_type.GetPointerType()); + + if (!struct_pointer_sp) { + return lldb::ValueObjectSP(); } - size_t - GetIndexOfChildWithName(const ConstString &name) override - { - if (!m_block_struct_type.IsValid()) - return UINT32_MAX; - - const bool omit_empty_base_classes = false; - return m_block_struct_type.GetIndexOfChildWithName(name.AsCString(), omit_empty_base_classes); + Error err; + ValueObjectSP struct_sp = struct_pointer_sp->Dereference(err); + + if (!struct_sp || !err.Success()) { + return lldb::ValueObjectSP(); } + ValueObjectSP child_sp(struct_sp->GetSyntheticChildAtOffset( + child_byte_offset, child_type, true, + ConstString(child_name.c_str(), child_name.size()))); + + return child_sp; + } + + // return true if this object is now safe to use forever without + // ever updating again; the typical (and tested) answer here is + // 'false' + bool Update() override { return false; } + + // maybe return false if the block pointer is, say, null + bool MightHaveChildren() override { return true; } + + size_t GetIndexOfChildWithName(const ConstString &name) override { + if (!m_block_struct_type.IsValid()) + return UINT32_MAX; + + const bool omit_empty_base_classes = false; + return m_block_struct_type.GetIndexOfChildWithName(name.AsCString(), + omit_empty_base_classes); + } + private: - CompilerType m_block_struct_type; + CompilerType m_block_struct_type; }; } // namespace formatters } // namespace lldb_private -bool -lldb_private::formatters::BlockPointerSummaryProvider(ValueObject &valobj, Stream &s, const TypeSummaryOptions &) -{ - lldb_private::SyntheticChildrenFrontEnd *synthetic_children = BlockPointerSyntheticFrontEndCreator(nullptr, valobj.GetSP()); - if (!synthetic_children) - { - return false; - } +bool lldb_private::formatters::BlockPointerSummaryProvider( + ValueObject &valobj, Stream &s, const TypeSummaryOptions &) { + lldb_private::SyntheticChildrenFrontEnd *synthetic_children = + BlockPointerSyntheticFrontEndCreator(nullptr, valobj.GetSP()); + if (!synthetic_children) { + return false; + } - synthetic_children->Update(); + synthetic_children->Update(); - static const ConstString s_FuncPtr_name("__FuncPtr"); - - lldb::ValueObjectSP child_sp = synthetic_children->GetChildAtIndex(synthetic_children->GetIndexOfChildWithName(s_FuncPtr_name)); - - if (!child_sp) - { - return false; - } - - lldb::ValueObjectSP qualified_child_representation_sp = child_sp->GetQualifiedRepresentationIfAvailable(lldb::eDynamicDontRunTarget, true); + static const ConstString s_FuncPtr_name("__FuncPtr"); + + lldb::ValueObjectSP child_sp = synthetic_children->GetChildAtIndex( + synthetic_children->GetIndexOfChildWithName(s_FuncPtr_name)); + + if (!child_sp) { + return false; + } + + lldb::ValueObjectSP qualified_child_representation_sp = + child_sp->GetQualifiedRepresentationIfAvailable( + lldb::eDynamicDontRunTarget, true); - const char *child_value = qualified_child_representation_sp->GetValueAsCString(); + const char *child_value = + qualified_child_representation_sp->GetValueAsCString(); - s.Printf("%s", child_value); + s.Printf("%s", child_value); - return true; + return true; } lldb_private::SyntheticChildrenFrontEnd * -lldb_private::formatters::BlockPointerSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return nullptr; - return new BlockPointerSyntheticFrontEnd(valobj_sp); +lldb_private::formatters::BlockPointerSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + if (!valobj_sp) + return nullptr; + return new BlockPointerSyntheticFrontEnd(valobj_sp); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.h b/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.h index 5e6c748b5db..e5008a8f367 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.h +++ b/lldb/source/Plugins/Language/CPlusPlus/BlockPointer.h @@ -12,15 +12,14 @@ #include "lldb/lldb-forward.h" -namespace lldb_private -{ -namespace formatters -{ -bool -BlockPointerSummaryProvider(ValueObject &, Stream &, const TypeSummaryOptions &); +namespace lldb_private { +namespace formatters { +bool BlockPointerSummaryProvider(ValueObject &, Stream &, + const TypeSummaryOptions &); SyntheticChildrenFrontEnd * -BlockPointerSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP); +BlockPointerSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); } // namespace formatters } // namespace lldb_private diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 71bf160015e..0b4e341888e 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -11,8 +11,8 @@ // C Includes // C++ Includes -#include <cstring> #include <cctype> +#include <cstring> #include <functional> #include <mutex> @@ -39,822 +39,987 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -void -CPlusPlusLanguage::Initialize() -{ - PluginManager::RegisterPlugin (GetPluginNameStatic(), - "C++ Language", - CreateInstance); +void CPlusPlusLanguage::Initialize() { + PluginManager::RegisterPlugin(GetPluginNameStatic(), "C++ Language", + CreateInstance); } -void -CPlusPlusLanguage::Terminate() -{ - PluginManager::UnregisterPlugin (CreateInstance); +void CPlusPlusLanguage::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); } -lldb_private::ConstString -CPlusPlusLanguage::GetPluginNameStatic() -{ - static ConstString g_name("cplusplus"); - return g_name; +lldb_private::ConstString CPlusPlusLanguage::GetPluginNameStatic() { + static ConstString g_name("cplusplus"); + return g_name; } //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ -lldb_private::ConstString -CPlusPlusLanguage::GetPluginName() -{ - return GetPluginNameStatic(); +lldb_private::ConstString CPlusPlusLanguage::GetPluginName() { + return GetPluginNameStatic(); } -uint32_t -CPlusPlusLanguage::GetPluginVersion() -{ - return 1; -} +uint32_t CPlusPlusLanguage::GetPluginVersion() { return 1; } //------------------------------------------------------------------ // Static Functions //------------------------------------------------------------------ -Language * -CPlusPlusLanguage::CreateInstance (lldb::LanguageType language) -{ - if (Language::LanguageIsCPlusPlus(language)) - return new CPlusPlusLanguage(); - return nullptr; +Language *CPlusPlusLanguage::CreateInstance(lldb::LanguageType language) { + if (Language::LanguageIsCPlusPlus(language)) + return new CPlusPlusLanguage(); + return nullptr; } -void -CPlusPlusLanguage::MethodName::Clear() -{ - m_full.Clear(); - m_basename = llvm::StringRef(); - m_context = llvm::StringRef(); - m_arguments = llvm::StringRef(); - m_qualifiers = llvm::StringRef(); - m_type = eTypeInvalid; - m_parsed = false; - m_parse_error = false; +void CPlusPlusLanguage::MethodName::Clear() { + m_full.Clear(); + m_basename = llvm::StringRef(); + m_context = llvm::StringRef(); + m_arguments = llvm::StringRef(); + m_qualifiers = llvm::StringRef(); + m_type = eTypeInvalid; + m_parsed = false; + m_parse_error = false; } -bool -ReverseFindMatchingChars (const llvm::StringRef &s, - const llvm::StringRef &left_right_chars, - size_t &left_pos, - size_t &right_pos, - size_t pos = llvm::StringRef::npos) -{ - assert (left_right_chars.size() == 2); - left_pos = llvm::StringRef::npos; - const char left_char = left_right_chars[0]; - const char right_char = left_right_chars[1]; +bool ReverseFindMatchingChars(const llvm::StringRef &s, + const llvm::StringRef &left_right_chars, + size_t &left_pos, size_t &right_pos, + size_t pos = llvm::StringRef::npos) { + assert(left_right_chars.size() == 2); + left_pos = llvm::StringRef::npos; + const char left_char = left_right_chars[0]; + const char right_char = left_right_chars[1]; + pos = s.find_last_of(left_right_chars, pos); + if (pos == llvm::StringRef::npos || s[pos] == left_char) + return false; + right_pos = pos; + uint32_t depth = 1; + while (pos > 0 && depth > 0) { pos = s.find_last_of(left_right_chars, pos); - if (pos == llvm::StringRef::npos || s[pos] == left_char) - return false; - right_pos = pos; - uint32_t depth = 1; - while (pos > 0 && depth > 0) - { - pos = s.find_last_of(left_right_chars, pos); - if (pos == llvm::StringRef::npos) - return false; - if (s[pos] == left_char) - { - if (--depth == 0) - { - left_pos = pos; - return left_pos < right_pos; - } - } - else if (s[pos] == right_char) - { - ++depth; - } + if (pos == llvm::StringRef::npos) + return false; + if (s[pos] == left_char) { + if (--depth == 0) { + left_pos = pos; + return left_pos < right_pos; + } + } else if (s[pos] == right_char) { + ++depth; } - return false; + } + return false; } -static bool -IsValidBasename(const llvm::StringRef& basename) -{ - // Check that the basename matches with the following regular expression or is an operator name: - // "^~?([A-Za-z_][A-Za-z_0-9]*)(<.*>)?$" - // We are using a hand written implementation because it is significantly more efficient then - // using the general purpose regular expression library. - size_t idx = 0; - if (basename.size() > 0 && basename[0] == '~') - idx = 1; - - if (basename.size() <= idx) - return false; // Empty string or "~" - - if (!std::isalpha(basename[idx]) && basename[idx] != '_') - return false; // First charater (after removing the possible '~'') isn't in [A-Za-z_] - - // Read all characters matching [A-Za-z_0-9] +static bool IsValidBasename(const llvm::StringRef &basename) { + // Check that the basename matches with the following regular expression or is + // an operator name: + // "^~?([A-Za-z_][A-Za-z_0-9]*)(<.*>)?$" + // We are using a hand written implementation because it is significantly more + // efficient then + // using the general purpose regular expression library. + size_t idx = 0; + if (basename.size() > 0 && basename[0] == '~') + idx = 1; + + if (basename.size() <= idx) + return false; // Empty string or "~" + + if (!std::isalpha(basename[idx]) && basename[idx] != '_') + return false; // First charater (after removing the possible '~'') isn't in + // [A-Za-z_] + + // Read all characters matching [A-Za-z_0-9] + ++idx; + while (idx < basename.size()) { + if (!std::isalnum(basename[idx]) && basename[idx] != '_') + break; ++idx; - while (idx < basename.size()) - { - if (!std::isalnum(basename[idx]) && basename[idx] != '_') - break; - ++idx; - } + } - // We processed all characters. It is a vaild basename. - if (idx == basename.size()) - return true; + // We processed all characters. It is a vaild basename. + if (idx == basename.size()) + return true; - // Check for basename with template arguments - // TODO: Improve the quality of the validation with validating the template arguments - if (basename[idx] == '<' && basename.back() == '>') - return true; + // Check for basename with template arguments + // TODO: Improve the quality of the validation with validating the template + // arguments + if (basename[idx] == '<' && basename.back() == '>') + return true; - // Check if the basename is a vaild C++ operator name - if (!basename.startswith("operator")) - return false; + // Check if the basename is a vaild C++ operator name + if (!basename.startswith("operator")) + return false; - static RegularExpression g_operator_regex("^(operator)( ?)([A-Za-z_][A-Za-z_0-9]*|\\(\\)|\\[\\]|[\\^<>=!\\/*+-]+)(<.*>)?(\\[\\])?$"); - std::string basename_str(basename.str()); - return g_operator_regex.Execute(basename_str.c_str(), nullptr); + static RegularExpression g_operator_regex("^(operator)( " + "?)([A-Za-z_][A-Za-z_0-9]*|\\(\\)|" + "\\[\\]|[\\^<>=!\\/" + "*+-]+)(<.*>)?(\\[\\])?$"); + std::string basename_str(basename.str()); + return g_operator_regex.Execute(basename_str.c_str(), nullptr); } -void -CPlusPlusLanguage::MethodName::Parse() -{ - if (!m_parsed && m_full) - { -// ConstString mangled; -// m_full.GetMangledCounterpart(mangled); -// printf ("\n parsing = '%s'\n", m_full.GetCString()); -// if (mangled) -// printf (" mangled = '%s'\n", mangled.GetCString()); - m_parse_error = false; - m_parsed = true; - llvm::StringRef full (m_full.GetCString()); - - size_t arg_start, arg_end; - llvm::StringRef parens("()", 2); - if (ReverseFindMatchingChars (full, parens, arg_start, arg_end)) - { - m_arguments = full.substr(arg_start, arg_end - arg_start + 1); - if (arg_end + 1 < full.size()) - m_qualifiers = full.substr(arg_end + 1); - if (arg_start > 0) - { - size_t basename_end = arg_start; - size_t context_start = 0; - size_t context_end = llvm::StringRef::npos; - if (basename_end > 0 && full[basename_end-1] == '>') - { - // TODO: handle template junk... - // Templated function - size_t template_start, template_end; - llvm::StringRef lt_gt("<>", 2); - if (ReverseFindMatchingChars (full, lt_gt, template_start, template_end, basename_end)) - { - // Check for templated functions that include return type like: 'void foo<Int>()' - context_start = full.rfind(' ', template_start); - if (context_start == llvm::StringRef::npos) - context_start = 0; - else - ++context_start; - - context_end = full.rfind(':', template_start); - if (context_end == llvm::StringRef::npos || context_end < context_start) - context_end = context_start; - } - else - { - context_end = full.rfind(':', basename_end); - } - } - else if (context_end == llvm::StringRef::npos) - { - context_end = full.rfind(':', basename_end); - } - - if (context_end == llvm::StringRef::npos) - m_basename = full.substr(0, basename_end); - else - { - if (context_start < context_end) - m_context = full.substr(context_start, context_end - 1 - context_start); - const size_t basename_begin = context_end + 1; - m_basename = full.substr(basename_begin, basename_end - basename_begin); - } - m_type = eTypeUnknownMethod; - } +void CPlusPlusLanguage::MethodName::Parse() { + if (!m_parsed && m_full) { + // ConstString mangled; + // m_full.GetMangledCounterpart(mangled); + // printf ("\n parsing = '%s'\n", m_full.GetCString()); + // if (mangled) + // printf (" mangled = '%s'\n", mangled.GetCString()); + m_parse_error = false; + m_parsed = true; + llvm::StringRef full(m_full.GetCString()); + + size_t arg_start, arg_end; + llvm::StringRef parens("()", 2); + if (ReverseFindMatchingChars(full, parens, arg_start, arg_end)) { + m_arguments = full.substr(arg_start, arg_end - arg_start + 1); + if (arg_end + 1 < full.size()) + m_qualifiers = full.substr(arg_end + 1); + if (arg_start > 0) { + size_t basename_end = arg_start; + size_t context_start = 0; + size_t context_end = llvm::StringRef::npos; + if (basename_end > 0 && full[basename_end - 1] == '>') { + // TODO: handle template junk... + // Templated function + size_t template_start, template_end; + llvm::StringRef lt_gt("<>", 2); + if (ReverseFindMatchingChars(full, lt_gt, template_start, + template_end, basename_end)) { + // Check for templated functions that include return type like: + // 'void foo<Int>()' + context_start = full.rfind(' ', template_start); + if (context_start == llvm::StringRef::npos) + context_start = 0; else - { - m_parse_error = true; - return; - } - - if (!IsValidBasename(m_basename)) - { - // The C++ basename doesn't match our regular expressions so this can't - // be a valid C++ method, clear everything out and indicate an error - m_context = llvm::StringRef(); - m_basename = llvm::StringRef(); - m_arguments = llvm::StringRef(); - m_qualifiers = llvm::StringRef(); - m_parse_error = true; - } + ++context_start; + + context_end = full.rfind(':', template_start); + if (context_end == llvm::StringRef::npos || + context_end < context_start) + context_end = context_start; + } else { + context_end = full.rfind(':', basename_end); + } + } else if (context_end == llvm::StringRef::npos) { + context_end = full.rfind(':', basename_end); } - else - { - m_parse_error = true; + + if (context_end == llvm::StringRef::npos) + m_basename = full.substr(0, basename_end); + else { + if (context_start < context_end) + m_context = + full.substr(context_start, context_end - 1 - context_start); + const size_t basename_begin = context_end + 1; + m_basename = + full.substr(basename_begin, basename_end - basename_begin); } + m_type = eTypeUnknownMethod; + } else { + m_parse_error = true; + return; + } + + if (!IsValidBasename(m_basename)) { + // The C++ basename doesn't match our regular expressions so this can't + // be a valid C++ method, clear everything out and indicate an error + m_context = llvm::StringRef(); + m_basename = llvm::StringRef(); + m_arguments = llvm::StringRef(); + m_qualifiers = llvm::StringRef(); + m_parse_error = true; + } + } else { + m_parse_error = true; } + } } -llvm::StringRef -CPlusPlusLanguage::MethodName::GetBasename () -{ - if (!m_parsed) - Parse(); - return m_basename; +llvm::StringRef CPlusPlusLanguage::MethodName::GetBasename() { + if (!m_parsed) + Parse(); + return m_basename; } -llvm::StringRef -CPlusPlusLanguage::MethodName::GetContext () -{ - if (!m_parsed) - Parse(); - return m_context; +llvm::StringRef CPlusPlusLanguage::MethodName::GetContext() { + if (!m_parsed) + Parse(); + return m_context; } -llvm::StringRef -CPlusPlusLanguage::MethodName::GetArguments () -{ - if (!m_parsed) - Parse(); - return m_arguments; +llvm::StringRef CPlusPlusLanguage::MethodName::GetArguments() { + if (!m_parsed) + Parse(); + return m_arguments; } -llvm::StringRef -CPlusPlusLanguage::MethodName::GetQualifiers () -{ - if (!m_parsed) - Parse(); - return m_qualifiers; +llvm::StringRef CPlusPlusLanguage::MethodName::GetQualifiers() { + if (!m_parsed) + Parse(); + return m_qualifiers; } -std::string -CPlusPlusLanguage::MethodName::GetScopeQualifiedName () -{ - if (!m_parsed) - Parse(); - if (m_basename.empty() || m_context.empty()) - return std::string(); +std::string CPlusPlusLanguage::MethodName::GetScopeQualifiedName() { + if (!m_parsed) + Parse(); + if (m_basename.empty() || m_context.empty()) + return std::string(); - std::string res; - res += m_context; - res += "::"; - res += m_basename; + std::string res; + res += m_context; + res += "::"; + res += m_basename; - return res; + return res; } -bool -CPlusPlusLanguage::IsCPPMangledName (const char *name) -{ - // FIXME, we should really run through all the known C++ Language plugins and ask each one if - // this is a C++ mangled name, but we can put that off till there is actually more than one - // we care about. - - return (name != nullptr && name[0] == '_' && name[1] == 'Z'); +bool CPlusPlusLanguage::IsCPPMangledName(const char *name) { + // FIXME, we should really run through all the known C++ Language plugins and + // ask each one if + // this is a C++ mangled name, but we can put that off till there is actually + // more than one + // we care about. + + return (name != nullptr && name[0] == '_' && name[1] == 'Z'); } -bool -CPlusPlusLanguage::ExtractContextAndIdentifier (const char *name, llvm::StringRef &context, llvm::StringRef &identifier) -{ - static RegularExpression g_basename_regex("^(([A-Za-z_][A-Za-z_0-9]*::)*)(~?[A-Za-z_~][A-Za-z_0-9]*)$"); - RegularExpression::Match match(4); - if (g_basename_regex.Execute (name, &match)) - { - match.GetMatchAtIndex(name, 1, context); - match.GetMatchAtIndex(name, 3, identifier); - return true; - } - return false; +bool CPlusPlusLanguage::ExtractContextAndIdentifier( + const char *name, llvm::StringRef &context, llvm::StringRef &identifier) { + static RegularExpression g_basename_regex( + "^(([A-Za-z_][A-Za-z_0-9]*::)*)(~?[A-Za-z_~][A-Za-z_0-9]*)$"); + RegularExpression::Match match(4); + if (g_basename_regex.Execute(name, &match)) { + match.GetMatchAtIndex(name, 1, context); + match.GetMatchAtIndex(name, 3, identifier); + return true; + } + return false; } -class CPPRuntimeEquivalents -{ +class CPPRuntimeEquivalents { public: - CPPRuntimeEquivalents () - { - m_impl.Append(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >").AsCString(), ConstString("basic_string<char>")); - - // these two (with a prefixed std::) occur when c++stdlib string class occurs as a template argument in some STL container - m_impl.Append(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >").AsCString(), ConstString("std::basic_string<char>")); - - m_impl.Sort(); - } - - void - Add (ConstString& type_name, - ConstString& type_equivalent) - { - m_impl.Insert(type_name.AsCString(), type_equivalent); + CPPRuntimeEquivalents() { + m_impl.Append(ConstString("std::basic_string<char, std::char_traits<char>, " + "std::allocator<char> >") + .AsCString(), + ConstString("basic_string<char>")); + + // these two (with a prefixed std::) occur when c++stdlib string class + // occurs as a template argument in some STL container + m_impl.Append(ConstString("std::basic_string<char, std::char_traits<char>, " + "std::allocator<char> >") + .AsCString(), + ConstString("std::basic_string<char>")); + + m_impl.Sort(); + } + + void Add(ConstString &type_name, ConstString &type_equivalent) { + m_impl.Insert(type_name.AsCString(), type_equivalent); + } + + uint32_t FindExactMatches(ConstString &type_name, + std::vector<ConstString> &equivalents) { + uint32_t count = 0; + + for (ImplData match = m_impl.FindFirstValueForName(type_name.AsCString()); + match != nullptr; match = m_impl.FindNextValueForName(match)) { + equivalents.push_back(match->value); + count++; } - - uint32_t - FindExactMatches (ConstString& type_name, - std::vector<ConstString>& equivalents) - { - uint32_t count = 0; - - for (ImplData match = m_impl.FindFirstValueForName(type_name.AsCString()); - match != nullptr; - match = m_impl.FindNextValueForName(match)) - { - equivalents.push_back(match->value); - count++; - } - return count; - } - - // partial matches can occur when a name with equivalents is a template argument. - // e.g. we may have "class Foo" be a match for "struct Bar". if we have a typename - // such as "class Templatized<class Foo, Anything>" we want this to be replaced with - // "class Templatized<struct Bar, Anything>". Since partial matching is time consuming - // once we get a partial match, we add it to the exact matches list for faster retrieval - uint32_t - FindPartialMatches (ConstString& type_name, - std::vector<ConstString>& equivalents) - { - uint32_t count = 0; - - const char* type_name_cstr = type_name.AsCString(); - - size_t items_count = m_impl.GetSize(); - - for (size_t item = 0; item < items_count; item++) - { - const char* key_cstr = m_impl.GetCStringAtIndex(item); - if ( strstr(type_name_cstr,key_cstr) ) - { - count += AppendReplacements(type_name_cstr, - key_cstr, - equivalents); - } - } - - return count; + return count; + } + + // partial matches can occur when a name with equivalents is a template + // argument. + // e.g. we may have "class Foo" be a match for "struct Bar". if we have a + // typename + // such as "class Templatized<class Foo, Anything>" we want this to be + // replaced with + // "class Templatized<struct Bar, Anything>". Since partial matching is time + // consuming + // once we get a partial match, we add it to the exact matches list for faster + // retrieval + uint32_t FindPartialMatches(ConstString &type_name, + std::vector<ConstString> &equivalents) { + uint32_t count = 0; + + const char *type_name_cstr = type_name.AsCString(); + + size_t items_count = m_impl.GetSize(); + + for (size_t item = 0; item < items_count; item++) { + const char *key_cstr = m_impl.GetCStringAtIndex(item); + if (strstr(type_name_cstr, key_cstr)) { + count += AppendReplacements(type_name_cstr, key_cstr, equivalents); + } } - + + return count; + } + private: - std::string& replace (std::string& target, - std::string& pattern, - std::string& with) - { - size_t pos; - size_t pattern_len = pattern.size(); - - while ( (pos = target.find(pattern)) != std::string::npos ) - target.replace(pos, pattern_len, with); - - return target; - } - - uint32_t - AppendReplacements (const char* original, - const char *matching_key, - std::vector<ConstString>& equivalents) - { - std::string matching_key_str(matching_key); - ConstString original_const(original); - - uint32_t count = 0; - - for (ImplData match = m_impl.FindFirstValueForName(matching_key); - match != nullptr; - match = m_impl.FindNextValueForName(match)) - { - std::string target(original); - std::string equiv_class(match->value.AsCString()); - - replace (target, matching_key_str, equiv_class); - - ConstString target_const(target.c_str()); - -// you will most probably want to leave this off since it might make this map grow indefinitely + std::string &replace(std::string &target, std::string &pattern, + std::string &with) { + size_t pos; + size_t pattern_len = pattern.size(); + + while ((pos = target.find(pattern)) != std::string::npos) + target.replace(pos, pattern_len, with); + + return target; + } + + uint32_t AppendReplacements(const char *original, const char *matching_key, + std::vector<ConstString> &equivalents) { + std::string matching_key_str(matching_key); + ConstString original_const(original); + + uint32_t count = 0; + + for (ImplData match = m_impl.FindFirstValueForName(matching_key); + match != nullptr; match = m_impl.FindNextValueForName(match)) { + std::string target(original); + std::string equiv_class(match->value.AsCString()); + + replace(target, matching_key_str, equiv_class); + + ConstString target_const(target.c_str()); + +// you will most probably want to leave this off since it might make this map +// grow indefinitely #ifdef ENABLE_CPP_EQUIVALENTS_MAP_TO_GROW - Add(original_const, target_const); + Add(original_const, target_const); #endif - equivalents.push_back(target_const); - - count++; - } - - return count; + equivalents.push_back(target_const); + + count++; } - - typedef UniqueCStringMap<ConstString> Impl; - typedef const Impl::Entry* ImplData; - Impl m_impl; + + return count; + } + + typedef UniqueCStringMap<ConstString> Impl; + typedef const Impl::Entry *ImplData; + Impl m_impl; }; -static CPPRuntimeEquivalents& -GetEquivalentsMap () -{ - static CPPRuntimeEquivalents g_equivalents_map; - return g_equivalents_map; +static CPPRuntimeEquivalents &GetEquivalentsMap() { + static CPPRuntimeEquivalents g_equivalents_map; + return g_equivalents_map; } uint32_t -CPlusPlusLanguage::FindEquivalentNames(ConstString type_name, std::vector<ConstString>& equivalents) -{ - uint32_t count = GetEquivalentsMap().FindExactMatches(type_name, equivalents); - - bool might_have_partials= - ( count == 0 ) // if we have a full name match just use it - && (strchr(type_name.AsCString(), '<') != nullptr // we should only have partial matches when templates are involved, check that we have - && strchr(type_name.AsCString(), '>') != nullptr); // angle brackets in the type_name before trying to scan for partial matches - - if ( might_have_partials ) - count = GetEquivalentsMap().FindPartialMatches(type_name, equivalents); - - return count; +CPlusPlusLanguage::FindEquivalentNames(ConstString type_name, + std::vector<ConstString> &equivalents) { + uint32_t count = GetEquivalentsMap().FindExactMatches(type_name, equivalents); + + bool might_have_partials = + (count == 0) // if we have a full name match just use it + && (strchr(type_name.AsCString(), '<') != + nullptr // we should only have partial matches when templates are + // involved, check that we have + && strchr(type_name.AsCString(), '>') != nullptr); // angle brackets + // in the type_name + // before trying to + // scan for partial + // matches + + if (might_have_partials) + count = GetEquivalentsMap().FindPartialMatches(type_name, equivalents); + + return count; } -static void -LoadLibCxxFormatters (lldb::TypeCategoryImplSP cpp_category_sp) -{ - if (!cpp_category_sp) - return; - - TypeSummaryImpl::Flags stl_summary_flags; - stl_summary_flags.SetCascades(true) - .SetSkipPointers(false) - .SetSkipReferences(false) - .SetDontShowChildren(true) - .SetDontShowValue(true) - .SetShowMembersOneLiner(false) - .SetHideItemNames(false); - +static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { + if (!cpp_category_sp) + return; + + TypeSummaryImpl::Flags stl_summary_flags; + stl_summary_flags.SetCascades(true) + .SetSkipPointers(false) + .SetSkipReferences(false) + .SetDontShowChildren(true) + .SetDontShowValue(true) + .SetShowMembersOneLiner(false) + .SetHideItemNames(false); + #ifndef LLDB_DISABLE_PYTHON - lldb::TypeSummaryImplSP std_string_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxStringSummaryProvider, "std::string summary provider")); - lldb::TypeSummaryImplSP std_wstring_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxWStringSummaryProvider, "std::wstring summary provider")); - - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::string"), - std_string_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__ndk1::string"), - std_string_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >"), - std_string_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >"), - std_string_summary_sp); - - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::wstring"), - std_wstring_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__ndk1::wstring"), - std_wstring_summary_sp); - cpp_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); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__ndk1::basic_string<wchar_t, std::__ndk1::char_traits<wchar_t>, std::__ndk1::allocator<wchar_t> >"), - std_wstring_summary_sp); - - SyntheticChildren::Flags stl_synth_flags; - stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false); - - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("^std::__(ndk)?1::vector<bool, std::__(ndk)?1::allocator<bool> >$"), stl_synth_flags, true); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator, "libc++ std::vector synthetic children", ConstString("^std::__(ndk)?1::vector<.+>(( )?&)?$"), stl_synth_flags, true); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator, "libc++ std::list synthetic children", ConstString("^std::__(ndk)?1::list<.+>(( )?&)?$"), stl_synth_flags, true); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::map synthetic children", ConstString("^std::__(ndk)?1::map<.+> >(( )?&)?$"), stl_synth_flags, true); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("std::__(ndk)?1::vector<std::__(ndk)?1::allocator<bool> >"), stl_synth_flags); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("std::__(ndk)?1::vector<bool, std::__(ndk)?1::allocator<bool> >"), stl_synth_flags); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::set synthetic children", ConstString("^std::__(ndk)?1::set<.+> >(( )?&)?$"), stl_synth_flags, true); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::multiset synthetic children", ConstString("^std::__(ndk)?1::multiset<.+> >(( )?&)?$"), stl_synth_flags, true); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::multimap synthetic children", ConstString("^std::__(ndk)?1::multimap<.+> >(( )?&)?$"), stl_synth_flags, true); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator, "libc++ std::unordered containers synthetic children", ConstString("^(std::__(ndk)?1::)unordered_(multi)?(map|set)<.+> >$"), stl_synth_flags, true); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator, "libc++ std::initializer_list synthetic children", ConstString("^std::initializer_list<.+>(( )?&)?$"), stl_synth_flags, true); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator, "libc++ std::atomic synthetic children", ConstString("^std::__(ndk)?1::atomic<.+>$"), stl_synth_flags, true); - - cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^(std::__(ndk)?1::)deque<.+>(( )?&)?$")), - SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, - "lldb.formatters.cpp.libcxx.stddeque_SynthProvider"))); - - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, "shared_ptr synthetic children", ConstString("^(std::__(ndk)?1::)shared_ptr<.+>(( )?&)?$"), stl_synth_flags, true); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, "weak_ptr synthetic children", ConstString("^(std::__(ndk)?1::)weak_ptr<.+>(( )?&)?$"), stl_synth_flags, true); - - stl_summary_flags.SetDontShowChildren(false);stl_summary_flags.SetSkipPointers(false); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector<bool> summary provider", ConstString("std::__(ndk)?1::vector<bool, std::__(ndk)?1::allocator<bool> >"), stl_summary_flags, true); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector summary provider", ConstString("^std::__(ndk)?1::vector<.+>(( )?&)?$"), stl_summary_flags, true); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::list summary provider", ConstString("^std::__(ndk)?1::list<.+>(( )?&)?$"), stl_summary_flags, true); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::map summary provider", ConstString("^std::__(ndk)?1::map<.+>(( )?&)?$"), stl_summary_flags, true); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::deque summary provider", ConstString("^std::__(ndk)?1::deque<.+>(( )?&)?$"), stl_summary_flags, true); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::set summary provider", ConstString("^std::__(ndk)?1::set<.+>(( )?&)?$"), stl_summary_flags, true); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::multiset summary provider", ConstString("^std::__(ndk)?1::multiset<.+>(( )?&)?$"), stl_summary_flags, true); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::multimap summary provider", ConstString("^std::__(ndk)?1::multimap<.+>(( )?&)?$"), stl_summary_flags, true); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::unordered containers summary provider", ConstString("^(std::__(ndk)?1::)unordered_(multi)?(map|set)<.+> >$"), stl_summary_flags, true); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibCxxAtomicSummaryProvider, "libc++ std::atomic summary provider", ConstString("^std::__(ndk)?1::atomic<.+>$"), stl_summary_flags, true); - - stl_summary_flags.SetSkipPointers(true); - - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxSmartPointerSummaryProvider, "libc++ std::shared_ptr summary provider", ConstString("^std::__(ndk)?1::shared_ptr<.+>(( )?&)?$"), stl_summary_flags, true); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxSmartPointerSummaryProvider, "libc++ std::weak_ptr summary provider", ConstString("^std::__(ndk)?1::weak_ptr<.+>(( )?&)?$"), stl_summary_flags, true); - - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator, "std::vector iterator synthetic children", ConstString("^std::__(ndk)?1::__wrap_iter<.+>$"), stl_synth_flags, true); - - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector<bool> summary provider", ConstString("std::__(ndk)?1::vector<bool, std::__(ndk)?1::allocator<bool> >"), stl_summary_flags); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator, "std::map iterator synthetic children", ConstString("^std::__(ndk)?1::__map_iterator<.+>$"), stl_synth_flags, true); - - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibcxxFunctionFrontEndCreator, "std::function synthetic value provider", ConstString("^std::__1::function<.+>$"), stl_synth_flags, true); + lldb::TypeSummaryImplSP std_string_summary_sp(new CXXFunctionSummaryFormat( + stl_summary_flags, lldb_private::formatters::LibcxxStringSummaryProvider, + "std::string summary provider")); + lldb::TypeSummaryImplSP std_wstring_summary_sp(new CXXFunctionSummaryFormat( + stl_summary_flags, lldb_private::formatters::LibcxxWStringSummaryProvider, + "std::wstring summary provider")); + + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__1::string"), std_string_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__ndk1::string"), std_string_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__1::basic_string<char, std::__1::char_traits<char>, " + "std::__1::allocator<char> >"), + std_string_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__ndk1::basic_string<char, " + "std::__ndk1::char_traits<char>, " + "std::__ndk1::allocator<char> >"), + std_string_summary_sp); + + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__1::wstring"), std_wstring_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__ndk1::wstring"), std_wstring_summary_sp); + cpp_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); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__ndk1::basic_string<wchar_t, " + "std::__ndk1::char_traits<wchar_t>, " + "std::__ndk1::allocator<wchar_t> >"), + std_wstring_summary_sp); + + SyntheticChildren::Flags stl_synth_flags; + stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences( + false); + + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, + "libc++ std::vector<bool> synthetic children", + ConstString( + "^std::__(ndk)?1::vector<bool, std::__(ndk)?1::allocator<bool> >$"), + stl_synth_flags, true); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator, + "libc++ std::vector synthetic children", + ConstString("^std::__(ndk)?1::vector<.+>(( )?&)?$"), stl_synth_flags, + true); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator, + "libc++ std::list synthetic children", + ConstString("^std::__(ndk)?1::list<.+>(( )?&)?$"), stl_synth_flags, true); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, + "libc++ std::map synthetic children", + ConstString("^std::__(ndk)?1::map<.+> >(( )?&)?$"), stl_synth_flags, + true); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, + "libc++ std::vector<bool> synthetic children", + ConstString("std::__(ndk)?1::vector<std::__(ndk)?1::allocator<bool> >"), + stl_synth_flags); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, + "libc++ std::vector<bool> synthetic children", + ConstString( + "std::__(ndk)?1::vector<bool, std::__(ndk)?1::allocator<bool> >"), + stl_synth_flags); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, + "libc++ std::set synthetic children", + ConstString("^std::__(ndk)?1::set<.+> >(( )?&)?$"), stl_synth_flags, + true); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, + "libc++ std::multiset synthetic children", + ConstString("^std::__(ndk)?1::multiset<.+> >(( )?&)?$"), stl_synth_flags, + true); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, + "libc++ std::multimap synthetic children", + ConstString("^std::__(ndk)?1::multimap<.+> >(( )?&)?$"), stl_synth_flags, + true); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator, + "libc++ std::unordered containers synthetic children", + ConstString("^(std::__(ndk)?1::)unordered_(multi)?(map|set)<.+> >$"), + stl_synth_flags, true); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator, + "libc++ std::initializer_list synthetic children", + ConstString("^std::initializer_list<.+>(( )?&)?$"), stl_synth_flags, + true); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator, + "libc++ std::atomic synthetic children", + ConstString("^std::__(ndk)?1::atomic<.+>$"), stl_synth_flags, true); + + cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add( + RegularExpressionSP( + new RegularExpression("^(std::__(ndk)?1::)deque<.+>(( )?&)?$")), + SyntheticChildrenSP(new ScriptedSyntheticChildren( + stl_synth_flags, + "lldb.formatters.cpp.libcxx.stddeque_SynthProvider"))); + + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, + "shared_ptr synthetic children", + ConstString("^(std::__(ndk)?1::)shared_ptr<.+>(( )?&)?$"), + stl_synth_flags, true); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, + "weak_ptr synthetic children", + ConstString("^(std::__(ndk)?1::)weak_ptr<.+>(( )?&)?$"), stl_synth_flags, + true); + + stl_summary_flags.SetDontShowChildren(false); + stl_summary_flags.SetSkipPointers(false); + AddCXXSummary( + cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, + "libc++ std::vector<bool> summary provider", + ConstString( + "std::__(ndk)?1::vector<bool, std::__(ndk)?1::allocator<bool> >"), + stl_summary_flags, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxContainerSummaryProvider, + "libc++ std::vector summary provider", + ConstString("^std::__(ndk)?1::vector<.+>(( )?&)?$"), + stl_summary_flags, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxContainerSummaryProvider, + "libc++ std::list summary provider", + ConstString("^std::__(ndk)?1::list<.+>(( )?&)?$"), + stl_summary_flags, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxContainerSummaryProvider, + "libc++ std::map summary provider", + ConstString("^std::__(ndk)?1::map<.+>(( )?&)?$"), + stl_summary_flags, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxContainerSummaryProvider, + "libc++ std::deque summary provider", + ConstString("^std::__(ndk)?1::deque<.+>(( )?&)?$"), + stl_summary_flags, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxContainerSummaryProvider, + "libc++ std::set summary provider", + ConstString("^std::__(ndk)?1::set<.+>(( )?&)?$"), + stl_summary_flags, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxContainerSummaryProvider, + "libc++ std::multiset summary provider", + ConstString("^std::__(ndk)?1::multiset<.+>(( )?&)?$"), + stl_summary_flags, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxContainerSummaryProvider, + "libc++ std::multimap summary provider", + ConstString("^std::__(ndk)?1::multimap<.+>(( )?&)?$"), + stl_summary_flags, true); + AddCXXSummary( + cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, + "libc++ std::unordered containers summary provider", + ConstString("^(std::__(ndk)?1::)unordered_(multi)?(map|set)<.+> >$"), + stl_summary_flags, true); + AddCXXSummary( + cpp_category_sp, lldb_private::formatters::LibCxxAtomicSummaryProvider, + "libc++ std::atomic summary provider", + ConstString("^std::__(ndk)?1::atomic<.+>$"), stl_summary_flags, true); + + stl_summary_flags.SetSkipPointers(true); + + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxSmartPointerSummaryProvider, + "libc++ std::shared_ptr summary provider", + ConstString("^std::__(ndk)?1::shared_ptr<.+>(( )?&)?$"), + stl_summary_flags, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxSmartPointerSummaryProvider, + "libc++ std::weak_ptr summary provider", + ConstString("^std::__(ndk)?1::weak_ptr<.+>(( )?&)?$"), + stl_summary_flags, true); + + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator, + "std::vector iterator synthetic children", + ConstString("^std::__(ndk)?1::__wrap_iter<.+>$"), stl_synth_flags, true); + + AddCXXSummary( + cpp_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, + "libc++ std::vector<bool> summary provider", + ConstString( + "std::__(ndk)?1::vector<bool, std::__(ndk)?1::allocator<bool> >"), + stl_summary_flags); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator, + "std::map iterator synthetic children", + ConstString("^std::__(ndk)?1::__map_iterator<.+>$"), stl_synth_flags, + true); + + AddCXXSynthetic( + cpp_category_sp, lldb_private::formatters::LibcxxFunctionFrontEndCreator, + "std::function synthetic value provider", + ConstString("^std::__1::function<.+>$"), stl_synth_flags, true); #endif } -static void -LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) -{ - if (!cpp_category_sp) - return; - - TypeSummaryImpl::Flags stl_summary_flags; - stl_summary_flags.SetCascades(true) - .SetSkipPointers(false) - .SetSkipReferences(false) - .SetDontShowChildren(true) - .SetDontShowValue(true) - .SetShowMembersOneLiner(false) - .SetHideItemNames(false); - - lldb::TypeSummaryImplSP std_string_summary_sp(new StringSummaryFormat(stl_summary_flags, - "${var._M_dataplus._M_p}")); - - lldb::TypeSummaryImplSP cxx11_string_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, - LibStdcppStringSummaryProvider, - "libstdc++ c++11 std::string summary provider")); - lldb::TypeSummaryImplSP cxx11_wstring_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, - LibStdcppWStringSummaryProvider, - "libstdc++ c++11 std::wstring summary provider")); - - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::string"), - std_string_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char>"), - std_string_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char,std::char_traits<char>,std::allocator<char> >"), - std_string_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"), - std_string_summary_sp); - - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__cxx11::string"), - cxx11_string_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >"), - cxx11_string_summary_sp); - - // making sure we force-pick the summary for printing wstring (_M_p is a wchar_t*) - lldb::TypeSummaryImplSP std_wstring_summary_sp(new StringSummaryFormat(stl_summary_flags, - "${var._M_dataplus._M_p%S}")); - - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::wstring"), - std_wstring_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t>"), - std_wstring_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >"), - std_wstring_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >"), - std_wstring_summary_sp); - - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__cxx11::wstring"), - cxx11_wstring_summary_sp); - cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >"), - cxx11_wstring_summary_sp); +static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { + if (!cpp_category_sp) + return; + + TypeSummaryImpl::Flags stl_summary_flags; + stl_summary_flags.SetCascades(true) + .SetSkipPointers(false) + .SetSkipReferences(false) + .SetDontShowChildren(true) + .SetDontShowValue(true) + .SetShowMembersOneLiner(false) + .SetHideItemNames(false); + + lldb::TypeSummaryImplSP std_string_summary_sp( + new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p}")); + + lldb::TypeSummaryImplSP cxx11_string_summary_sp(new CXXFunctionSummaryFormat( + stl_summary_flags, LibStdcppStringSummaryProvider, + "libstdc++ c++11 std::string summary provider")); + lldb::TypeSummaryImplSP cxx11_wstring_summary_sp(new CXXFunctionSummaryFormat( + stl_summary_flags, LibStdcppWStringSummaryProvider, + "libstdc++ c++11 std::wstring summary provider")); + + cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::string"), + std_string_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::basic_string<char>"), std_string_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::basic_string<char,std::char_traits<char>,std::" + "allocator<char> >"), + std_string_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::basic_string<char, std::char_traits<char>, " + "std::allocator<char> >"), + std_string_summary_sp); + + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__cxx11::string"), cxx11_string_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__cxx11::basic_string<char, std::char_traits<char>, " + "std::allocator<char> >"), + cxx11_string_summary_sp); + + // making sure we force-pick the summary for printing wstring (_M_p is a + // wchar_t*) + lldb::TypeSummaryImplSP std_wstring_summary_sp( + new StringSummaryFormat(stl_summary_flags, "${var._M_dataplus._M_p%S}")); + + cpp_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::wstring"), + std_wstring_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::basic_string<wchar_t>"), std_wstring_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::basic_string<wchar_t,std::char_traits<wchar_t>,std::" + "allocator<wchar_t> >"), + std_wstring_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::basic_string<wchar_t, std::char_traits<wchar_t>, " + "std::allocator<wchar_t> >"), + std_wstring_summary_sp); + + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__cxx11::wstring"), cxx11_wstring_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__cxx11::basic_string<wchar_t, " + "std::char_traits<wchar_t>, std::allocator<wchar_t> >"), + cxx11_wstring_summary_sp); #ifndef LLDB_DISABLE_PYTHON - - SyntheticChildren::Flags stl_synth_flags; - stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false); - - cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")), - SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, - "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider"))); - cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")), - SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, - "lldb.formatters.cpp.gnu_libstdcpp.StdMapSynthProvider"))); - cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$")), - SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, - "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider"))); - stl_summary_flags.SetDontShowChildren(false);stl_summary_flags.SetSkipPointers(true); - cpp_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")), - TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, - "size=${svar%#}"))); - cpp_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")), - TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, - "size=${svar%#}"))); - cpp_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$")), - TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, - "size=${svar%#}"))); - - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator, "std::vector iterator synthetic children", ConstString("^__gnu_cxx::__normal_iterator<.+>$"), stl_synth_flags, true); - - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator, "std::map iterator synthetic children", ConstString("^std::_Rb_tree_iterator<.+>$"), stl_synth_flags, true); - - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator, - "std::shared_ptr synthetic children", ConstString("^std::shared_ptr<.+>(( )?&)?$"), stl_synth_flags, - true); - AddCXXSynthetic(cpp_category_sp, lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator, - "std::weak_ptr synthetic children", ConstString("^std::weak_ptr<.+>(( )?&)?$"), stl_synth_flags, - true); - - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibStdcppSmartPointerSummaryProvider, - "libstdc++ std::shared_ptr summary provider", ConstString("^std::shared_ptr<.+>(( )?&)?$"), - stl_summary_flags, true); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibStdcppSmartPointerSummaryProvider, - "libstdc++ std::weak_ptr summary provider", ConstString("^std::weak_ptr<.+>(( )?&)?$"), - stl_summary_flags, true); + + SyntheticChildren::Flags stl_synth_flags; + stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences( + false); + + cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add( + RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")), + SyntheticChildrenSP(new ScriptedSyntheticChildren( + stl_synth_flags, + "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider"))); + cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add( + RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")), + SyntheticChildrenSP(new ScriptedSyntheticChildren( + stl_synth_flags, + "lldb.formatters.cpp.gnu_libstdcpp.StdMapSynthProvider"))); + cpp_category_sp->GetRegexTypeSyntheticsContainer()->Add( + RegularExpressionSP( + new RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$")), + SyntheticChildrenSP(new ScriptedSyntheticChildren( + stl_synth_flags, + "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider"))); + stl_summary_flags.SetDontShowChildren(false); + stl_summary_flags.SetSkipPointers(true); + cpp_category_sp->GetRegexTypeSummariesContainer()->Add( + RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")), + TypeSummaryImplSP( + new StringSummaryFormat(stl_summary_flags, "size=${svar%#}"))); + cpp_category_sp->GetRegexTypeSummariesContainer()->Add( + RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")), + TypeSummaryImplSP( + new StringSummaryFormat(stl_summary_flags, "size=${svar%#}"))); + cpp_category_sp->GetRegexTypeSummariesContainer()->Add( + RegularExpressionSP( + new RegularExpression("^std::(__cxx11::)?list<.+>(( )?&)?$")), + TypeSummaryImplSP( + new StringSummaryFormat(stl_summary_flags, "size=${svar%#}"))); + + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator, + "std::vector iterator synthetic children", + ConstString("^__gnu_cxx::__normal_iterator<.+>$"), stl_synth_flags, true); + + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator, + "std::map iterator synthetic children", + ConstString("^std::_Rb_tree_iterator<.+>$"), stl_synth_flags, true); + + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator, + "std::shared_ptr synthetic children", + ConstString("^std::shared_ptr<.+>(( )?&)?$"), stl_synth_flags, true); + AddCXXSynthetic( + cpp_category_sp, + lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator, + "std::weak_ptr synthetic children", + ConstString("^std::weak_ptr<.+>(( )?&)?$"), stl_synth_flags, true); + + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibStdcppSmartPointerSummaryProvider, + "libstdc++ std::shared_ptr summary provider", + ConstString("^std::shared_ptr<.+>(( )?&)?$"), stl_summary_flags, + true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibStdcppSmartPointerSummaryProvider, + "libstdc++ std::weak_ptr summary provider", + ConstString("^std::weak_ptr<.+>(( )?&)?$"), stl_summary_flags, + true); #endif } -static void -LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp) -{ - if (!cpp_category_sp) - return; - - TypeSummaryImpl::Flags string_flags; - string_flags.SetCascades(true) - .SetSkipPointers(true) - .SetSkipReferences(false) - .SetDontShowChildren(true) - .SetDontShowValue(false) - .SetShowMembersOneLiner(false) - .SetHideItemNames(false); - - TypeSummaryImpl::Flags string_array_flags; - string_array_flags.SetCascades(true) - .SetSkipPointers(true) - .SetSkipReferences(false) - .SetDontShowChildren(true) - .SetDontShowValue(true) - .SetShowMembersOneLiner(false) - .SetHideItemNames(false); - +static void LoadSystemFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { + if (!cpp_category_sp) + return; + + TypeSummaryImpl::Flags string_flags; + string_flags.SetCascades(true) + .SetSkipPointers(true) + .SetSkipReferences(false) + .SetDontShowChildren(true) + .SetDontShowValue(false) + .SetShowMembersOneLiner(false) + .SetHideItemNames(false); + + TypeSummaryImpl::Flags string_array_flags; + string_array_flags.SetCascades(true) + .SetSkipPointers(true) + .SetSkipReferences(false) + .SetDontShowChildren(true) + .SetDontShowValue(true) + .SetShowMembersOneLiner(false) + .SetHideItemNames(false); + #ifndef LLDB_DISABLE_PYTHON - // FIXME because of a bug in the FormattersContainer we need to add a summary for both X* and const X* (<rdar://problem/12717717>) - AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "char16_t * summary provider", ConstString("char16_t *"), string_flags); - AddCXXSummary(cpp_category_sp, - lldb_private::formatters::Char16StringSummaryProvider, - "char16_t [] summary provider", - ConstString("char16_t \\[[0-9]+\\]"), - string_array_flags, - true); - - AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char32StringSummaryProvider, "char32_t * summary provider", ConstString("char32_t *"), string_flags); - AddCXXSummary(cpp_category_sp, - lldb_private::formatters::Char32StringSummaryProvider, - "char32_t [] summary provider", - ConstString("char32_t \\[[0-9]+\\]"), - string_array_flags, - true); - - AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("wchar_t *"), string_flags); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("wchar_t \\[[0-9]+\\]"), string_array_flags, true); - - AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "unichar * summary provider", ConstString("unichar *"), string_flags); - - TypeSummaryImpl::Flags widechar_flags; - widechar_flags.SetDontShowValue(true) - .SetSkipPointers(true) - .SetSkipReferences(false) - .SetCascades(true) - .SetDontShowChildren(true) - .SetHideItemNames(true) - .SetShowMembersOneLiner(false); - - AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char16SummaryProvider, "char16_t summary provider", ConstString("char16_t"), widechar_flags); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char32SummaryProvider, "char32_t summary provider", ConstString("char32_t"), widechar_flags); - AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharSummaryProvider, "wchar_t summary provider", ConstString("wchar_t"), widechar_flags); - - AddCXXSummary(cpp_category_sp, lldb_private::formatters::Char16SummaryProvider, "unichar summary provider", ConstString("unichar"), widechar_flags); + // FIXME because of a bug in the FormattersContainer we need to add a summary + // for both X* and const X* (<rdar://problem/12717717>) + AddCXXSummary( + cpp_category_sp, lldb_private::formatters::Char16StringSummaryProvider, + "char16_t * summary provider", ConstString("char16_t *"), string_flags); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::Char16StringSummaryProvider, + "char16_t [] summary provider", + ConstString("char16_t \\[[0-9]+\\]"), string_array_flags, true); + + AddCXXSummary( + cpp_category_sp, lldb_private::formatters::Char32StringSummaryProvider, + "char32_t * summary provider", ConstString("char32_t *"), string_flags); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::Char32StringSummaryProvider, + "char32_t [] summary provider", + ConstString("char32_t \\[[0-9]+\\]"), string_array_flags, true); + + AddCXXSummary( + cpp_category_sp, lldb_private::formatters::WCharStringSummaryProvider, + "wchar_t * summary provider", ConstString("wchar_t *"), string_flags); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::WCharStringSummaryProvider, + "wchar_t * summary provider", + ConstString("wchar_t \\[[0-9]+\\]"), string_array_flags, true); + + AddCXXSummary( + cpp_category_sp, lldb_private::formatters::Char16StringSummaryProvider, + "unichar * summary provider", ConstString("unichar *"), string_flags); + + TypeSummaryImpl::Flags widechar_flags; + widechar_flags.SetDontShowValue(true) + .SetSkipPointers(true) + .SetSkipReferences(false) + .SetCascades(true) + .SetDontShowChildren(true) + .SetHideItemNames(true) + .SetShowMembersOneLiner(false); + + AddCXXSummary( + cpp_category_sp, lldb_private::formatters::Char16SummaryProvider, + "char16_t summary provider", ConstString("char16_t"), widechar_flags); + AddCXXSummary( + cpp_category_sp, lldb_private::formatters::Char32SummaryProvider, + "char32_t summary provider", ConstString("char32_t"), widechar_flags); + AddCXXSummary(cpp_category_sp, lldb_private::formatters::WCharSummaryProvider, + "wchar_t summary provider", ConstString("wchar_t"), + widechar_flags); + + AddCXXSummary( + cpp_category_sp, lldb_private::formatters::Char16SummaryProvider, + "unichar summary provider", ConstString("unichar"), widechar_flags); #endif } -lldb::TypeCategoryImplSP -CPlusPlusLanguage::GetFormatters () -{ - static std::once_flag g_initialize; - static TypeCategoryImplSP g_category; - - std::call_once(g_initialize, [this] () -> void { - DataVisualization::Categories::GetCategory(GetPluginName(), g_category); - if (g_category) - { - LoadLibCxxFormatters(g_category); - LoadLibStdcppFormatters(g_category); - LoadSystemFormatters(g_category); - } - }); - return g_category; +lldb::TypeCategoryImplSP CPlusPlusLanguage::GetFormatters() { + static std::once_flag g_initialize; + static TypeCategoryImplSP g_category; + + std::call_once(g_initialize, [this]() -> void { + DataVisualization::Categories::GetCategory(GetPluginName(), g_category); + if (g_category) { + LoadLibCxxFormatters(g_category); + LoadLibStdcppFormatters(g_category); + LoadSystemFormatters(g_category); + } + }); + return g_category; } HardcodedFormatters::HardcodedSummaryFinder -CPlusPlusLanguage::GetHardcodedSummaries () -{ - static std::once_flag g_initialize; - static ConstString g_vectortypes("VectorTypes"); - static HardcodedFormatters::HardcodedSummaryFinder g_formatters; - - std::call_once(g_initialize, [] () -> void { - g_formatters.push_back( - [](lldb_private::ValueObject& valobj, - lldb::DynamicValueType, - FormatManager&) -> TypeSummaryImpl::SharedPointer { - static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags(), lldb_private::formatters::CXXFunctionPointerSummaryProvider, "Function pointer summary provider")); - if (valobj.GetCompilerType().IsFunctionPointerType()) - { - return formatter_sp; - } - return nullptr; - }); - g_formatters.push_back( - [](lldb_private::ValueObject& valobj, - lldb::DynamicValueType, - FormatManager& fmt_mgr) -> TypeSummaryImpl::SharedPointer { - static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags() - .SetCascades(true) - .SetDontShowChildren(true) - .SetHideItemNames(true) - .SetShowMembersOneLiner(true) - .SetSkipPointers(true) - .SetSkipReferences(false), - lldb_private::formatters::VectorTypeSummaryProvider, - "vector_type pointer summary provider")); - if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr)) - { - if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled()) - return formatter_sp; - } - return nullptr; - }); - g_formatters.push_back( - [](lldb_private::ValueObject& valobj, - lldb::DynamicValueType, - FormatManager& fmt_mgr) -> TypeSummaryImpl::SharedPointer { - static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags() - .SetCascades(true) - .SetDontShowChildren(true) - .SetHideItemNames(true) - .SetShowMembersOneLiner(true) - .SetSkipPointers(true) - .SetSkipReferences(false), - lldb_private::formatters::BlockPointerSummaryProvider, - "block pointer summary provider")); - if (valobj.GetCompilerType().IsBlockPointerType(nullptr)) - { - return formatter_sp; - } - return nullptr; - }); - }); - - return g_formatters; +CPlusPlusLanguage::GetHardcodedSummaries() { + static std::once_flag g_initialize; + static ConstString g_vectortypes("VectorTypes"); + static HardcodedFormatters::HardcodedSummaryFinder g_formatters; + + std::call_once(g_initialize, []() -> void { + g_formatters.push_back( + [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, + FormatManager &) -> TypeSummaryImpl::SharedPointer { + static CXXFunctionSummaryFormat::SharedPointer formatter_sp( + new CXXFunctionSummaryFormat( + TypeSummaryImpl::Flags(), + lldb_private::formatters::CXXFunctionPointerSummaryProvider, + "Function pointer summary provider")); + if (valobj.GetCompilerType().IsFunctionPointerType()) { + return formatter_sp; + } + return nullptr; + }); + g_formatters.push_back( + [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, + FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer { + static CXXFunctionSummaryFormat::SharedPointer formatter_sp( + new CXXFunctionSummaryFormat( + TypeSummaryImpl::Flags() + .SetCascades(true) + .SetDontShowChildren(true) + .SetHideItemNames(true) + .SetShowMembersOneLiner(true) + .SetSkipPointers(true) + .SetSkipReferences(false), + lldb_private::formatters::VectorTypeSummaryProvider, + "vector_type pointer summary provider")); + if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr)) { + if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled()) + return formatter_sp; + } + return nullptr; + }); + g_formatters.push_back( + [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, + FormatManager &fmt_mgr) -> TypeSummaryImpl::SharedPointer { + static CXXFunctionSummaryFormat::SharedPointer formatter_sp( + new CXXFunctionSummaryFormat( + TypeSummaryImpl::Flags() + .SetCascades(true) + .SetDontShowChildren(true) + .SetHideItemNames(true) + .SetShowMembersOneLiner(true) + .SetSkipPointers(true) + .SetSkipReferences(false), + lldb_private::formatters::BlockPointerSummaryProvider, + "block pointer summary provider")); + if (valobj.GetCompilerType().IsBlockPointerType(nullptr)) { + return formatter_sp; + } + return nullptr; + }); + }); + + return g_formatters; } HardcodedFormatters::HardcodedSyntheticFinder -CPlusPlusLanguage::GetHardcodedSynthetics () -{ - static std::once_flag g_initialize; - static ConstString g_vectortypes("VectorTypes"); - static HardcodedFormatters::HardcodedSyntheticFinder g_formatters; - - std::call_once(g_initialize, [] () -> void { - g_formatters.push_back( - [](lldb_private::ValueObject& valobj, - lldb::DynamicValueType, - FormatManager& fmt_mgr) -> SyntheticChildren::SharedPointer { - static CXXSyntheticChildren::SharedPointer formatter_sp(new CXXSyntheticChildren(SyntheticChildren::Flags().SetCascades(true).SetSkipPointers(true).SetSkipReferences(true).SetNonCacheable(true), - "vector_type synthetic children", - lldb_private::formatters::VectorTypeSyntheticFrontEndCreator)); - if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr)) - { - if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled()) - return formatter_sp; - } - return nullptr; - }); - g_formatters.push_back( - [](lldb_private::ValueObject& valobj, - lldb::DynamicValueType, - FormatManager& fmt_mgr) -> SyntheticChildren::SharedPointer { - static CXXSyntheticChildren::SharedPointer formatter_sp(new CXXSyntheticChildren(SyntheticChildren::Flags().SetCascades(true).SetSkipPointers(true).SetSkipReferences(true).SetNonCacheable(true), - "block pointer synthetic children", - lldb_private::formatters::BlockPointerSyntheticFrontEndCreator)); - if (valobj.GetCompilerType().IsBlockPointerType(nullptr)) - { - return formatter_sp; - } - return nullptr; - }); - +CPlusPlusLanguage::GetHardcodedSynthetics() { + static std::once_flag g_initialize; + static ConstString g_vectortypes("VectorTypes"); + static HardcodedFormatters::HardcodedSyntheticFinder g_formatters; + + std::call_once(g_initialize, []() -> void { + g_formatters.push_back([](lldb_private::ValueObject &valobj, + lldb::DynamicValueType, + FormatManager & + fmt_mgr) -> SyntheticChildren::SharedPointer { + static CXXSyntheticChildren::SharedPointer formatter_sp( + new CXXSyntheticChildren( + SyntheticChildren::Flags() + .SetCascades(true) + .SetSkipPointers(true) + .SetSkipReferences(true) + .SetNonCacheable(true), + "vector_type synthetic children", + lldb_private::formatters::VectorTypeSyntheticFrontEndCreator)); + if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr)) { + if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled()) + return formatter_sp; + } + return nullptr; }); - - return g_formatters; + g_formatters.push_back([](lldb_private::ValueObject &valobj, + lldb::DynamicValueType, + FormatManager & + fmt_mgr) -> SyntheticChildren::SharedPointer { + static CXXSyntheticChildren::SharedPointer formatter_sp( + new CXXSyntheticChildren( + SyntheticChildren::Flags() + .SetCascades(true) + .SetSkipPointers(true) + .SetSkipReferences(true) + .SetNonCacheable(true), + "block pointer synthetic children", + lldb_private::formatters::BlockPointerSyntheticFrontEndCreator)); + if (valobj.GetCompilerType().IsBlockPointerType(nullptr)) { + return formatter_sp; + } + return nullptr; + }); + + }); + + return g_formatters; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h index f0fc07e2006..68938b77efd 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h @@ -18,172 +18,136 @@ #include "llvm/ADT/StringRef.h" // Project includes -#include "lldb/lldb-private.h" #include "lldb/Core/ConstString.h" #include "lldb/Target/Language.h" +#include "lldb/lldb-private.h" namespace lldb_private { - -class CPlusPlusLanguage : - public Language -{ -public: - class MethodName - { - public: - enum Type - { - eTypeInvalid, - eTypeUnknownMethod, - eTypeClassMethod, - eTypeInstanceMethod - }; - - MethodName () : - m_full(), - m_basename(), - m_context(), - m_arguments(), - m_qualifiers(), - m_type (eTypeInvalid), - m_parsed (false), - m_parse_error (false) - { - } - - MethodName (const ConstString &s) : - m_full(s), - m_basename(), - m_context(), - m_arguments(), - m_qualifiers(), - m_type (eTypeInvalid), - m_parsed (false), - m_parse_error (false) - { - } - - void - Clear(); - - bool - IsValid () - { - if (!m_parsed) - Parse(); - if (m_parse_error) - return false; - if (m_type == eTypeInvalid) - return false; - return (bool)m_full; - } - - Type - GetType () const - { - return m_type; - } - - const ConstString & - GetFullName () const - { - return m_full; - } - - std::string - GetScopeQualifiedName (); - - llvm::StringRef - GetBasename (); - - llvm::StringRef - GetContext (); - - llvm::StringRef - GetArguments (); - - llvm::StringRef - GetQualifiers (); - - protected: - void - Parse(); - ConstString m_full; // Full name: "lldb::SBTarget::GetBreakpointAtIndex(unsigned int) const" - llvm::StringRef m_basename; // Basename: "GetBreakpointAtIndex" - llvm::StringRef m_context; // Decl context: "lldb::SBTarget" - llvm::StringRef m_arguments; // Arguments: "(unsigned int)" - llvm::StringRef m_qualifiers; // Qualifiers: "const" - Type m_type; - bool m_parsed; - bool m_parse_error; +class CPlusPlusLanguage : public Language { +public: + class MethodName { + public: + enum Type { + eTypeInvalid, + eTypeUnknownMethod, + eTypeClassMethod, + eTypeInstanceMethod }; - CPlusPlusLanguage() = default; + MethodName() + : m_full(), m_basename(), m_context(), m_arguments(), m_qualifiers(), + m_type(eTypeInvalid), m_parsed(false), m_parse_error(false) {} - ~CPlusPlusLanguage() override = default; + MethodName(const ConstString &s) + : m_full(s), m_basename(), m_context(), m_arguments(), m_qualifiers(), + m_type(eTypeInvalid), m_parsed(false), m_parse_error(false) {} - lldb::LanguageType - GetLanguageType () const override - { - return lldb::eLanguageTypeC_plus_plus; + void Clear(); + + bool IsValid() { + if (!m_parsed) + Parse(); + if (m_parse_error) + return false; + if (m_type == eTypeInvalid) + return false; + return (bool)m_full; } - - lldb::TypeCategoryImplSP - GetFormatters () override; - - HardcodedFormatters::HardcodedSummaryFinder - GetHardcodedSummaries () override; - - HardcodedFormatters::HardcodedSyntheticFinder - GetHardcodedSynthetics () override; - - //------------------------------------------------------------------ - // Static Functions - //------------------------------------------------------------------ - static void - Initialize(); - - static void - Terminate(); - - static lldb_private::Language * - CreateInstance (lldb::LanguageType language); - - static lldb_private::ConstString - GetPluginNameStatic(); - - static bool - IsCPPMangledName(const char *name); - - // Extract C++ context and identifier from a string using heuristic matching (as opposed to - // CPlusPlusLanguage::MethodName which has to have a fully qualified C++ name with parens and arguments. - // If the name is a lone C identifier (e.g. C) or a qualified C identifier (e.g. A::B::C) it will return true, - // and identifier will be the identifier (C and C respectively) and the context will be "" and "A::B::" respectively. - // If the name fails the heuristic matching for a qualified or unqualified C/C++ identifier, then it will return false - // and identifier and context will be unchanged. - - static bool - ExtractContextAndIdentifier (const char *name, llvm::StringRef &context, llvm::StringRef &identifier); - - // in some cases, compilers will output different names for one same type. when that happens, it might be impossible - // to construct SBType objects for a valid type, because the name that is available is not the same as the name that - // can be used as a search key in FindTypes(). the equivalents map here is meant to return possible alternative names - // for a type through which a search can be conducted. Currently, this is only enabled for C++ but can be extended - // to ObjC or other languages if necessary - static uint32_t - FindEquivalentNames(ConstString type_name, std::vector<ConstString>& equivalents); - - //------------------------------------------------------------------ - // PluginInterface protocol - //------------------------------------------------------------------ - ConstString - GetPluginName() override; - - uint32_t - GetPluginVersion() override; + + Type GetType() const { return m_type; } + + const ConstString &GetFullName() const { return m_full; } + + std::string GetScopeQualifiedName(); + + llvm::StringRef GetBasename(); + + llvm::StringRef GetContext(); + + llvm::StringRef GetArguments(); + + llvm::StringRef GetQualifiers(); + + protected: + void Parse(); + + ConstString m_full; // Full name: + // "lldb::SBTarget::GetBreakpointAtIndex(unsigned int) + // const" + llvm::StringRef m_basename; // Basename: "GetBreakpointAtIndex" + llvm::StringRef m_context; // Decl context: "lldb::SBTarget" + llvm::StringRef m_arguments; // Arguments: "(unsigned int)" + llvm::StringRef m_qualifiers; // Qualifiers: "const" + Type m_type; + bool m_parsed; + bool m_parse_error; + }; + + CPlusPlusLanguage() = default; + + ~CPlusPlusLanguage() override = default; + + lldb::LanguageType GetLanguageType() const override { + return lldb::eLanguageTypeC_plus_plus; + } + + lldb::TypeCategoryImplSP GetFormatters() override; + + HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override; + + HardcodedFormatters::HardcodedSyntheticFinder + GetHardcodedSynthetics() override; + + //------------------------------------------------------------------ + // Static Functions + //------------------------------------------------------------------ + static void Initialize(); + + static void Terminate(); + + static lldb_private::Language *CreateInstance(lldb::LanguageType language); + + static lldb_private::ConstString GetPluginNameStatic(); + + static bool IsCPPMangledName(const char *name); + + // Extract C++ context and identifier from a string using heuristic matching + // (as opposed to + // CPlusPlusLanguage::MethodName which has to have a fully qualified C++ name + // with parens and arguments. + // If the name is a lone C identifier (e.g. C) or a qualified C identifier + // (e.g. A::B::C) it will return true, + // and identifier will be the identifier (C and C respectively) and the + // context will be "" and "A::B::" respectively. + // If the name fails the heuristic matching for a qualified or unqualified + // C/C++ identifier, then it will return false + // and identifier and context will be unchanged. + + static bool ExtractContextAndIdentifier(const char *name, + llvm::StringRef &context, + llvm::StringRef &identifier); + + // in some cases, compilers will output different names for one same type. + // when that happens, it might be impossible + // to construct SBType objects for a valid type, because the name that is + // available is not the same as the name that + // can be used as a search key in FindTypes(). the equivalents map here is + // meant to return possible alternative names + // for a type through which a search can be conducted. Currently, this is only + // enabled for C++ but can be extended + // to ObjC or other languages if necessary + static uint32_t FindEquivalentNames(ConstString type_name, + std::vector<ConstString> &equivalents); + + //------------------------------------------------------------------ + // PluginInterface protocol + //------------------------------------------------------------------ + ConstString GetPluginName() override; + + uint32_t GetPluginVersion() override; }; - + } // namespace lldb_private #endif // liblldb_CPlusPlusLanguage_h_ diff --git a/lldb/source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp b/lldb/source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp index a2c45fb9989..92b9427f1f5 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CxxStringTypes.cpp @@ -16,6 +16,7 @@ #include "lldb/Core/Stream.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/DataFormatters/StringPrinter.h" #include "lldb/DataFormatters/TypeSummary.h" #include "lldb/Host/Endian.h" @@ -24,7 +25,6 @@ #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" #include "lldb/Utility/ProcessStructReader.h" -#include "lldb/DataFormatters/FormattersHelpers.h" #include <algorithm> @@ -38,187 +38,191 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -bool -lldb_private::formatters::Char16StringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - lldb::addr_t valobj_addr = GetArrayAddressOrPointerValue(valobj); - if (valobj_addr == 0 || valobj_addr == LLDB_INVALID_ADDRESS) - return false; - - StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(valobj_addr); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetPrefixToken("u"); - - if (!StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF16>(options)) - { - stream.Printf("Summary Unavailable"); - return true; - } - +bool lldb_private::formatters::Char16StringSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + lldb::addr_t valobj_addr = GetArrayAddressOrPointerValue(valobj); + if (valobj_addr == 0 || valobj_addr == LLDB_INVALID_ADDRESS) + return false; + + StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); + options.SetLocation(valobj_addr); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetPrefixToken("u"); + + if (!StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF16>(options)) { + stream.Printf("Summary Unavailable"); return true; + } + + return true; } -bool -lldb_private::formatters::Char32StringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - lldb::addr_t valobj_addr = GetArrayAddressOrPointerValue(valobj); - if (valobj_addr == 0 || valobj_addr == LLDB_INVALID_ADDRESS) - return false; - - StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(valobj_addr); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetPrefixToken("U"); - - if (!StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF32>(options)) - { - stream.Printf("Summary Unavailable"); - return true; - } - +bool lldb_private::formatters::Char32StringSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + lldb::addr_t valobj_addr = GetArrayAddressOrPointerValue(valobj); + if (valobj_addr == 0 || valobj_addr == LLDB_INVALID_ADDRESS) + return false; + + StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); + options.SetLocation(valobj_addr); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetPrefixToken("U"); + + if (!StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF32>(options)) { + stream.Printf("Summary Unavailable"); return true; + } + + return true; } -bool -lldb_private::formatters::WCharStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - lldb::addr_t valobj_addr = GetArrayAddressOrPointerValue(valobj); - if (valobj_addr == 0 || valobj_addr == LLDB_INVALID_ADDRESS) - return false; - - // Get a wchar_t basic type from the current type system - CompilerType wchar_compiler_type = valobj.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeWChar); - - if (!wchar_compiler_type) - return false; - - const uint32_t wchar_size = wchar_compiler_type.GetBitSize(nullptr); // Safe to pass NULL for exe_scope here - - StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(valobj_addr); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetPrefixToken("L"); - - switch (wchar_size) - { - case 8: - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF8>(options); - case 16: - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF16>(options); - case 32: - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF32>(options); - default: - stream.Printf("size for wchar_t is not valid"); - return true; - } +bool lldb_private::formatters::WCharStringSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + lldb::addr_t valobj_addr = GetArrayAddressOrPointerValue(valobj); + if (valobj_addr == 0 || valobj_addr == LLDB_INVALID_ADDRESS) + return false; + + // Get a wchar_t basic type from the current type system + CompilerType wchar_compiler_type = + valobj.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeWChar); + + if (!wchar_compiler_type) + return false; + + const uint32_t wchar_size = wchar_compiler_type.GetBitSize( + nullptr); // Safe to pass NULL for exe_scope here + + StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); + options.SetLocation(valobj_addr); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetPrefixToken("L"); + + switch (wchar_size) { + case 8: + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF8>(options); + case 16: + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF16>(options); + case 32: + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF32>(options); + default: + stream.Printf("size for wchar_t is not valid"); return true; + } + return true; } -bool -lldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - DataExtractor data; - Error error; - valobj.GetData(data, error); - - if (error.Fail()) - return false; - - std::string value; - valobj.GetValueAsCString(lldb::eFormatUnicode16, value); - if (!value.empty()) - stream.Printf("%s ", value.c_str()); - - StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); - options.SetData(data); - options.SetStream(&stream); - options.SetPrefixToken("u"); - options.SetQuote('\''); - options.SetSourceSize(1); - options.SetBinaryZeroIsTerminator(false); - - return StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF16>(options); +bool lldb_private::formatters::Char16SummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &) { + DataExtractor data; + Error error; + valobj.GetData(data, error); + + if (error.Fail()) + return false; + + std::string value; + valobj.GetValueAsCString(lldb::eFormatUnicode16, value); + if (!value.empty()) + stream.Printf("%s ", value.c_str()); + + StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); + options.SetData(data); + options.SetStream(&stream); + options.SetPrefixToken("u"); + options.SetQuote('\''); + options.SetSourceSize(1); + options.SetBinaryZeroIsTerminator(false); + + return StringPrinter::ReadBufferAndDumpToStream< + StringPrinter::StringElementType::UTF16>(options); } -bool -lldb_private::formatters::Char32SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - DataExtractor data; - Error error; - valobj.GetData(data, error); - - if (error.Fail()) - return false; - - std::string value; - valobj.GetValueAsCString(lldb::eFormatUnicode32, value); - if (!value.empty()) - stream.Printf("%s ", value.c_str()); - - StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); - options.SetData(data); - options.SetStream(&stream); - options.SetPrefixToken("U"); - options.SetQuote('\''); - options.SetSourceSize(1); - options.SetBinaryZeroIsTerminator(false); - - return StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF32>(options); +bool lldb_private::formatters::Char32SummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &) { + DataExtractor data; + Error error; + valobj.GetData(data, error); + + if (error.Fail()) + return false; + + std::string value; + valobj.GetValueAsCString(lldb::eFormatUnicode32, value); + if (!value.empty()) + stream.Printf("%s ", value.c_str()); + + StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); + options.SetData(data); + options.SetStream(&stream); + options.SetPrefixToken("U"); + options.SetQuote('\''); + options.SetSourceSize(1); + options.SetBinaryZeroIsTerminator(false); + + return StringPrinter::ReadBufferAndDumpToStream< + StringPrinter::StringElementType::UTF32>(options); } -bool -lldb_private::formatters::WCharSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions&) -{ - DataExtractor data; - Error error; - valobj.GetData(data, error); - - if (error.Fail()) - return false; - - // Get a wchar_t basic type from the current type system - CompilerType wchar_compiler_type = valobj.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeWChar); - - if (!wchar_compiler_type) - return false; - - const uint32_t wchar_size = wchar_compiler_type.GetBitSize(nullptr); // Safe to pass NULL for exe_scope here - - StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); - options.SetData(data); - options.SetStream(&stream); - options.SetPrefixToken("L"); - options.SetQuote('\''); - options.SetSourceSize(1); - options.SetBinaryZeroIsTerminator(false); - - switch (wchar_size) - { - case 8: - return StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF8>(options); - case 16: - return StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF16>(options); - case 32: - return StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::UTF32>(options); - default: - stream.Printf("size for wchar_t is not valid"); - return true; - } +bool lldb_private::formatters::WCharSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &) { + DataExtractor data; + Error error; + valobj.GetData(data, error); + + if (error.Fail()) + return false; + + // Get a wchar_t basic type from the current type system + CompilerType wchar_compiler_type = + valobj.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeWChar); + + if (!wchar_compiler_type) + return false; + + const uint32_t wchar_size = wchar_compiler_type.GetBitSize( + nullptr); // Safe to pass NULL for exe_scope here + + StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); + options.SetData(data); + options.SetStream(&stream); + options.SetPrefixToken("L"); + options.SetQuote('\''); + options.SetSourceSize(1); + options.SetBinaryZeroIsTerminator(false); + + switch (wchar_size) { + case 8: + return StringPrinter::ReadBufferAndDumpToStream< + StringPrinter::StringElementType::UTF8>(options); + case 16: + return StringPrinter::ReadBufferAndDumpToStream< + StringPrinter::StringElementType::UTF16>(options); + case 32: + return StringPrinter::ReadBufferAndDumpToStream< + StringPrinter::StringElementType::UTF32>(options); + default: + stream.Printf("size for wchar_t is not valid"); return true; + } + return true; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/CxxStringTypes.h b/lldb/source/Plugins/Language/CPlusPlus/CxxStringTypes.h index bfb03bda7ee..0bee3bd3b0f 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CxxStringTypes.h +++ b/lldb/source/Plugins/Language/CPlusPlus/CxxStringTypes.h @@ -1,4 +1,5 @@ -//===-- CxxStringTypes.h ----------------------------------------------*- C++ -*-===// +//===-- CxxStringTypes.h ----------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -15,27 +16,29 @@ #include "lldb/DataFormatters/TypeSummary.h" namespace lldb_private { - namespace formatters - { - bool - Char16StringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // char16_t* and unichar* - - bool - Char32StringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // char32_t* - - bool - WCharStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // wchar_t* - - bool - Char16SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // char16_t and unichar - - bool - Char32SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // char32_t - - bool - WCharSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // wchar_t - - } // namespace formatters +namespace formatters { +bool Char16StringSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // char16_t* and unichar* + +bool Char32StringSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // char32_t* + +bool WCharStringSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // wchar_t* + +bool Char16SummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // char16_t and unichar + +bool Char32SummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // char32_t + +bool WCharSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // wchar_t + +} // namespace formatters } // namespace lldb_private #endif // liblldb_CxxStringTypes_h_ diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp index 1567fffd0b1..74f4c5c3ac4 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp @@ -32,197 +32,204 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -bool -lldb_private::formatters::LibcxxSmartPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue()); - if (!valobj_sp) - return false; - ValueObjectSP ptr_sp(valobj_sp->GetChildMemberWithName(ConstString("__ptr_"), true)); - ValueObjectSP count_sp(valobj_sp->GetChildAtNamePath( {ConstString("__cntrl_"),ConstString("__shared_owners_")} )); - ValueObjectSP weakcount_sp(valobj_sp->GetChildAtNamePath( {ConstString("__cntrl_"),ConstString("__shared_weak_owners_")} )); - - if (!ptr_sp) - return false; - - if (ptr_sp->GetValueAsUnsigned(0) == 0) - { - stream.Printf("nullptr"); - return true; - } - else - { - bool print_pointee = false; - Error error; - ValueObjectSP pointee_sp = ptr_sp->Dereference(error); - if (pointee_sp && error.Success()) - { - if (pointee_sp->DumpPrintableRepresentation(stream, - ValueObject::eValueObjectRepresentationStyleSummary, - lldb::eFormatInvalid, - ValueObject::ePrintableRepresentationSpecialCasesDisable, - false)) - print_pointee = true; - } - if (!print_pointee) - stream.Printf("ptr = 0x%" PRIx64, ptr_sp->GetValueAsUnsigned(0)); - } - - if (count_sp) - stream.Printf(" strong=%" PRIu64, 1+count_sp->GetValueAsUnsigned(0)); +bool lldb_private::formatters::LibcxxSmartPointerSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue()); + if (!valobj_sp) + return false; + ValueObjectSP ptr_sp( + valobj_sp->GetChildMemberWithName(ConstString("__ptr_"), true)); + ValueObjectSP count_sp(valobj_sp->GetChildAtNamePath( + {ConstString("__cntrl_"), ConstString("__shared_owners_")})); + ValueObjectSP weakcount_sp(valobj_sp->GetChildAtNamePath( + {ConstString("__cntrl_"), ConstString("__shared_weak_owners_")})); + + if (!ptr_sp) + return false; - if (weakcount_sp) - stream.Printf(" weak=%" PRIu64, 1+weakcount_sp->GetValueAsUnsigned(0)); - + if (ptr_sp->GetValueAsUnsigned(0) == 0) { + stream.Printf("nullptr"); return true; + } else { + bool print_pointee = false; + Error error; + ValueObjectSP pointee_sp = ptr_sp->Dereference(error); + if (pointee_sp && error.Success()) { + if (pointee_sp->DumpPrintableRepresentation( + stream, ValueObject::eValueObjectRepresentationStyleSummary, + lldb::eFormatInvalid, + ValueObject::ePrintableRepresentationSpecialCasesDisable, false)) + print_pointee = true; + } + if (!print_pointee) + stream.Printf("ptr = 0x%" PRIx64, ptr_sp->GetValueAsUnsigned(0)); + } + + if (count_sp) + stream.Printf(" strong=%" PRIu64, 1 + count_sp->GetValueAsUnsigned(0)); + + if (weakcount_sp) + stream.Printf(" weak=%" PRIu64, 1 + weakcount_sp->GetValueAsUnsigned(0)); + + return true; } -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_bool_type(), - m_exe_ctx_ref(), - m_count(0), - m_base_data_address(0), - m_children() -{ - if (valobj_sp) - { - Update(); - m_bool_type = valobj_sp->GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeBool); - } +lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd:: + LibcxxVectorBoolSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_bool_type(), m_exe_ctx_ref(), + m_count(0), m_base_data_address(0), m_children() { + if (valobj_sp) { + Update(); + m_bool_type = + valobj_sp->GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeBool); + } } -size_t -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::CalculateNumChildren () -{ - return m_count; +size_t lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd:: + CalculateNumChildren() { + return m_count; } lldb::ValueObjectSP -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - auto iter = m_children.find(idx), - end = m_children.end(); - if (iter != end) - return iter->second; - if (idx >= m_count) - return ValueObjectSP(); - if (m_base_data_address == 0 || m_count == 0) - return ValueObjectSP(); - if (!m_bool_type) - return ValueObjectSP(); - size_t byte_idx = (idx >> 3); // divide by 8 to get byte index - size_t bit_index = (idx & 7); // efficient idx % 8 for bit index - lldb::addr_t byte_location = m_base_data_address + byte_idx; - ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP()); - if (!process_sp) - return ValueObjectSP(); - uint8_t byte = 0; - uint8_t mask = 0; - Error err; - size_t bytes_read = process_sp->ReadMemory(byte_location, &byte, 1, err); - if (err.Fail() || bytes_read == 0) - return ValueObjectSP(); - switch (bit_index) - { - case 0: - mask = 1; break; - case 1: - mask = 2; break; - case 2: - mask = 4; break; - case 3: - mask = 8; break; - case 4: - mask = 16; break; - case 5: - mask = 32; break; - case 6: - mask = 64; break; - case 7: - mask = 128; break; - default: - return ValueObjectSP(); - } - bool bit_set = ((byte & mask) != 0); - DataBufferSP buffer_sp(new DataBufferHeap(m_bool_type.GetByteSize(nullptr), 0)); - if (bit_set && buffer_sp && buffer_sp->GetBytes()) - *(buffer_sp->GetBytes()) = 1; // regardless of endianness, anything non-zero is true - StreamString name; name.Printf("[%" PRIu64 "]", (uint64_t)idx); - ValueObjectSP retval_sp(CreateValueObjectFromData(name.GetData(), DataExtractor(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize()), m_exe_ctx_ref, m_bool_type)); - if (retval_sp) - m_children[idx] = retval_sp; - return retval_sp; +lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + auto iter = m_children.find(idx), end = m_children.end(); + if (iter != end) + return iter->second; + if (idx >= m_count) + return ValueObjectSP(); + if (m_base_data_address == 0 || m_count == 0) + return ValueObjectSP(); + if (!m_bool_type) + return ValueObjectSP(); + size_t byte_idx = (idx >> 3); // divide by 8 to get byte index + size_t bit_index = (idx & 7); // efficient idx % 8 for bit index + lldb::addr_t byte_location = m_base_data_address + byte_idx; + ProcessSP process_sp(m_exe_ctx_ref.GetProcessSP()); + if (!process_sp) + return ValueObjectSP(); + uint8_t byte = 0; + uint8_t mask = 0; + Error err; + size_t bytes_read = process_sp->ReadMemory(byte_location, &byte, 1, err); + if (err.Fail() || bytes_read == 0) + return ValueObjectSP(); + switch (bit_index) { + case 0: + mask = 1; + break; + case 1: + mask = 2; + break; + case 2: + mask = 4; + break; + case 3: + mask = 8; + break; + case 4: + mask = 16; + break; + case 5: + mask = 32; + break; + case 6: + mask = 64; + break; + case 7: + mask = 128; + break; + default: + return ValueObjectSP(); + } + bool bit_set = ((byte & mask) != 0); + DataBufferSP buffer_sp( + new DataBufferHeap(m_bool_type.GetByteSize(nullptr), 0)); + if (bit_set && buffer_sp && buffer_sp->GetBytes()) + *(buffer_sp->GetBytes()) = + 1; // regardless of endianness, anything non-zero is true + StreamString name; + name.Printf("[%" PRIu64 "]", (uint64_t)idx); + ValueObjectSP retval_sp(CreateValueObjectFromData( + name.GetData(), DataExtractor(buffer_sp, process_sp->GetByteOrder(), + process_sp->GetAddressByteSize()), + m_exe_ctx_ref, m_bool_type)); + if (retval_sp) + m_children[idx] = retval_sp; + return retval_sp; } /*(std::__1::vector<std::__1::allocator<bool> >) vBool = { __begin_ = 0x00000001001000e0 __size_ = 56 __cap_alloc_ = { - std::__1::__libcpp_compressed_pair_imp<unsigned long, std::__1::allocator<unsigned long> > = { + std::__1::__libcpp_compressed_pair_imp<unsigned long, + std::__1::allocator<unsigned long> > = { __first_ = 1 } } }*/ -bool -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::Update() -{ - m_children.clear(); - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - ValueObjectSP size_sp(valobj_sp->GetChildMemberWithName(ConstString("__size_"), true)); - if (!size_sp) - return false; - m_count = size_sp->GetValueAsUnsigned(0); - if (!m_count) - return true; - ValueObjectSP begin_sp(valobj_sp->GetChildMemberWithName(ConstString("__begin_"), true)); - if (!begin_sp) - { - m_count = 0; - return false; - } - m_base_data_address = begin_sp->GetValueAsUnsigned(0); - if (!m_base_data_address) - { - m_count = 0; - return false; - } +bool lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::Update() { + m_children.clear(); + ValueObjectSP valobj_sp = m_backend.GetSP(); + if (!valobj_sp) return false; + m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + ValueObjectSP size_sp( + valobj_sp->GetChildMemberWithName(ConstString("__size_"), true)); + if (!size_sp) + return false; + m_count = size_sp->GetValueAsUnsigned(0); + if (!m_count) + return true; + ValueObjectSP begin_sp( + valobj_sp->GetChildMemberWithName(ConstString("__begin_"), true)); + if (!begin_sp) { + m_count = 0; + return false; + } + m_base_data_address = begin_sp->GetValueAsUnsigned(0); + if (!m_base_data_address) { + m_count = 0; + return false; + } + return false; } -bool -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd:: + MightHaveChildren() { + return true; } -size_t -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (!m_count || !m_base_data_address) - return UINT32_MAX; - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; +size_t lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + if (!m_count || !m_base_data_address) + return UINT32_MAX; + const char *item_name = name.GetCString(); + uint32_t idx = ExtractIndexFromString(item_name); + if (idx < UINT32_MAX && idx >= CalculateNumChildren()) + return UINT32_MAX; + return idx; } -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd::~LibcxxVectorBoolSyntheticFrontEnd() = default; +lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEnd:: + ~LibcxxVectorBoolSyntheticFrontEnd() = default; -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return (valobj_sp ? new LibcxxVectorBoolSyntheticFrontEnd(valobj_sp) : nullptr); +SyntheticChildrenFrontEnd * +lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return (valobj_sp ? new LibcxxVectorBoolSyntheticFrontEnd(valobj_sp) + : nullptr); } /* (lldb) fr var ibeg --raw --ptr-depth 1 - (std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::pair<int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::__tree_node<std::__1::pair<int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, void *> *, long> >) ibeg = { + (std::__1::__map_iterator<std::__1::__tree_iterator<std::__1::pair<int, + std::__1::basic_string<char, std::__1::char_traits<char>, + std::__1::allocator<char> > >, std::__1::__tree_node<std::__1::pair<int, + std::__1::basic_string<char, std::__1::char_traits<char>, + std::__1::allocator<char> > >, void *> *, long> >) ibeg = { __i_ = { __ptr_ = 0x0000000100103870 { std::__1::__tree_node_base<void *> = { @@ -238,82 +245,84 @@ lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator (CXXSynthetic second = { std::string } */ -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::LibCxxMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_pair_ptr() -{ - if (valobj_sp) - Update(); +lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd:: + LibCxxMapIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_pair_ptr() { + if (valobj_sp) + Update(); } -bool -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::Update() -{ - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - - TargetSP target_sp(valobj_sp->GetTargetSP()); - - if (!target_sp) - return false; +bool lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::Update() { + ValueObjectSP valobj_sp = m_backend.GetSP(); + if (!valobj_sp) + return false; - if (!valobj_sp) - return false; + TargetSP target_sp(valobj_sp->GetTargetSP()); - // this must be a ValueObject* because it is a child of the ValueObject we are producing children for - // it if were a ValueObjectSP, we would end up with a loop (iterator -> synthetic -> child -> parent == iterator) - // and that would in turn leak memory by never allowing the ValueObjects to die and free their memory - m_pair_ptr = valobj_sp->GetValueForExpressionPath(".__i_.__ptr_->__value_", - nullptr, - nullptr, - nullptr, - ValueObject::GetValueForExpressionPathOptions().DontCheckDotVsArrowSyntax().SetSyntheticChildrenTraversal(ValueObject::GetValueForExpressionPathOptions::SyntheticChildrenTraversal::None), - nullptr).get(); - + if (!target_sp) return false; + + if (!valobj_sp) + return false; + + // this must be a ValueObject* because it is a child of the ValueObject we are + // producing children for + // it if were a ValueObjectSP, we would end up with a loop (iterator -> + // synthetic -> child -> parent == iterator) + // and that would in turn leak memory by never allowing the ValueObjects to + // die and free their memory + m_pair_ptr = valobj_sp + ->GetValueForExpressionPath( + ".__i_.__ptr_->__value_", nullptr, nullptr, nullptr, + ValueObject::GetValueForExpressionPathOptions() + .DontCheckDotVsArrowSyntax() + .SetSyntheticChildrenTraversal( + ValueObject::GetValueForExpressionPathOptions:: + SyntheticChildrenTraversal::None), + nullptr) + .get(); + + return false; } -size_t -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::CalculateNumChildren () -{ - return 2; +size_t lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd:: + CalculateNumChildren() { + return 2; } lldb::ValueObjectSP -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (!m_pair_ptr) - return lldb::ValueObjectSP(); - return m_pair_ptr->GetChildAtIndex(idx, true); +lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + if (!m_pair_ptr) + return lldb::ValueObjectSP(); + return m_pair_ptr->GetChildAtIndex(idx, true); } -bool -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd:: + MightHaveChildren() { + return true; } -size_t -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (name == ConstString("first")) - return 0; - if (name == ConstString("second")) - return 1; - return UINT32_MAX; +size_t lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + if (name == ConstString("first")) + return 0; + if (name == ConstString("second")) + return 1; + return UINT32_MAX; } -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd::~LibCxxMapIteratorSyntheticFrontEnd () -{ - // this will be deleted when its parent dies (since it's a child object) - //delete m_pair_ptr; +lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEnd:: + ~LibCxxMapIteratorSyntheticFrontEnd() { + // this will be deleted when its parent dies (since it's a child object) + // delete m_pair_ptr; } -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return (valobj_sp ? new LibCxxMapIteratorSyntheticFrontEnd(valobj_sp) : nullptr); +SyntheticChildrenFrontEnd * +lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return (valobj_sp ? new LibCxxMapIteratorSyntheticFrontEnd(valobj_sp) + : nullptr); } /* @@ -325,346 +334,341 @@ lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator (CXXSyntheti } */ -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - static ConstString g_item_name; - if (!g_item_name) - g_item_name.SetCString("__i"); - return (valobj_sp ? new VectorIteratorSyntheticFrontEnd(valobj_sp, g_item_name) : nullptr); +SyntheticChildrenFrontEnd * +lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + static ConstString g_item_name; + if (!g_item_name) + g_item_name.SetCString("__i"); + return (valobj_sp + ? new VectorIteratorSyntheticFrontEnd(valobj_sp, g_item_name) + : nullptr); } -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::LibcxxSharedPtrSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_cntrl(nullptr), - m_count_sp(), - m_weak_count_sp(), - m_ptr_size(0), - m_byte_order(lldb::eByteOrderInvalid) -{ - if (valobj_sp) - Update(); +lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: + LibcxxSharedPtrSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_cntrl(nullptr), m_count_sp(), + m_weak_count_sp(), m_ptr_size(0), m_byte_order(lldb::eByteOrderInvalid) { + if (valobj_sp) + Update(); } -size_t -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::CalculateNumChildren () -{ - return (m_cntrl ? 1 : 0); +size_t lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: + CalculateNumChildren() { + return (m_cntrl ? 1 : 0); } lldb::ValueObjectSP -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (!m_cntrl) - return lldb::ValueObjectSP(); - - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return lldb::ValueObjectSP(); - - if (idx == 0) - return valobj_sp->GetChildMemberWithName(ConstString("__ptr_"), true); - - if (idx > 2) +lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + if (!m_cntrl) + return lldb::ValueObjectSP(); + + ValueObjectSP valobj_sp = m_backend.GetSP(); + if (!valobj_sp) + return lldb::ValueObjectSP(); + + if (idx == 0) + return valobj_sp->GetChildMemberWithName(ConstString("__ptr_"), true); + + if (idx > 2) + return lldb::ValueObjectSP(); + + if (idx == 1) { + if (!m_count_sp) { + ValueObjectSP shared_owners_sp(m_cntrl->GetChildMemberWithName( + ConstString("__shared_owners_"), true)); + if (!shared_owners_sp) return lldb::ValueObjectSP(); - - if (idx == 1) - { - if (!m_count_sp) - { - ValueObjectSP shared_owners_sp(m_cntrl->GetChildMemberWithName(ConstString("__shared_owners_"),true)); - if (!shared_owners_sp) - return lldb::ValueObjectSP(); - uint64_t count = 1 + shared_owners_sp->GetValueAsUnsigned(0); - DataExtractor data(&count, 8, m_byte_order, m_ptr_size); - m_count_sp = CreateValueObjectFromData("count", data, valobj_sp->GetExecutionContextRef(), shared_owners_sp->GetCompilerType()); - } - return m_count_sp; + uint64_t count = 1 + shared_owners_sp->GetValueAsUnsigned(0); + DataExtractor data(&count, 8, m_byte_order, m_ptr_size); + m_count_sp = CreateValueObjectFromData( + "count", data, valobj_sp->GetExecutionContextRef(), + shared_owners_sp->GetCompilerType()); } - else /* if (idx == 2) */ - { - if (!m_weak_count_sp) - { - ValueObjectSP shared_weak_owners_sp(m_cntrl->GetChildMemberWithName(ConstString("__shared_weak_owners_"),true)); - if (!shared_weak_owners_sp) - return lldb::ValueObjectSP(); - uint64_t count = 1 + shared_weak_owners_sp->GetValueAsUnsigned(0); - DataExtractor data(&count, 8, m_byte_order, m_ptr_size); - m_weak_count_sp = CreateValueObjectFromData("count", data, valobj_sp->GetExecutionContextRef(), shared_weak_owners_sp->GetCompilerType()); - } - return m_weak_count_sp; + return m_count_sp; + } else /* if (idx == 2) */ + { + if (!m_weak_count_sp) { + ValueObjectSP shared_weak_owners_sp(m_cntrl->GetChildMemberWithName( + ConstString("__shared_weak_owners_"), true)); + if (!shared_weak_owners_sp) + return lldb::ValueObjectSP(); + uint64_t count = 1 + shared_weak_owners_sp->GetValueAsUnsigned(0); + DataExtractor data(&count, 8, m_byte_order, m_ptr_size); + m_weak_count_sp = CreateValueObjectFromData( + "count", data, valobj_sp->GetExecutionContextRef(), + shared_weak_owners_sp->GetCompilerType()); } + return m_weak_count_sp; + } } -bool -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update() -{ - m_count_sp.reset(); - m_weak_count_sp.reset(); - m_cntrl = nullptr; - - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - - TargetSP target_sp(valobj_sp->GetTargetSP()); - if (!target_sp) - return false; - - m_byte_order = target_sp->GetArchitecture().GetByteOrder(); - m_ptr_size = target_sp->GetArchitecture().GetAddressByteSize(); - - lldb::ValueObjectSP cntrl_sp(valobj_sp->GetChildMemberWithName(ConstString("__cntrl_"),true)); - - m_cntrl = cntrl_sp.get(); // need to store the raw pointer to avoid a circular dependency +bool lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::Update() { + m_count_sp.reset(); + m_weak_count_sp.reset(); + m_cntrl = nullptr; + + ValueObjectSP valobj_sp = m_backend.GetSP(); + if (!valobj_sp) return false; + + TargetSP target_sp(valobj_sp->GetTargetSP()); + if (!target_sp) + return false; + + m_byte_order = target_sp->GetArchitecture().GetByteOrder(); + m_ptr_size = target_sp->GetArchitecture().GetAddressByteSize(); + + lldb::ValueObjectSP cntrl_sp( + valobj_sp->GetChildMemberWithName(ConstString("__cntrl_"), true)); + + m_cntrl = cntrl_sp.get(); // need to store the raw pointer to avoid a circular + // dependency + return false; } -bool -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: + MightHaveChildren() { + return true; } -size_t -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (name == ConstString("__ptr_")) - return 0; - if (name == ConstString("count")) - return 1; - if (name == ConstString("weak_count")) - return 2; - return UINT32_MAX; +size_t lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + if (name == ConstString("__ptr_")) + return 0; + if (name == ConstString("count")) + return 1; + if (name == ConstString("weak_count")) + return 2; + return UINT32_MAX; } -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd::~LibcxxSharedPtrSyntheticFrontEnd() = default; +lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEnd:: + ~LibcxxSharedPtrSyntheticFrontEnd() = default; -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return (valobj_sp ? new LibcxxSharedPtrSyntheticFrontEnd(valobj_sp) : nullptr); +SyntheticChildrenFrontEnd * +lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return (valobj_sp ? new LibcxxSharedPtrSyntheticFrontEnd(valobj_sp) + : nullptr); } -bool -lldb_private::formatters::LibcxxContainerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - if (valobj.IsPointerType()) - { - uint64_t value = valobj.GetValueAsUnsigned(0); - if (!value) - return false; - stream.Printf("0x%016" PRIx64 " ", value); - } - return FormatEntity::FormatStringRef("size=${svar%#}", stream, nullptr, nullptr, nullptr, &valobj, false, false); +bool lldb_private::formatters::LibcxxContainerSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + if (valobj.IsPointerType()) { + uint64_t value = valobj.GetValueAsUnsigned(0); + if (!value) + return false; + stream.Printf("0x%016" PRIx64 " ", value); + } + return FormatEntity::FormatStringRef("size=${svar%#}", stream, nullptr, + nullptr, nullptr, &valobj, false, false); } // the field layout in a libc++ string (cap, side, data or data, size, cap) -enum LibcxxStringLayoutMode -{ - eLibcxxStringLayoutModeCSD = 0, - eLibcxxStringLayoutModeDSC = 1, - eLibcxxStringLayoutModeInvalid = 0xffff +enum LibcxxStringLayoutMode { + eLibcxxStringLayoutModeCSD = 0, + eLibcxxStringLayoutModeDSC = 1, + eLibcxxStringLayoutModeInvalid = 0xffff }; // this function abstracts away the layout and mode details of a libc++ string // and returns the address of the data and the size ready for callers to consume -static bool -ExtractLibcxxStringInfo (ValueObject& valobj, - ValueObjectSP &location_sp, - uint64_t& size) -{ - ValueObjectSP D(valobj.GetChildAtIndexPath({0,0,0,0})); - if (!D) - return false; - - ValueObjectSP layout_decider(D->GetChildAtIndexPath({0,0})); - - // this child should exist - if (!layout_decider) +static bool ExtractLibcxxStringInfo(ValueObject &valobj, + ValueObjectSP &location_sp, + uint64_t &size) { + ValueObjectSP D(valobj.GetChildAtIndexPath({0, 0, 0, 0})); + if (!D) + return false; + + ValueObjectSP layout_decider(D->GetChildAtIndexPath({0, 0})); + + // this child should exist + if (!layout_decider) + return false; + + ConstString g_data_name("__data_"); + ConstString g_size_name("__size_"); + bool short_mode = false; // this means the string is in short-mode and the + // data is stored inline + LibcxxStringLayoutMode layout = (layout_decider->GetName() == g_data_name) + ? eLibcxxStringLayoutModeDSC + : eLibcxxStringLayoutModeCSD; + uint64_t size_mode_value = 0; + + if (layout == eLibcxxStringLayoutModeDSC) { + ValueObjectSP size_mode(D->GetChildAtIndexPath({1, 1, 0})); + if (!size_mode) + return false; + + if (size_mode->GetName() != g_size_name) { + // we are hitting the padding structure, move along + size_mode = D->GetChildAtIndexPath({1, 1, 1}); + if (!size_mode) return false; - - ConstString g_data_name("__data_"); - ConstString g_size_name("__size_"); - bool short_mode = false; // this means the string is in short-mode and the data is stored inline - LibcxxStringLayoutMode layout = (layout_decider->GetName() == g_data_name) ? eLibcxxStringLayoutModeDSC : eLibcxxStringLayoutModeCSD; - uint64_t size_mode_value = 0; - - if (layout == eLibcxxStringLayoutModeDSC) - { - ValueObjectSP size_mode(D->GetChildAtIndexPath({1,1,0})); - if (!size_mode) - return false; - - if (size_mode->GetName() != g_size_name) - { - // we are hitting the padding structure, move along - size_mode = D->GetChildAtIndexPath({1,1,1}); - if (!size_mode) - return false; - } - - size_mode_value = (size_mode->GetValueAsUnsigned(0)); - short_mode = ((size_mode_value & 0x80) == 0); - } - else - { - ValueObjectSP size_mode(D->GetChildAtIndexPath({1,0,0})); - if (!size_mode) - return false; - - size_mode_value = (size_mode->GetValueAsUnsigned(0)); - short_mode = ((size_mode_value & 1) == 0); - } - - if (short_mode) - { - ValueObjectSP s(D->GetChildAtIndex(1, true)); - if (!s) - return false; - location_sp = s->GetChildAtIndex((layout == eLibcxxStringLayoutModeDSC) ? 0 : 1, true); - size = (layout == eLibcxxStringLayoutModeDSC) ? size_mode_value : ((size_mode_value >> 1) % 256); - return (location_sp.get() != nullptr); - } - else - { - ValueObjectSP l(D->GetChildAtIndex(0, true)); - if (!l) - return false; - // we can use the layout_decider object as the data pointer - location_sp = (layout == eLibcxxStringLayoutModeDSC) ? layout_decider : l->GetChildAtIndex(2, true); - ValueObjectSP size_vo(l->GetChildAtIndex(1, true)); - if (!size_vo || !location_sp) - return false; - size = size_vo->GetValueAsUnsigned(0); - return true; } + + size_mode_value = (size_mode->GetValueAsUnsigned(0)); + short_mode = ((size_mode_value & 0x80) == 0); + } else { + ValueObjectSP size_mode(D->GetChildAtIndexPath({1, 0, 0})); + if (!size_mode) + return false; + + size_mode_value = (size_mode->GetValueAsUnsigned(0)); + short_mode = ((size_mode_value & 1) == 0); + } + + if (short_mode) { + ValueObjectSP s(D->GetChildAtIndex(1, true)); + if (!s) + return false; + location_sp = s->GetChildAtIndex( + (layout == eLibcxxStringLayoutModeDSC) ? 0 : 1, true); + size = (layout == eLibcxxStringLayoutModeDSC) + ? size_mode_value + : ((size_mode_value >> 1) % 256); + return (location_sp.get() != nullptr); + } else { + ValueObjectSP l(D->GetChildAtIndex(0, true)); + if (!l) + return false; + // we can use the layout_decider object as the data pointer + location_sp = (layout == eLibcxxStringLayoutModeDSC) + ? layout_decider + : l->GetChildAtIndex(2, true); + ValueObjectSP size_vo(l->GetChildAtIndex(1, true)); + if (!size_vo || !location_sp) + return false; + size = size_vo->GetValueAsUnsigned(0); + return true; + } } -bool -lldb_private::formatters::LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& summary_options) -{ - uint64_t size = 0; - ValueObjectSP location_sp; - if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) - return false; - if (size == 0) - { - stream.Printf("L\"\""); - return true; - } - if (!location_sp) - return false; - - DataExtractor extractor; - - StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); - - if (summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryCapped) - { - const auto max_size = valobj.GetTargetSP()->GetMaximumSizeOfStringSummary(); - if (size > max_size) - { - size = max_size; - options.SetIsTruncated(true); - } - } - location_sp->GetPointeeData(extractor, 0, size); - - // std::wstring::size() is measured in 'characters', not bytes - auto wchar_t_size = valobj.GetTargetSP()->GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeWChar).GetByteSize(nullptr); - - options.SetData(extractor); - options.SetStream(&stream); - options.SetPrefixToken("L"); - options.SetQuote('"'); - options.SetSourceSize(size); - options.SetBinaryZeroIsTerminator(false); - - switch (wchar_t_size) - { - case 1: - StringPrinter::ReadBufferAndDumpToStream<lldb_private::formatters::StringPrinter::StringElementType::UTF8>(options); - break; - - case 2: - lldb_private::formatters::StringPrinter::ReadBufferAndDumpToStream<lldb_private::formatters::StringPrinter::StringElementType::UTF16>(options); - break; - - case 4: - lldb_private::formatters::StringPrinter::ReadBufferAndDumpToStream<lldb_private::formatters::StringPrinter::StringElementType::UTF32>(options); - break; - - default: - stream.Printf("size for wchar_t is not valid"); - return true; +bool lldb_private::formatters::LibcxxWStringSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &summary_options) { + uint64_t size = 0; + ValueObjectSP location_sp; + if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) + return false; + if (size == 0) { + stream.Printf("L\"\""); + return true; + } + if (!location_sp) + return false; + + DataExtractor extractor; + + StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); + + if (summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryCapped) { + const auto max_size = valobj.GetTargetSP()->GetMaximumSizeOfStringSummary(); + if (size > max_size) { + size = max_size; + options.SetIsTruncated(true); } - + } + location_sp->GetPointeeData(extractor, 0, size); + + // std::wstring::size() is measured in 'characters', not bytes + auto wchar_t_size = valobj.GetTargetSP() + ->GetScratchClangASTContext() + ->GetBasicType(lldb::eBasicTypeWChar) + .GetByteSize(nullptr); + + options.SetData(extractor); + options.SetStream(&stream); + options.SetPrefixToken("L"); + options.SetQuote('"'); + options.SetSourceSize(size); + options.SetBinaryZeroIsTerminator(false); + + switch (wchar_t_size) { + case 1: + StringPrinter::ReadBufferAndDumpToStream< + lldb_private::formatters::StringPrinter::StringElementType::UTF8>( + options); + break; + + case 2: + lldb_private::formatters::StringPrinter::ReadBufferAndDumpToStream< + lldb_private::formatters::StringPrinter::StringElementType::UTF16>( + options); + break; + + case 4: + lldb_private::formatters::StringPrinter::ReadBufferAndDumpToStream< + lldb_private::formatters::StringPrinter::StringElementType::UTF32>( + options); + break; + + default: + stream.Printf("size for wchar_t is not valid"); return true; + } + + return true; } -bool -lldb_private::formatters::LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& summary_options) -{ - uint64_t size = 0; - ValueObjectSP location_sp; - - if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) - return false; - - if (size == 0) - { - stream.Printf("\"\""); - return true; - } - - if (!location_sp) - return false; - - StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); - - DataExtractor extractor; - if (summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryCapped) - { - const auto max_size = valobj.GetTargetSP()->GetMaximumSizeOfStringSummary(); - if (size > max_size) - { - size = max_size; - options.SetIsTruncated(true); - } - } - location_sp->GetPointeeData(extractor, 0, size); - - options.SetData(extractor); - options.SetStream(&stream); - options.SetPrefixToken(nullptr); - options.SetQuote('"'); - options.SetSourceSize(size); - options.SetBinaryZeroIsTerminator(false); - StringPrinter::ReadBufferAndDumpToStream<StringPrinter::StringElementType::ASCII>(options); - +bool lldb_private::formatters::LibcxxStringSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &summary_options) { + uint64_t size = 0; + ValueObjectSP location_sp; + + if (!ExtractLibcxxStringInfo(valobj, location_sp, size)) + return false; + + if (size == 0) { + stream.Printf("\"\""); return true; + } + + if (!location_sp) + return false; + + StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj); + + DataExtractor extractor; + if (summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryCapped) { + const auto max_size = valobj.GetTargetSP()->GetMaximumSizeOfStringSummary(); + if (size > max_size) { + size = max_size; + options.SetIsTruncated(true); + } + } + location_sp->GetPointeeData(extractor, 0, size); + + options.SetData(extractor); + options.SetStream(&stream); + options.SetPrefixToken(nullptr); + options.SetQuote('"'); + options.SetSourceSize(size); + options.SetBinaryZeroIsTerminator(false); + StringPrinter::ReadBufferAndDumpToStream< + StringPrinter::StringElementType::ASCII>(options); + + return true; } -class LibcxxFunctionFrontEnd : public SyntheticValueProviderFrontEnd -{ +class LibcxxFunctionFrontEnd : public SyntheticValueProviderFrontEnd { public: - LibcxxFunctionFrontEnd (ValueObject &backend) : - SyntheticValueProviderFrontEnd(backend) - {} - - lldb::ValueObjectSP - GetSyntheticValue() override - { - static ConstString g___f_("__f_"); - return m_backend.GetChildMemberWithName(g___f_, true); - } + LibcxxFunctionFrontEnd(ValueObject &backend) + : SyntheticValueProviderFrontEnd(backend) {} + + lldb::ValueObjectSP GetSyntheticValue() override { + static ConstString g___f_("__f_"); + return m_backend.GetChildMemberWithName(g___f_, true); + } }; -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxFunctionFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (valobj_sp) - return new LibcxxFunctionFrontEnd(*valobj_sp); - return nullptr; +SyntheticChildrenFrontEnd * +lldb_private::formatters::LibcxxFunctionFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + if (valobj_sp) + return new LibcxxFunctionFrontEnd(*valobj_sp); + return nullptr; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h index cc92b81cd17..d34efafa7c6 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.h @@ -1,4 +1,5 @@ -//===-- LibCxx.h ---------------------------------------------------*- C++ -*-===// +//===-- LibCxx.h ---------------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -16,128 +17,132 @@ #include "lldb/DataFormatters/TypeSynthetic.h" namespace lldb_private { - namespace formatters - { - - bool - LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // libc++ std::string - - bool - LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // libc++ std::wstring - - bool - LibcxxSmartPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // libc++ std::shared_ptr<> and std::weak_ptr<> - - class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxVectorBoolSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - ~LibcxxVectorBoolSyntheticFrontEnd() override; - - private: - CompilerType m_bool_type; - ExecutionContextRef m_exe_ctx_ref; - uint64_t m_count; - lldb::addr_t m_base_data_address; - std::map<size_t,lldb::ValueObjectSP> m_children; - }; - - SyntheticChildrenFrontEnd* LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - bool - LibcxxContainerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - class LibCxxMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibCxxMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - ~LibCxxMapIteratorSyntheticFrontEnd() override; - - private: - ValueObject *m_pair_ptr; - }; - - SyntheticChildrenFrontEnd* LibCxxMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* LibCxxVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - class LibcxxSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxSharedPtrSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - ~LibcxxSharedPtrSyntheticFrontEnd() override; - - private: - ValueObject* m_cntrl; - lldb::ValueObjectSP m_count_sp; - lldb::ValueObjectSP m_weak_count_sp; - uint8_t m_ptr_size; - lldb::ByteOrder m_byte_order; - }; - - SyntheticChildrenFrontEnd* LibcxxSharedPtrSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* LibcxxStdVectorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* LibcxxStdListSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* LibcxxStdMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* LibcxxStdUnorderedMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* LibcxxInitializerListSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* LibcxxFunctionFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - } // namespace formatters +namespace formatters { + +bool LibcxxStringSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // libc++ std::string + +bool LibcxxWStringSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // libc++ std::wstring + +bool LibcxxSmartPointerSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions + &options); // libc++ std::shared_ptr<> and std::weak_ptr<> + +class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + LibcxxVectorBoolSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + + ~LibcxxVectorBoolSyntheticFrontEnd() override; + +private: + CompilerType m_bool_type; + ExecutionContextRef m_exe_ctx_ref; + uint64_t m_count; + lldb::addr_t m_base_data_address; + std::map<size_t, lldb::ValueObjectSP> m_children; +}; + +SyntheticChildrenFrontEnd * +LibcxxVectorBoolSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +bool LibcxxContainerSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +class LibCxxMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + LibCxxMapIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + + ~LibCxxMapIteratorSyntheticFrontEnd() override; + +private: + ValueObject *m_pair_ptr; +}; + +SyntheticChildrenFrontEnd * +LibCxxMapIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +SyntheticChildrenFrontEnd * +LibCxxVectorIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +class LibcxxSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + LibcxxSharedPtrSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + + ~LibcxxSharedPtrSyntheticFrontEnd() override; + +private: + ValueObject *m_cntrl; + lldb::ValueObjectSP m_count_sp; + lldb::ValueObjectSP m_weak_count_sp; + uint8_t m_ptr_size; + lldb::ByteOrder m_byte_order; +}; + +SyntheticChildrenFrontEnd * +LibcxxSharedPtrSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +SyntheticChildrenFrontEnd * +LibcxxStdVectorSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +SyntheticChildrenFrontEnd * +LibcxxStdListSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +SyntheticChildrenFrontEnd * +LibcxxStdMapSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +SyntheticChildrenFrontEnd * +LibcxxStdUnorderedMapSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +SyntheticChildrenFrontEnd * +LibcxxInitializerListSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +SyntheticChildrenFrontEnd *LibcxxFunctionFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +} // namespace formatters } // namespace lldb_private #endif // liblldb_LibCxx_h_ diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp index a20d7f7d987..dea52e2f30b 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.cpp @@ -1,4 +1,5 @@ -//===-- LibCxxAtomic.cpp ------------------------------------------*- C++ -*-===// +//===-- LibCxxAtomic.cpp ------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -13,109 +14,92 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -bool -lldb_private::formatters::LibCxxAtomicSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - static ConstString g___a_("__a_"); - - if (ValueObjectSP child = valobj.GetChildMemberWithName(g___a_, true)) - { - std::string summary; - if (child->GetSummaryAsCString(summary, options) && summary.size() > 0) - { - stream.Printf("%s", summary.c_str()); - return true; - } +bool lldb_private::formatters::LibCxxAtomicSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + static ConstString g___a_("__a_"); + + if (ValueObjectSP child = valobj.GetChildMemberWithName(g___a_, true)) { + std::string summary; + if (child->GetSummaryAsCString(summary, options) && summary.size() > 0) { + stream.Printf("%s", summary.c_str()); + return true; } - - return false; + } + + return false; } namespace lldb_private { - namespace formatters { - class LibcxxStdAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxStdAtomicSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~LibcxxStdAtomicSyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - lldb::ValueObjectSP - GetSyntheticValue () override; - private: - ValueObject *m_real_child; - }; - } // namespace formatters +namespace formatters { +class LibcxxStdAtomicSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + LibcxxStdAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~LibcxxStdAtomicSyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + + lldb::ValueObjectSP GetSyntheticValue() override; + +private: + ValueObject *m_real_child; +}; +} // namespace formatters } // namespace lldb_private -lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::LibcxxStdAtomicSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_real_child(nullptr) -{ -} +lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: + LibcxxStdAtomicSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_real_child(nullptr) {} -bool -lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::Update() -{ - static ConstString g___a_("__a_"); +bool lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::Update() { + static ConstString g___a_("__a_"); - m_real_child = m_backend.GetChildMemberWithName(g___a_, true).get(); - - return false; + m_real_child = m_backend.GetChildMemberWithName(g___a_, true).get(); + + return false; } -bool -lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::MightHaveChildren() -{ - return true; +bool lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: + MightHaveChildren() { + return true; } -size_t -lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::CalculateNumChildren() -{ - return m_real_child ? m_real_child->GetNumChildren() : 0; +size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: + CalculateNumChildren() { + return m_real_child ? m_real_child->GetNumChildren() : 0; } lldb::ValueObjectSP -lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex(size_t idx) -{ - return m_real_child ? m_real_child->GetChildAtIndex(idx, true) : nullptr; +lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + return m_real_child ? m_real_child->GetChildAtIndex(idx, true) : nullptr; } -size_t -lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetIndexOfChildWithName(const ConstString &name) -{ - return m_real_child ? m_real_child->GetIndexOfChildWithName(name) : UINT32_MAX; +size_t lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + return m_real_child ? m_real_child->GetIndexOfChildWithName(name) + : UINT32_MAX; } -lldb::ValueObjectSP -lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd::GetSyntheticValue () -{ - if (m_real_child && m_real_child->CanProvideValue()) - return m_real_child->GetSP(); - return nullptr; +lldb::ValueObjectSP lldb_private::formatters::LibcxxStdAtomicSyntheticFrontEnd:: + GetSyntheticValue() { + if (m_real_child && m_real_child->CanProvideValue()) + return m_real_child->GetSP(); + return nullptr; } -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (valobj_sp) - return new LibcxxStdAtomicSyntheticFrontEnd(valobj_sp); - return nullptr; +SyntheticChildrenFrontEnd * +lldb_private::formatters::LibcxxAtomicSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + if (valobj_sp) + return new LibcxxStdAtomicSyntheticFrontEnd(valobj_sp); + return nullptr; } - diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.h b/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.h index 5cf729bfa45..e2cc01150a2 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.h +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxAtomic.h @@ -1,4 +1,5 @@ -//===-- LibCxxAtomic.h -------------------------------------------*- C++ -*-===// +//===-- LibCxxAtomic.h -------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -16,14 +17,15 @@ #include "lldb/DataFormatters/TypeSynthetic.h" namespace lldb_private { - namespace formatters - { - bool - LibCxxAtomicSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - SyntheticChildrenFrontEnd* LibcxxAtomicSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - } // namespace formatters +namespace formatters { +bool LibCxxAtomicSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +SyntheticChildrenFrontEnd * +LibcxxAtomicSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +} // namespace formatters } // namespace lldb_private #endif // liblldb_LibCxxAtomic_h_ diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp index 54fddd15dd0..d7cab15e695 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxInitializerList.cpp @@ -22,115 +22,108 @@ using namespace lldb_private; using namespace lldb_private::formatters; namespace lldb_private { - namespace formatters { - class LibcxxInitializerListSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxInitializerListSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~LibcxxInitializerListSyntheticFrontEnd() override; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - private: - ValueObject* m_start; - CompilerType m_element_type; - uint32_t m_element_size; - size_t m_num_elements; - }; - } // namespace formatters +namespace formatters { +class LibcxxInitializerListSyntheticFrontEnd + : public SyntheticChildrenFrontEnd { +public: + LibcxxInitializerListSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~LibcxxInitializerListSyntheticFrontEnd() override; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +private: + ValueObject *m_start; + CompilerType m_element_type; + uint32_t m_element_size; + size_t m_num_elements; +}; +} // namespace formatters } // namespace lldb_private -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::LibcxxInitializerListSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_start(nullptr), - m_element_type(), - m_element_size(0), - m_num_elements(0) -{ - if (valobj_sp) - Update(); +lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: + LibcxxInitializerListSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_start(nullptr), m_element_type(), + m_element_size(0), m_num_elements(0) { + if (valobj_sp) + Update(); } -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::~LibcxxInitializerListSyntheticFrontEnd() -{ - // this needs to stay around because it's a child object who will follow its parent's life cycle - // delete m_start; +lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: + ~LibcxxInitializerListSyntheticFrontEnd() { + // this needs to stay around because it's a child object who will follow its + // parent's life cycle + // delete m_start; } -size_t -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::CalculateNumChildren () -{ - static ConstString g___size_("__size_"); - m_num_elements = 0; - ValueObjectSP size_sp(m_backend.GetChildMemberWithName(g___size_, true)); - if (size_sp) - m_num_elements = size_sp->GetValueAsUnsigned(0); - return m_num_elements; +size_t lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: + CalculateNumChildren() { + static ConstString g___size_("__size_"); + m_num_elements = 0; + ValueObjectSP size_sp(m_backend.GetChildMemberWithName(g___size_, true)); + if (size_sp) + m_num_elements = size_sp->GetValueAsUnsigned(0); + return m_num_elements; } -lldb::ValueObjectSP -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (!m_start) - return lldb::ValueObjectSP(); - - uint64_t offset = idx * m_element_size; - offset = offset + m_start->GetValueAsUnsigned(0); - StreamString name; - name.Printf("[%" PRIu64 "]", (uint64_t)idx); - return CreateValueObjectFromAddress(name.GetData(), offset, m_backend.GetExecutionContextRef(), m_element_type); +lldb::ValueObjectSP lldb_private::formatters:: + LibcxxInitializerListSyntheticFrontEnd::GetChildAtIndex(size_t idx) { + if (!m_start) + return lldb::ValueObjectSP(); + + uint64_t offset = idx * m_element_size; + offset = offset + m_start->GetValueAsUnsigned(0); + StreamString name; + name.Printf("[%" PRIu64 "]", (uint64_t)idx); + return CreateValueObjectFromAddress(name.GetData(), offset, + m_backend.GetExecutionContextRef(), + m_element_type); } -bool -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::Update() -{ - static ConstString g___begin_("__begin_"); - - m_start = nullptr; - m_num_elements = 0; - lldb::TemplateArgumentKind kind; - m_element_type = m_backend.GetCompilerType().GetTemplateArgument(0, kind); - if (kind != lldb::eTemplateArgumentKindType || !m_element_type.IsValid()) - return false; - - m_element_size = m_element_type.GetByteSize(nullptr); - - if (m_element_size > 0) - m_start = m_backend.GetChildMemberWithName(g___begin_,true).get(); // store raw pointers or end up with a circular dependency +bool lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: + Update() { + static ConstString g___begin_("__begin_"); + m_start = nullptr; + m_num_elements = 0; + lldb::TemplateArgumentKind kind; + m_element_type = m_backend.GetCompilerType().GetTemplateArgument(0, kind); + if (kind != lldb::eTemplateArgumentKindType || !m_element_type.IsValid()) return false; + + m_element_size = m_element_type.GetByteSize(nullptr); + + if (m_element_size > 0) + m_start = + m_backend.GetChildMemberWithName(g___begin_, true) + .get(); // store raw pointers or end up with a circular dependency + + return false; } -bool -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: + MightHaveChildren() { + return true; } -size_t -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (!m_start) - return UINT32_MAX; - return ExtractIndexFromString(name.GetCString()); +size_t lldb_private::formatters::LibcxxInitializerListSyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + if (!m_start) + return UINT32_MAX; + return ExtractIndexFromString(name.GetCString()); } -lldb_private::SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return (valobj_sp ? new LibcxxInitializerListSyntheticFrontEnd(valobj_sp) : nullptr); +lldb_private::SyntheticChildrenFrontEnd * +lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return (valobj_sp ? new LibcxxInitializerListSyntheticFrontEnd(valobj_sp) + : nullptr); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp index 829e8ac3f66..eb42b443ad1 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxList.cpp @@ -29,404 +29,330 @@ using namespace lldb_private::formatters; namespace { - class ListEntry - { - public: - ListEntry() = default; - ListEntry (ValueObjectSP entry_sp) : m_entry_sp(entry_sp) {} - ListEntry(const ListEntry& rhs) = default; - ListEntry (ValueObject* entry) : m_entry_sp(entry ? entry->GetSP() : ValueObjectSP()) {} - - ListEntry - next () - { - static ConstString g_next("__next_"); - - if (!m_entry_sp) - return ListEntry(); - return ListEntry(m_entry_sp->GetChildMemberWithName(g_next, true)); - } - - ListEntry - prev () - { - static ConstString g_prev("__prev_"); - - if (!m_entry_sp) - return ListEntry(); - return ListEntry(m_entry_sp->GetChildMemberWithName(g_prev, true)); - } - - uint64_t - value () const - { - if (!m_entry_sp) - return 0; - return m_entry_sp->GetValueAsUnsigned(0); - } - - bool - null() - { - return (value() == 0); - } - - explicit operator bool () - { - return GetEntry() && !null(); - } - - ValueObjectSP - GetEntry () - { - return m_entry_sp; - } - - void - SetEntry (ValueObjectSP entry) - { - m_entry_sp = entry; - } - - bool - operator == (const ListEntry& rhs) const - { - return value() == rhs.value(); - } - - bool - operator != (const ListEntry& rhs) const - { - return !(*this == rhs); - } - - private: - ValueObjectSP m_entry_sp; - }; - - class ListIterator - { - public: - ListIterator() = default; - ListIterator (ListEntry entry) : m_entry(entry) {} - ListIterator (ValueObjectSP entry) : m_entry(entry) {} - ListIterator(const ListIterator& rhs) = default; - ListIterator (ValueObject* entry) : m_entry(entry) {} - - ValueObjectSP - value () - { - return m_entry.GetEntry(); - } - - ValueObjectSP - advance (size_t count) - { - if (count == 0) - return m_entry.GetEntry(); - if (count == 1) - { - next (); - return m_entry.GetEntry(); - } - while (count > 0) - { - next (); - count--; - if (m_entry.null()) - return lldb::ValueObjectSP(); - } - return m_entry.GetEntry(); - } - - bool - operator == (const ListIterator& rhs) const - { - return (rhs.m_entry == m_entry); - } - - protected: - void - next () - { - m_entry = m_entry.next(); - } - - void - prev () - { - m_entry = m_entry.prev(); - } - - private: - ListEntry m_entry; - }; +class ListEntry { +public: + ListEntry() = default; + ListEntry(ValueObjectSP entry_sp) : m_entry_sp(entry_sp) {} + ListEntry(const ListEntry &rhs) = default; + ListEntry(ValueObject *entry) + : m_entry_sp(entry ? entry->GetSP() : ValueObjectSP()) {} + + ListEntry next() { + static ConstString g_next("__next_"); + + if (!m_entry_sp) + return ListEntry(); + return ListEntry(m_entry_sp->GetChildMemberWithName(g_next, true)); + } + + ListEntry prev() { + static ConstString g_prev("__prev_"); + + if (!m_entry_sp) + return ListEntry(); + return ListEntry(m_entry_sp->GetChildMemberWithName(g_prev, true)); + } + + uint64_t value() const { + if (!m_entry_sp) + return 0; + return m_entry_sp->GetValueAsUnsigned(0); + } + + bool null() { return (value() == 0); } + + explicit operator bool() { return GetEntry() && !null(); } + + ValueObjectSP GetEntry() { return m_entry_sp; } + + void SetEntry(ValueObjectSP entry) { m_entry_sp = entry; } + + bool operator==(const ListEntry &rhs) const { return value() == rhs.value(); } + + bool operator!=(const ListEntry &rhs) const { return !(*this == rhs); } + +private: + ValueObjectSP m_entry_sp; +}; + +class ListIterator { +public: + ListIterator() = default; + ListIterator(ListEntry entry) : m_entry(entry) {} + ListIterator(ValueObjectSP entry) : m_entry(entry) {} + ListIterator(const ListIterator &rhs) = default; + ListIterator(ValueObject *entry) : m_entry(entry) {} + + ValueObjectSP value() { return m_entry.GetEntry(); } + + ValueObjectSP advance(size_t count) { + if (count == 0) + return m_entry.GetEntry(); + if (count == 1) { + next(); + return m_entry.GetEntry(); + } + while (count > 0) { + next(); + count--; + if (m_entry.null()) + return lldb::ValueObjectSP(); + } + return m_entry.GetEntry(); + } + + bool operator==(const ListIterator &rhs) const { + return (rhs.m_entry == m_entry); + } + +protected: + void next() { m_entry = m_entry.next(); } + + void prev() { m_entry = m_entry.prev(); } + +private: + ListEntry m_entry; +}; } // end anonymous namespace namespace lldb_private { - namespace formatters { - class LibcxxStdListSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxStdListSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~LibcxxStdListSyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - private: - bool - HasLoop(size_t count); - - size_t m_list_capping_size; - static const bool g_use_loop_detect = true; - - size_t m_loop_detected; // The number of elements that have had loop detection run over them. - ListEntry m_slow_runner; // Used for loop detection - ListEntry m_fast_runner; // Used for loop detection - - lldb::addr_t m_node_address; - ValueObject* m_head; - ValueObject* m_tail; - CompilerType m_element_type; - size_t m_count; - std::map<size_t, ListIterator> m_iterators; - }; - } // namespace formatters +namespace formatters { +class LibcxxStdListSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + LibcxxStdListSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~LibcxxStdListSyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +private: + bool HasLoop(size_t count); + + size_t m_list_capping_size; + static const bool g_use_loop_detect = true; + + size_t m_loop_detected; // The number of elements that have had loop detection + // run over them. + ListEntry m_slow_runner; // Used for loop detection + ListEntry m_fast_runner; // Used for loop detection + + lldb::addr_t m_node_address; + ValueObject *m_head; + ValueObject *m_tail; + CompilerType m_element_type; + size_t m_count; + std::map<size_t, ListIterator> m_iterators; +}; +} // namespace formatters } // namespace lldb_private -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::LibcxxStdListSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_list_capping_size(0), - m_loop_detected(0), - m_node_address(), - m_head(nullptr), - m_tail(nullptr), - m_element_type(), - m_count(UINT32_MAX), - m_iterators() -{ - if (valobj_sp) - Update(); +lldb_private::formatters::LibcxxStdListSyntheticFrontEnd:: + LibcxxStdListSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_list_capping_size(0), + m_loop_detected(0), m_node_address(), m_head(nullptr), m_tail(nullptr), + m_element_type(), m_count(UINT32_MAX), m_iterators() { + if (valobj_sp) + Update(); } -bool -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::HasLoop(size_t count) -{ - if (!g_use_loop_detect) - return false; - // don't bother checking for a loop if we won't actually need to jump nodes - if (m_count < 2) - return false; - - if (m_loop_detected == 0) - { - // This is the first time we are being run (after the last update). Set up the loop - // invariant for the first element. - m_slow_runner = ListEntry(m_head).next(); - m_fast_runner = m_slow_runner.next(); - m_loop_detected = 1; - } +bool lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::HasLoop( + size_t count) { + if (!g_use_loop_detect) + return false; + // don't bother checking for a loop if we won't actually need to jump nodes + if (m_count < 2) + return false; - // Loop invariant: - // Loop detection has been run over the first m_loop_detected elements. If m_slow_runner == - // m_fast_runner then the loop has been detected after m_loop_detected elements. - const size_t steps_to_run = std::min(count,m_count); - while (m_loop_detected < steps_to_run - && m_slow_runner - && m_fast_runner - && m_slow_runner != m_fast_runner) { - - m_slow_runner = m_slow_runner.next(); - m_fast_runner = m_fast_runner.next().next(); - m_loop_detected++; - } - if (count <= m_loop_detected) - return false; // No loop in the first m_loop_detected elements. - if (!m_slow_runner || !m_fast_runner) - return false; // Reached the end of the list. Definitely no loops. - return m_slow_runner == m_fast_runner; + if (m_loop_detected == 0) { + // This is the first time we are being run (after the last update). Set up + // the loop + // invariant for the first element. + m_slow_runner = ListEntry(m_head).next(); + m_fast_runner = m_slow_runner.next(); + m_loop_detected = 1; + } + + // Loop invariant: + // Loop detection has been run over the first m_loop_detected elements. If + // m_slow_runner == + // m_fast_runner then the loop has been detected after m_loop_detected + // elements. + const size_t steps_to_run = std::min(count, m_count); + while (m_loop_detected < steps_to_run && m_slow_runner && m_fast_runner && + m_slow_runner != m_fast_runner) { + + m_slow_runner = m_slow_runner.next(); + m_fast_runner = m_fast_runner.next().next(); + m_loop_detected++; + } + if (count <= m_loop_detected) + return false; // No loop in the first m_loop_detected elements. + if (!m_slow_runner || !m_fast_runner) + return false; // Reached the end of the list. Definitely no loops. + return m_slow_runner == m_fast_runner; } -size_t -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::CalculateNumChildren () -{ - if (m_count != UINT32_MAX) - return m_count; - if (!m_head || !m_tail || m_node_address == 0) - return 0; - ValueObjectSP size_alloc(m_backend.GetChildMemberWithName(ConstString("__size_alloc_"), true)); - if (size_alloc) - { - ValueObjectSP first(size_alloc->GetChildMemberWithName(ConstString("__first_"), true)); - if (first) - { - m_count = first->GetValueAsUnsigned(UINT32_MAX); - } - } - if (m_count != UINT32_MAX) - { - return m_count; +size_t lldb_private::formatters::LibcxxStdListSyntheticFrontEnd:: + CalculateNumChildren() { + if (m_count != UINT32_MAX) + return m_count; + if (!m_head || !m_tail || m_node_address == 0) + return 0; + ValueObjectSP size_alloc( + m_backend.GetChildMemberWithName(ConstString("__size_alloc_"), true)); + if (size_alloc) { + ValueObjectSP first( + size_alloc->GetChildMemberWithName(ConstString("__first_"), true)); + if (first) { + m_count = first->GetValueAsUnsigned(UINT32_MAX); } - else - { - uint64_t next_val = m_head->GetValueAsUnsigned(0); - uint64_t prev_val = m_tail->GetValueAsUnsigned(0); - if (next_val == 0 || prev_val == 0) - return 0; - if (next_val == m_node_address) - return 0; - if (next_val == prev_val) - return 1; - uint64_t size = 2; - ListEntry current(m_head); - while (current.next() && current.next().value() != m_node_address) - { - size++; - current = current.next(); - if (size > m_list_capping_size) - break; - } - return m_count = (size-1); + } + if (m_count != UINT32_MAX) { + return m_count; + } else { + uint64_t next_val = m_head->GetValueAsUnsigned(0); + uint64_t prev_val = m_tail->GetValueAsUnsigned(0); + if (next_val == 0 || prev_val == 0) + return 0; + if (next_val == m_node_address) + return 0; + if (next_val == prev_val) + return 1; + uint64_t size = 2; + ListEntry current(m_head); + while (current.next() && current.next().value() != m_node_address) { + size++; + current = current.next(); + if (size > m_list_capping_size) + break; } + return m_count = (size - 1); + } } lldb::ValueObjectSP -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - static ConstString g_value("__value_"); - static ConstString g_next("__next_"); +lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + static ConstString g_value("__value_"); + static ConstString g_next("__next_"); - if (idx >= CalculateNumChildren()) - return lldb::ValueObjectSP(); - - if (!m_head || !m_tail || m_node_address == 0) - return lldb::ValueObjectSP(); - - if (HasLoop(idx+1)) - return lldb::ValueObjectSP(); - - size_t actual_advance = idx; - - ListIterator current(m_head); - if (idx > 0) - { - auto cached_iterator = m_iterators.find(idx-1); - if (cached_iterator != m_iterators.end()) - { - current = cached_iterator->second; - actual_advance = 1; - } - } - - ValueObjectSP current_sp(current.advance(actual_advance)); - if (!current_sp) - return lldb::ValueObjectSP(); - - m_iterators[idx] = current; - - current_sp = current_sp->GetChildAtIndex(1, true); // get the __value_ child - if (!current_sp) - return lldb::ValueObjectSP(); - - if (current_sp->GetName() == g_next) - { - ProcessSP process_sp(current_sp->GetProcessSP()); - if (!process_sp) - return nullptr; - - // if we grabbed the __next_ pointer, then the child is one pointer deep-er - lldb::addr_t addr = current_sp->GetParent()->GetPointerValue(); - addr = addr + 2*process_sp->GetAddressByteSize(); - ExecutionContext exe_ctx(process_sp); - current_sp = CreateValueObjectFromAddress("__value_", - addr, - exe_ctx, - m_element_type); + if (idx >= CalculateNumChildren()) + return lldb::ValueObjectSP(); + + if (!m_head || !m_tail || m_node_address == 0) + return lldb::ValueObjectSP(); + + if (HasLoop(idx + 1)) + return lldb::ValueObjectSP(); + + size_t actual_advance = idx; + + ListIterator current(m_head); + if (idx > 0) { + auto cached_iterator = m_iterators.find(idx - 1); + if (cached_iterator != m_iterators.end()) { + current = cached_iterator->second; + actual_advance = 1; } - - // we need to copy current_sp into a new object otherwise we will end up with all items named __value_ - DataExtractor data; - Error error; - current_sp->GetData(data, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - - StreamString name; - name.Printf("[%" PRIu64 "]", (uint64_t)idx); - return CreateValueObjectFromData(name.GetData(), - data, - m_backend.GetExecutionContextRef(), - m_element_type); + } + + ValueObjectSP current_sp(current.advance(actual_advance)); + if (!current_sp) + return lldb::ValueObjectSP(); + + m_iterators[idx] = current; + + current_sp = current_sp->GetChildAtIndex(1, true); // get the __value_ child + if (!current_sp) + return lldb::ValueObjectSP(); + + if (current_sp->GetName() == g_next) { + ProcessSP process_sp(current_sp->GetProcessSP()); + if (!process_sp) + return nullptr; + + // if we grabbed the __next_ pointer, then the child is one pointer deep-er + lldb::addr_t addr = current_sp->GetParent()->GetPointerValue(); + addr = addr + 2 * process_sp->GetAddressByteSize(); + ExecutionContext exe_ctx(process_sp); + current_sp = + CreateValueObjectFromAddress("__value_", addr, exe_ctx, m_element_type); + } + + // we need to copy current_sp into a new object otherwise we will end up with + // all items named __value_ + DataExtractor data; + Error error; + current_sp->GetData(data, error); + if (error.Fail()) + return lldb::ValueObjectSP(); + + StreamString name; + name.Printf("[%" PRIu64 "]", (uint64_t)idx); + return CreateValueObjectFromData( + name.GetData(), data, m_backend.GetExecutionContextRef(), m_element_type); } -bool -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::Update() -{ - m_iterators.clear(); - m_head = m_tail = nullptr; - m_node_address = 0; - m_count = UINT32_MAX; - m_loop_detected = 0; - m_slow_runner.SetEntry(nullptr); - m_fast_runner.SetEntry(nullptr); - - Error err; - ValueObjectSP backend_addr(m_backend.AddressOf(err)); - m_list_capping_size = 0; - if (m_backend.GetTargetSP()) - m_list_capping_size = m_backend.GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); - if (m_list_capping_size == 0) - m_list_capping_size = 255; - if (err.Fail() || !backend_addr) - return false; - m_node_address = backend_addr->GetValueAsUnsigned(0); - if (!m_node_address || m_node_address == LLDB_INVALID_ADDRESS) - return false; - ValueObjectSP impl_sp(m_backend.GetChildMemberWithName(ConstString("__end_"),true)); - if (!impl_sp) - return false; - CompilerType list_type = m_backend.GetCompilerType(); - if (list_type.IsReferenceType()) - list_type = list_type.GetNonReferenceType(); - - if (list_type.GetNumTemplateArguments() == 0) - return false; - lldb::TemplateArgumentKind kind; - m_element_type = list_type.GetTemplateArgument(0, kind); - m_head = impl_sp->GetChildMemberWithName(ConstString("__next_"), true).get(); - m_tail = impl_sp->GetChildMemberWithName(ConstString("__prev_"), true).get(); +bool lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::Update() { + m_iterators.clear(); + m_head = m_tail = nullptr; + m_node_address = 0; + m_count = UINT32_MAX; + m_loop_detected = 0; + m_slow_runner.SetEntry(nullptr); + m_fast_runner.SetEntry(nullptr); + + Error err; + ValueObjectSP backend_addr(m_backend.AddressOf(err)); + m_list_capping_size = 0; + if (m_backend.GetTargetSP()) + m_list_capping_size = + m_backend.GetTargetSP()->GetMaximumNumberOfChildrenToDisplay(); + if (m_list_capping_size == 0) + m_list_capping_size = 255; + if (err.Fail() || !backend_addr) + return false; + m_node_address = backend_addr->GetValueAsUnsigned(0); + if (!m_node_address || m_node_address == LLDB_INVALID_ADDRESS) + return false; + ValueObjectSP impl_sp( + m_backend.GetChildMemberWithName(ConstString("__end_"), true)); + if (!impl_sp) + return false; + CompilerType list_type = m_backend.GetCompilerType(); + if (list_type.IsReferenceType()) + list_type = list_type.GetNonReferenceType(); + + if (list_type.GetNumTemplateArguments() == 0) return false; + lldb::TemplateArgumentKind kind; + m_element_type = list_type.GetTemplateArgument(0, kind); + m_head = impl_sp->GetChildMemberWithName(ConstString("__next_"), true).get(); + m_tail = impl_sp->GetChildMemberWithName(ConstString("__prev_"), true).get(); + return false; } -bool -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::LibcxxStdListSyntheticFrontEnd:: + MightHaveChildren() { + return true; } -size_t -lldb_private::formatters::LibcxxStdListSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - return ExtractIndexFromString(name.GetCString()); +size_t lldb_private::formatters::LibcxxStdListSyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + return ExtractIndexFromString(name.GetCString()); } -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return (valobj_sp ? new LibcxxStdListSyntheticFrontEnd(valobj_sp) : nullptr); +SyntheticChildrenFrontEnd * +lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return (valobj_sp ? new LibcxxStdListSyntheticFrontEnd(valobj_sp) : nullptr); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp index d89869283cd..0c14c0e6b9b 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp @@ -27,442 +27,367 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -class MapEntry -{ +class MapEntry { public: - MapEntry() = default; - explicit MapEntry (ValueObjectSP entry_sp) : m_entry_sp(entry_sp) {} - MapEntry(const MapEntry& rhs) = default; - explicit MapEntry (ValueObject* entry) : m_entry_sp(entry ? entry->GetSP() : ValueObjectSP()) {} - - ValueObjectSP - left () const - { - static ConstString g_left("__left_"); - if (!m_entry_sp) - return m_entry_sp; - return m_entry_sp->GetChildMemberWithName(g_left, true); - } - - ValueObjectSP - right () const - { - static ConstString g_right("__right_"); - if (!m_entry_sp) - return m_entry_sp; - return m_entry_sp->GetChildMemberWithName(g_right, true); - } - - ValueObjectSP - parent () const - { - static ConstString g_parent("__parent_"); - if (!m_entry_sp) - return m_entry_sp; - return m_entry_sp->GetChildMemberWithName(g_parent, true); - } - - uint64_t - value () const - { - if (!m_entry_sp) - return 0; - return m_entry_sp->GetValueAsUnsigned(0); - } - - bool - error () const - { - if (!m_entry_sp) - return true; - return m_entry_sp->GetError().Fail(); - } - - bool - null() const - { - return (value() == 0); - } - - ValueObjectSP - GetEntry () const - { - return m_entry_sp; - } - - void - SetEntry (ValueObjectSP entry) - { - m_entry_sp = entry; - } - - bool - operator == (const MapEntry& rhs) const - { - return (rhs.m_entry_sp.get() == m_entry_sp.get()); - } - + MapEntry() = default; + explicit MapEntry(ValueObjectSP entry_sp) : m_entry_sp(entry_sp) {} + MapEntry(const MapEntry &rhs) = default; + explicit MapEntry(ValueObject *entry) + : m_entry_sp(entry ? entry->GetSP() : ValueObjectSP()) {} + + ValueObjectSP left() const { + static ConstString g_left("__left_"); + if (!m_entry_sp) + return m_entry_sp; + return m_entry_sp->GetChildMemberWithName(g_left, true); + } + + ValueObjectSP right() const { + static ConstString g_right("__right_"); + if (!m_entry_sp) + return m_entry_sp; + return m_entry_sp->GetChildMemberWithName(g_right, true); + } + + ValueObjectSP parent() const { + static ConstString g_parent("__parent_"); + if (!m_entry_sp) + return m_entry_sp; + return m_entry_sp->GetChildMemberWithName(g_parent, true); + } + + uint64_t value() const { + if (!m_entry_sp) + return 0; + return m_entry_sp->GetValueAsUnsigned(0); + } + + bool error() const { + if (!m_entry_sp) + return true; + return m_entry_sp->GetError().Fail(); + } + + bool null() const { return (value() == 0); } + + ValueObjectSP GetEntry() const { return m_entry_sp; } + + void SetEntry(ValueObjectSP entry) { m_entry_sp = entry; } + + bool operator==(const MapEntry &rhs) const { + return (rhs.m_entry_sp.get() == m_entry_sp.get()); + } + private: - ValueObjectSP m_entry_sp; + ValueObjectSP m_entry_sp; }; -class MapIterator -{ +class MapIterator { public: - MapIterator() = default; - MapIterator (MapEntry entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth), m_error(false) {} - MapIterator (ValueObjectSP entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth), m_error(false) {} - MapIterator (const MapIterator& rhs) : m_entry(rhs.m_entry),m_max_depth(rhs.m_max_depth), m_error(false) {} - MapIterator (ValueObject* entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth), m_error(false) {} - - ValueObjectSP - value () - { - return m_entry.GetEntry(); - } - - ValueObjectSP - advance (size_t count) - { - ValueObjectSP fail; - if (m_error) - return fail; - size_t steps = 0; - while (count > 0) - { - next(); - count--, steps++; - if (m_error || - m_entry.null() || - (steps > m_max_depth)) - return fail; - } - return m_entry.GetEntry(); + MapIterator() = default; + MapIterator(MapEntry entry, size_t depth = 0) + : m_entry(entry), m_max_depth(depth), m_error(false) {} + MapIterator(ValueObjectSP entry, size_t depth = 0) + : m_entry(entry), m_max_depth(depth), m_error(false) {} + MapIterator(const MapIterator &rhs) + : m_entry(rhs.m_entry), m_max_depth(rhs.m_max_depth), m_error(false) {} + MapIterator(ValueObject *entry, size_t depth = 0) + : m_entry(entry), m_max_depth(depth), m_error(false) {} + + ValueObjectSP value() { return m_entry.GetEntry(); } + + ValueObjectSP advance(size_t count) { + ValueObjectSP fail; + if (m_error) + return fail; + size_t steps = 0; + while (count > 0) { + next(); + count--, steps++; + if (m_error || m_entry.null() || (steps > m_max_depth)) + return fail; } - + return m_entry.GetEntry(); + } + protected: - void - next () - { - if (m_entry.null()) - return; - MapEntry right(m_entry.right()); - if (!right.null()) - { - m_entry = tree_min(std::move(right)); - return; - } - size_t steps = 0; - while (!is_left_child(m_entry)) - { - if (m_entry.error()) - { - m_error = true; - return; - } - m_entry.SetEntry(m_entry.parent()); - steps++; - if (steps > m_max_depth) - { - m_entry = MapEntry(); - return; - } - } - m_entry = MapEntry(m_entry.parent()); + void next() { + if (m_entry.null()) + return; + MapEntry right(m_entry.right()); + if (!right.null()) { + m_entry = tree_min(std::move(right)); + return; } - -private: - MapEntry - tree_min (MapEntry&& x) - { - if (x.null()) - return MapEntry(); - MapEntry left(x.left()); - size_t steps = 0; - while (!left.null()) - { - if (left.error()) - { - m_error = true; - return MapEntry(); - } - x = left; - left.SetEntry(x.left()); - steps++; - if (steps > m_max_depth) - return MapEntry(); - } - return x; + size_t steps = 0; + while (!is_left_child(m_entry)) { + if (m_entry.error()) { + m_error = true; + return; + } + m_entry.SetEntry(m_entry.parent()); + steps++; + if (steps > m_max_depth) { + m_entry = MapEntry(); + return; + } } - - bool - is_left_child (const MapEntry& x) - { - if (x.null()) - return false; - MapEntry rhs(x.parent()); - rhs.SetEntry(rhs.left()); - return x.value() == rhs.value(); + m_entry = MapEntry(m_entry.parent()); + } + +private: + MapEntry tree_min(MapEntry &&x) { + if (x.null()) + return MapEntry(); + MapEntry left(x.left()); + size_t steps = 0; + while (!left.null()) { + if (left.error()) { + m_error = true; + return MapEntry(); + } + x = left; + left.SetEntry(x.left()); + steps++; + if (steps > m_max_depth) + return MapEntry(); } - - MapEntry m_entry; - size_t m_max_depth; - bool m_error; + return x; + } + + bool is_left_child(const MapEntry &x) { + if (x.null()) + return false; + MapEntry rhs(x.parent()); + rhs.SetEntry(rhs.left()); + return x.value() == rhs.value(); + } + + MapEntry m_entry; + size_t m_max_depth; + bool m_error; }; namespace lldb_private { - namespace formatters { - class LibcxxStdMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxStdMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~LibcxxStdMapSyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - private: - bool - GetDataType(); - - void - GetValueOffset (const lldb::ValueObjectSP& node); - - ValueObject* m_tree; - ValueObject* m_root_node; - CompilerType m_element_type; - uint32_t m_skip_size; - size_t m_count; - std::map<size_t, MapIterator> m_iterators; - }; - } // namespace formatters +namespace formatters { +class LibcxxStdMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + LibcxxStdMapSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~LibcxxStdMapSyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +private: + bool GetDataType(); + + void GetValueOffset(const lldb::ValueObjectSP &node); + + ValueObject *m_tree; + ValueObject *m_root_node; + CompilerType m_element_type; + uint32_t m_skip_size; + size_t m_count; + std::map<size_t, MapIterator> m_iterators; +}; +} // namespace formatters } // namespace lldb_private -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::LibcxxStdMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_tree(nullptr), - m_root_node(nullptr), - m_element_type(), - m_skip_size(UINT32_MAX), - m_count(UINT32_MAX), - m_iterators() -{ - if (valobj_sp) - Update(); +lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd:: + LibcxxStdMapSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_tree(nullptr), + m_root_node(nullptr), m_element_type(), m_skip_size(UINT32_MAX), + m_count(UINT32_MAX), m_iterators() { + if (valobj_sp) + Update(); } -size_t -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::CalculateNumChildren () -{ - static ConstString g___pair3_("__pair3_"); - static ConstString g___first_("__first_"); - - if (m_count != UINT32_MAX) - return m_count; - if (m_tree == nullptr) - return 0; - ValueObjectSP m_item(m_tree->GetChildMemberWithName(g___pair3_, true)); - if (!m_item) - return 0; - m_item = m_item->GetChildMemberWithName(g___first_, true); - if (!m_item) - return 0; - m_count = m_item->GetValueAsUnsigned(0); +size_t lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd:: + CalculateNumChildren() { + static ConstString g___pair3_("__pair3_"); + static ConstString g___first_("__first_"); + + if (m_count != UINT32_MAX) return m_count; + if (m_tree == nullptr) + return 0; + ValueObjectSP m_item(m_tree->GetChildMemberWithName(g___pair3_, true)); + if (!m_item) + return 0; + m_item = m_item->GetChildMemberWithName(g___first_, true); + if (!m_item) + return 0; + m_count = m_item->GetValueAsUnsigned(0); + return m_count; } -bool -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetDataType() -{ - static ConstString g___value_("__value_"); - - if (m_element_type.GetOpaqueQualType() && m_element_type.GetTypeSystem()) - return true; - m_element_type.Clear(); - ValueObjectSP deref; - Error error; - deref = m_root_node->Dereference(error); - if (!deref || error.Fail()) - return false; - deref = deref->GetChildMemberWithName(g___value_, true); - if (!deref) - return false; - m_element_type = deref->GetCompilerType(); +bool lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetDataType() { + static ConstString g___value_("__value_"); + + if (m_element_type.GetOpaqueQualType() && m_element_type.GetTypeSystem()) return true; + m_element_type.Clear(); + ValueObjectSP deref; + Error error; + deref = m_root_node->Dereference(error); + if (!deref || error.Fail()) + return false; + deref = deref->GetChildMemberWithName(g___value_, true); + if (!deref) + return false; + m_element_type = deref->GetCompilerType(); + return true; } -void -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetValueOffset (const lldb::ValueObjectSP& node) -{ - if (m_skip_size != UINT32_MAX) - return; - if (!node) - return; - CompilerType node_type(node->GetCompilerType()); - uint64_t bit_offset; - if (node_type.GetIndexOfFieldWithName("__value_", nullptr, &bit_offset) == UINT32_MAX) - return; - m_skip_size = bit_offset / 8u; +void lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetValueOffset( + const lldb::ValueObjectSP &node) { + if (m_skip_size != UINT32_MAX) + return; + if (!node) + return; + CompilerType node_type(node->GetCompilerType()); + uint64_t bit_offset; + if (node_type.GetIndexOfFieldWithName("__value_", nullptr, &bit_offset) == + UINT32_MAX) + return; + m_skip_size = bit_offset / 8u; } lldb::ValueObjectSP -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - static ConstString g___cc("__cc"); - static ConstString g___nc("__nc"); - static ConstString g___value_("__value_"); +lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + static ConstString g___cc("__cc"); + static ConstString g___nc("__nc"); + static ConstString g___value_("__value_"); + + if (idx >= CalculateNumChildren()) + return lldb::ValueObjectSP(); + if (m_tree == nullptr || m_root_node == nullptr) + return lldb::ValueObjectSP(); + + MapIterator iterator(m_root_node, CalculateNumChildren()); - if (idx >= CalculateNumChildren()) + const bool need_to_skip = (idx > 0); + size_t actual_advancde = idx; + if (need_to_skip) { + auto cached_iterator = m_iterators.find(idx - 1); + if (cached_iterator != m_iterators.end()) { + iterator = cached_iterator->second; + actual_advancde = 1; + } + } + + ValueObjectSP iterated_sp(iterator.advance(actual_advancde)); + if (!iterated_sp) { + // this tree is garbage - stop + m_tree = + nullptr; // this will stop all future searches until an Update() happens + return iterated_sp; + } + if (GetDataType()) { + if (!need_to_skip) { + Error error; + iterated_sp = iterated_sp->Dereference(error); + if (!iterated_sp || error.Fail()) { + m_tree = nullptr; return lldb::ValueObjectSP(); - if (m_tree == nullptr || m_root_node == nullptr) + } + GetValueOffset(iterated_sp); + iterated_sp = iterated_sp->GetChildMemberWithName(g___value_, true); + if (!iterated_sp) { + m_tree = nullptr; return lldb::ValueObjectSP(); - - MapIterator iterator(m_root_node, CalculateNumChildren()); - - const bool need_to_skip = (idx > 0); - size_t actual_advancde = idx; - if (need_to_skip) - { - auto cached_iterator = m_iterators.find(idx-1); - if (cached_iterator != m_iterators.end()) - { - iterator = cached_iterator->second; - actual_advancde = 1; - } - } - - ValueObjectSP iterated_sp(iterator.advance(actual_advancde)); - if (!iterated_sp) - { - // this tree is garbage - stop - m_tree = nullptr; // this will stop all future searches until an Update() happens - return iterated_sp; - } - if (GetDataType()) - { - if (!need_to_skip) - { - Error error; - iterated_sp = iterated_sp->Dereference(error); - if (!iterated_sp || error.Fail()) - { - m_tree = nullptr; - return lldb::ValueObjectSP(); - } - GetValueOffset(iterated_sp); - iterated_sp = iterated_sp->GetChildMemberWithName(g___value_, true); - if (!iterated_sp) - { - m_tree = nullptr; - return lldb::ValueObjectSP(); - } - } - else - { - // because of the way our debug info is made, we need to read item 0 first - // so that we can cache information used to generate other elements - if (m_skip_size == UINT32_MAX) - GetChildAtIndex(0); - if (m_skip_size == UINT32_MAX) - { - m_tree = nullptr; - return lldb::ValueObjectSP(); - } - iterated_sp = iterated_sp->GetSyntheticChildAtOffset(m_skip_size, m_element_type, true); - if (!iterated_sp) - { - m_tree = nullptr; - return lldb::ValueObjectSP(); - } - } - } - else - { + } + } else { + // because of the way our debug info is made, we need to read item 0 first + // so that we can cache information used to generate other elements + if (m_skip_size == UINT32_MAX) + GetChildAtIndex(0); + if (m_skip_size == UINT32_MAX) { m_tree = nullptr; return lldb::ValueObjectSP(); - } - // at this point we have a valid - // we need to copy current_sp into a new object otherwise we will end up with all items named __value_ - DataExtractor data; - Error error; - iterated_sp->GetData(data, error); - if (error.Fail()) - { + } + iterated_sp = iterated_sp->GetSyntheticChildAtOffset( + m_skip_size, m_element_type, true); + if (!iterated_sp) { m_tree = nullptr; return lldb::ValueObjectSP(); + } } - StreamString name; - name.Printf("[%" PRIu64 "]", (uint64_t)idx); - auto potential_child_sp = CreateValueObjectFromData(name.GetData(), data, m_backend.GetExecutionContextRef(), m_element_type); - if (potential_child_sp) - { - switch (potential_child_sp->GetNumChildren()) - { - case 1: - { - auto child0_sp = potential_child_sp->GetChildAtIndex(0, true); - if (child0_sp && child0_sp->GetName() == g___cc) - potential_child_sp = child0_sp; - break; - } - case 2: - { - auto child0_sp = potential_child_sp->GetChildAtIndex(0, true); - auto child1_sp = potential_child_sp->GetChildAtIndex(1, true); - if (child0_sp && child0_sp->GetName() == g___cc && - child1_sp && child1_sp->GetName() == g___nc) - potential_child_sp = child0_sp; - break; - } - } - potential_child_sp->SetName(ConstString(name.GetData())); + } else { + m_tree = nullptr; + return lldb::ValueObjectSP(); + } + // at this point we have a valid + // we need to copy current_sp into a new object otherwise we will end up with + // all items named __value_ + DataExtractor data; + Error error; + iterated_sp->GetData(data, error); + if (error.Fail()) { + m_tree = nullptr; + return lldb::ValueObjectSP(); + } + StreamString name; + name.Printf("[%" PRIu64 "]", (uint64_t)idx); + auto potential_child_sp = CreateValueObjectFromData( + name.GetData(), data, m_backend.GetExecutionContextRef(), m_element_type); + if (potential_child_sp) { + switch (potential_child_sp->GetNumChildren()) { + case 1: { + auto child0_sp = potential_child_sp->GetChildAtIndex(0, true); + if (child0_sp && child0_sp->GetName() == g___cc) + potential_child_sp = child0_sp; + break; } - m_iterators[idx] = iterator; - return potential_child_sp; + case 2: { + auto child0_sp = potential_child_sp->GetChildAtIndex(0, true); + auto child1_sp = potential_child_sp->GetChildAtIndex(1, true); + if (child0_sp && child0_sp->GetName() == g___cc && child1_sp && + child1_sp->GetName() == g___nc) + potential_child_sp = child0_sp; + break; + } + } + potential_child_sp->SetName(ConstString(name.GetData())); + } + m_iterators[idx] = iterator; + return potential_child_sp; } -bool -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::Update() -{ - static ConstString g___tree_("__tree_"); - static ConstString g___begin_node_("__begin_node_"); - m_count = UINT32_MAX; - m_tree = m_root_node = nullptr; - m_iterators.clear(); - m_tree = m_backend.GetChildMemberWithName(g___tree_, true).get(); - if (!m_tree) - return false; - m_root_node = m_tree->GetChildMemberWithName(g___begin_node_, true).get(); +bool lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::Update() { + static ConstString g___tree_("__tree_"); + static ConstString g___begin_node_("__begin_node_"); + m_count = UINT32_MAX; + m_tree = m_root_node = nullptr; + m_iterators.clear(); + m_tree = m_backend.GetChildMemberWithName(g___tree_, true).get(); + if (!m_tree) return false; + m_root_node = m_tree->GetChildMemberWithName(g___begin_node_, true).get(); + return false; } -bool -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd:: + MightHaveChildren() { + return true; } -size_t -lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - return ExtractIndexFromString(name.GetCString()); +size_t lldb_private::formatters::LibcxxStdMapSyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + return ExtractIndexFromString(name.GetCString()); } -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return (valobj_sp ? new LibcxxStdMapSyntheticFrontEnd(valobj_sp) : nullptr); +SyntheticChildrenFrontEnd * +lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return (valobj_sp ? new LibcxxStdMapSyntheticFrontEnd(valobj_sp) : nullptr); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp index a547695448c..df9371daa8f 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxUnorderedMap.cpp @@ -28,136 +28,136 @@ using namespace lldb_private; using namespace lldb_private::formatters; namespace lldb_private { - namespace formatters { - class LibcxxStdUnorderedMapSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxStdUnorderedMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~LibcxxStdUnorderedMapSyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - private: - ValueObject* m_tree; - size_t m_num_elements; - ValueObject* m_next_element; - std::vector<std::pair<ValueObject*, uint64_t> > m_elements_cache; - }; - } // namespace formatters +namespace formatters { +class LibcxxStdUnorderedMapSyntheticFrontEnd + : public SyntheticChildrenFrontEnd { +public: + LibcxxStdUnorderedMapSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~LibcxxStdUnorderedMapSyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +private: + ValueObject *m_tree; + size_t m_num_elements; + ValueObject *m_next_element; + std::vector<std::pair<ValueObject *, uint64_t>> m_elements_cache; +}; +} // namespace formatters } // namespace lldb_private -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::LibcxxStdUnorderedMapSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_tree(nullptr), - m_num_elements(0), - m_next_element(nullptr), - m_elements_cache() -{ - if (valobj_sp) - Update(); +lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd:: + LibcxxStdUnorderedMapSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_tree(nullptr), m_num_elements(0), + m_next_element(nullptr), m_elements_cache() { + if (valobj_sp) + Update(); } -size_t -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::CalculateNumChildren () -{ - if (m_num_elements != UINT32_MAX) - return m_num_elements; - return 0; +size_t lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd:: + CalculateNumChildren() { + if (m_num_elements != UINT32_MAX) + return m_num_elements; + return 0; } -lldb::ValueObjectSP -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (idx >= CalculateNumChildren()) - return lldb::ValueObjectSP(); - if (m_tree == nullptr) - return lldb::ValueObjectSP(); - - while (idx >= m_elements_cache.size()) - { - if (m_next_element == nullptr) - return lldb::ValueObjectSP(); - - Error error; - ValueObjectSP node_sp = m_next_element->Dereference(error); - if (!node_sp || error.Fail()) - return lldb::ValueObjectSP(); - - ValueObjectSP value_sp = node_sp->GetChildMemberWithName(ConstString("__value_"), true); - ValueObjectSP hash_sp = node_sp->GetChildMemberWithName(ConstString("__hash_"), true); - if (!hash_sp || !value_sp) - return lldb::ValueObjectSP(); - m_elements_cache.push_back({value_sp.get(),hash_sp->GetValueAsUnsigned(0)}); - m_next_element = node_sp->GetChildMemberWithName(ConstString("__next_"),true).get(); - if (!m_next_element || m_next_element->GetValueAsUnsigned(0) == 0) - m_next_element = nullptr; - } - - std::pair<ValueObject*, uint64_t> val_hash = m_elements_cache[idx]; - if (!val_hash.first) - return lldb::ValueObjectSP(); - StreamString stream; - stream.Printf("[%" PRIu64 "]", (uint64_t)idx); - DataExtractor data; +lldb::ValueObjectSP lldb_private::formatters:: + LibcxxStdUnorderedMapSyntheticFrontEnd::GetChildAtIndex(size_t idx) { + if (idx >= CalculateNumChildren()) + return lldb::ValueObjectSP(); + if (m_tree == nullptr) + return lldb::ValueObjectSP(); + + while (idx >= m_elements_cache.size()) { + if (m_next_element == nullptr) + return lldb::ValueObjectSP(); + Error error; - val_hash.first->GetData(data, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - const bool thread_and_frame_only_if_stopped = true; - ExecutionContext exe_ctx = val_hash.first->GetExecutionContextRef().Lock(thread_and_frame_only_if_stopped); - return CreateValueObjectFromData(stream.GetData(), - data, - exe_ctx, - val_hash.first->GetCompilerType()); + ValueObjectSP node_sp = m_next_element->Dereference(error); + if (!node_sp || error.Fail()) + return lldb::ValueObjectSP(); + + ValueObjectSP value_sp = + node_sp->GetChildMemberWithName(ConstString("__value_"), true); + ValueObjectSP hash_sp = + node_sp->GetChildMemberWithName(ConstString("__hash_"), true); + if (!hash_sp || !value_sp) + return lldb::ValueObjectSP(); + m_elements_cache.push_back( + {value_sp.get(), hash_sp->GetValueAsUnsigned(0)}); + m_next_element = + node_sp->GetChildMemberWithName(ConstString("__next_"), true).get(); + if (!m_next_element || m_next_element->GetValueAsUnsigned(0) == 0) + m_next_element = nullptr; + } + + std::pair<ValueObject *, uint64_t> val_hash = m_elements_cache[idx]; + if (!val_hash.first) + return lldb::ValueObjectSP(); + StreamString stream; + stream.Printf("[%" PRIu64 "]", (uint64_t)idx); + DataExtractor data; + Error error; + val_hash.first->GetData(data, error); + if (error.Fail()) + return lldb::ValueObjectSP(); + const bool thread_and_frame_only_if_stopped = true; + ExecutionContext exe_ctx = val_hash.first->GetExecutionContextRef().Lock( + thread_and_frame_only_if_stopped); + return CreateValueObjectFromData(stream.GetData(), data, exe_ctx, + val_hash.first->GetCompilerType()); } -bool -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::Update() -{ - m_num_elements = UINT32_MAX; - m_next_element = nullptr; - m_elements_cache.clear(); - ValueObjectSP table_sp = m_backend.GetChildMemberWithName(ConstString("__table_"), true); - if (!table_sp) - return false; - ValueObjectSP num_elements_sp = table_sp->GetChildAtNamePath({ConstString("__p2_"),ConstString("__first_")}); - if (!num_elements_sp) - return false; - m_num_elements = num_elements_sp->GetValueAsUnsigned(0); - m_tree = table_sp->GetChildAtNamePath({ConstString("__p1_"),ConstString("__first_"),ConstString("__next_")}).get(); - if (m_num_elements > 0) - m_next_element = table_sp->GetChildAtNamePath({ConstString("__p1_"),ConstString("__first_"),ConstString("__next_")}).get(); +bool lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd:: + Update() { + m_num_elements = UINT32_MAX; + m_next_element = nullptr; + m_elements_cache.clear(); + ValueObjectSP table_sp = + m_backend.GetChildMemberWithName(ConstString("__table_"), true); + if (!table_sp) + return false; + ValueObjectSP num_elements_sp = table_sp->GetChildAtNamePath( + {ConstString("__p2_"), ConstString("__first_")}); + if (!num_elements_sp) return false; + m_num_elements = num_elements_sp->GetValueAsUnsigned(0); + m_tree = + table_sp + ->GetChildAtNamePath({ConstString("__p1_"), ConstString("__first_"), + ConstString("__next_")}) + .get(); + if (m_num_elements > 0) + m_next_element = + table_sp + ->GetChildAtNamePath({ConstString("__p1_"), ConstString("__first_"), + ConstString("__next_")}) + .get(); + return false; } -bool -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd:: + MightHaveChildren() { + return true; } -size_t -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - return ExtractIndexFromString(name.GetCString()); +size_t lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + return ExtractIndexFromString(name.GetCString()); } -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return (valobj_sp ? new LibcxxStdUnorderedMapSyntheticFrontEnd(valobj_sp) : nullptr); +SyntheticChildrenFrontEnd * +lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return (valobj_sp ? new LibcxxStdUnorderedMapSyntheticFrontEnd(valobj_sp) + : nullptr); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp index ed26eaea121..950dcee7860 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxVector.cpp @@ -22,130 +22,120 @@ using namespace lldb_private; using namespace lldb_private::formatters; namespace lldb_private { - namespace formatters { - class LibcxxStdVectorSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - LibcxxStdVectorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~LibcxxStdVectorSyntheticFrontEnd() override; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - private: - ValueObject* m_start; - ValueObject* m_finish; - CompilerType m_element_type; - uint32_t m_element_size; - }; - } // namespace formatters +namespace formatters { +class LibcxxStdVectorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + LibcxxStdVectorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~LibcxxStdVectorSyntheticFrontEnd() override; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +private: + ValueObject *m_start; + ValueObject *m_finish; + CompilerType m_element_type; + uint32_t m_element_size; +}; +} // namespace formatters } // namespace lldb_private -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::LibcxxStdVectorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_start(nullptr), - m_finish(nullptr), - m_element_type(), - m_element_size(0) -{ - if (valobj_sp) - Update(); +lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd:: + LibcxxStdVectorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_start(nullptr), + m_finish(nullptr), m_element_type(), m_element_size(0) { + if (valobj_sp) + Update(); } -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::~LibcxxStdVectorSyntheticFrontEnd() -{ - // these need to stay around because they are child objects who will follow their parent's life cycle - // delete m_start; - // delete m_finish; +lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd:: + ~LibcxxStdVectorSyntheticFrontEnd() { + // these need to stay around because they are child objects who will follow + // their parent's life cycle + // delete m_start; + // delete m_finish; } -size_t -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::CalculateNumChildren () -{ - if (!m_start || !m_finish) - return 0; - uint64_t start_val = m_start->GetValueAsUnsigned(0); - uint64_t finish_val = m_finish->GetValueAsUnsigned(0); - - if (start_val == 0 || finish_val == 0) - return 0; - - if (start_val >= finish_val) - return 0; - - size_t num_children = (finish_val - start_val); - if (num_children % m_element_size) - return 0; - return num_children/m_element_size; +size_t lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd:: + CalculateNumChildren() { + if (!m_start || !m_finish) + return 0; + uint64_t start_val = m_start->GetValueAsUnsigned(0); + uint64_t finish_val = m_finish->GetValueAsUnsigned(0); + + if (start_val == 0 || finish_val == 0) + return 0; + + if (start_val >= finish_val) + return 0; + + size_t num_children = (finish_val - start_val); + if (num_children % m_element_size) + return 0; + return num_children / m_element_size; } lldb::ValueObjectSP -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (!m_start || !m_finish) - return lldb::ValueObjectSP(); - - uint64_t offset = idx * m_element_size; - offset = offset + m_start->GetValueAsUnsigned(0); - StreamString name; - name.Printf("[%" PRIu64 "]", (uint64_t)idx); - return CreateValueObjectFromAddress(name.GetData(), - offset, - m_backend.GetExecutionContextRef(), - m_element_type); +lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + if (!m_start || !m_finish) + return lldb::ValueObjectSP(); + + uint64_t offset = idx * m_element_size; + offset = offset + m_start->GetValueAsUnsigned(0); + StreamString name; + name.Printf("[%" PRIu64 "]", (uint64_t)idx); + return CreateValueObjectFromAddress(name.GetData(), offset, + m_backend.GetExecutionContextRef(), + m_element_type); } -bool -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::Update() -{ - m_start = m_finish = nullptr; - ValueObjectSP data_type_finder_sp(m_backend.GetChildMemberWithName(ConstString("__end_cap_"),true)); - if (!data_type_finder_sp) - return false; - data_type_finder_sp = data_type_finder_sp->GetChildMemberWithName(ConstString("__first_"),true); - if (!data_type_finder_sp) - return false; - m_element_type = data_type_finder_sp->GetCompilerType().GetPointeeType(); - m_element_size = m_element_type.GetByteSize(nullptr); - - if (m_element_size > 0) - { - // store raw pointers or end up with a circular dependency - m_start = m_backend.GetChildMemberWithName(ConstString("__begin_"),true).get(); - m_finish = m_backend.GetChildMemberWithName(ConstString("__end_"),true).get(); - } +bool lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::Update() { + m_start = m_finish = nullptr; + ValueObjectSP data_type_finder_sp( + m_backend.GetChildMemberWithName(ConstString("__end_cap_"), true)); + if (!data_type_finder_sp) + return false; + data_type_finder_sp = data_type_finder_sp->GetChildMemberWithName( + ConstString("__first_"), true); + if (!data_type_finder_sp) return false; + m_element_type = data_type_finder_sp->GetCompilerType().GetPointeeType(); + m_element_size = m_element_type.GetByteSize(nullptr); + + if (m_element_size > 0) { + // store raw pointers or end up with a circular dependency + m_start = + m_backend.GetChildMemberWithName(ConstString("__begin_"), true).get(); + m_finish = + m_backend.GetChildMemberWithName(ConstString("__end_"), true).get(); + } + return false; } -bool -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd:: + MightHaveChildren() { + return true; } -size_t -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (!m_start || !m_finish) - return UINT32_MAX; - return ExtractIndexFromString(name.GetCString()); +size_t lldb_private::formatters::LibcxxStdVectorSyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + if (!m_start || !m_finish) + return UINT32_MAX; + return ExtractIndexFromString(name.GetCString()); } -lldb_private::SyntheticChildrenFrontEnd* -lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return (valobj_sp ? new LibcxxStdVectorSyntheticFrontEnd(valobj_sp) : nullptr); +lldb_private::SyntheticChildrenFrontEnd * +lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return (valobj_sp ? new LibcxxStdVectorSyntheticFrontEnd(valobj_sp) + : nullptr); } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp index 6d6f915f68e..2215b9282e7 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.cpp @@ -28,449 +28,403 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -namespace -{ - -class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd -{ - /* - (std::_Rb_tree_iterator<std::pair<const int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >) ibeg = { - (_Base_ptr) _M_node = 0x0000000100103910 { - (std::_Rb_tree_color) _M_color = _S_black - (std::_Rb_tree_node_base::_Base_ptr) _M_parent = 0x00000001001038c0 - (std::_Rb_tree_node_base::_Base_ptr) _M_left = 0x0000000000000000 - (std::_Rb_tree_node_base::_Base_ptr) _M_right = 0x0000000000000000 - } - } - */ +namespace { + +class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { + /* + (std::_Rb_tree_iterator<std::pair<const int, std::basic_string<char, + std::char_traits<char>, std::allocator<char> > > >) ibeg = { + (_Base_ptr) _M_node = 0x0000000100103910 { + (std::_Rb_tree_color) _M_color = _S_black + (std::_Rb_tree_node_base::_Base_ptr) _M_parent = 0x00000001001038c0 + (std::_Rb_tree_node_base::_Base_ptr) _M_left = 0x0000000000000000 + (std::_Rb_tree_node_base::_Base_ptr) _M_right = 0x0000000000000000 + } + } + */ public: - explicit LibstdcppMapIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName (const ConstString &name) override; - + explicit LibstdcppMapIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + private: - ExecutionContextRef m_exe_ctx_ref; - lldb::addr_t m_pair_address; - CompilerType m_pair_type; - lldb::ValueObjectSP m_pair_sp; + ExecutionContextRef m_exe_ctx_ref; + lldb::addr_t m_pair_address; + CompilerType m_pair_type; + lldb::ValueObjectSP m_pair_sp; }; -class LibStdcppSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd -{ +class LibStdcppSharedPtrSyntheticFrontEnd : public SyntheticChildrenFrontEnd { public: - explicit LibStdcppSharedPtrSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + explicit LibStdcppSharedPtrSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); - size_t - CalculateNumChildren() override; + size_t CalculateNumChildren() override; - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; - bool - Update() override; + bool Update() override; - bool - MightHaveChildren() override; + bool MightHaveChildren() override; - size_t - GetIndexOfChildWithName(const ConstString &name) override; + size_t GetIndexOfChildWithName(const ConstString &name) override; }; } // end of anonymous namespace -LibstdcppMapIteratorSyntheticFrontEnd::LibstdcppMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_exe_ctx_ref(), - m_pair_address(0), - m_pair_type(), - m_pair_sp() -{ - if (valobj_sp) - Update(); +LibstdcppMapIteratorSyntheticFrontEnd::LibstdcppMapIteratorSyntheticFrontEnd( + lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_pair_address(0), + m_pair_type(), m_pair_sp() { + if (valobj_sp) + Update(); } -bool -LibstdcppMapIteratorSyntheticFrontEnd::Update() -{ - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - - TargetSP target_sp(valobj_sp->GetTargetSP()); - - if (!target_sp) - return false; - - bool is_64bit = (target_sp->GetArchitecture().GetAddressByteSize() == 8); - - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - - ValueObjectSP _M_node_sp(valobj_sp->GetChildMemberWithName(ConstString("_M_node"), true)); - if (!_M_node_sp) - return false; - - m_pair_address = _M_node_sp->GetValueAsUnsigned(0); - if (m_pair_address == 0) - return false; - - m_pair_address += (is_64bit ? 32 : 16); - - CompilerType my_type(valobj_sp->GetCompilerType()); - if (my_type.GetNumTemplateArguments() >= 1) - { - TemplateArgumentKind kind; - CompilerType pair_type = my_type.GetTemplateArgument(0, kind); - if (kind != eTemplateArgumentKindType && kind != eTemplateArgumentKindTemplate && kind != eTemplateArgumentKindTemplateExpansion) - return false; - m_pair_type = pair_type; - } - else - return false; - - return true; +bool LibstdcppMapIteratorSyntheticFrontEnd::Update() { + ValueObjectSP valobj_sp = m_backend.GetSP(); + if (!valobj_sp) + return false; + + TargetSP target_sp(valobj_sp->GetTargetSP()); + + if (!target_sp) + return false; + + bool is_64bit = (target_sp->GetArchitecture().GetAddressByteSize() == 8); + + if (!valobj_sp) + return false; + m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + + ValueObjectSP _M_node_sp( + valobj_sp->GetChildMemberWithName(ConstString("_M_node"), true)); + if (!_M_node_sp) + return false; + + m_pair_address = _M_node_sp->GetValueAsUnsigned(0); + if (m_pair_address == 0) + return false; + + m_pair_address += (is_64bit ? 32 : 16); + + CompilerType my_type(valobj_sp->GetCompilerType()); + if (my_type.GetNumTemplateArguments() >= 1) { + TemplateArgumentKind kind; + CompilerType pair_type = my_type.GetTemplateArgument(0, kind); + if (kind != eTemplateArgumentKindType && + kind != eTemplateArgumentKindTemplate && + kind != eTemplateArgumentKindTemplateExpansion) + return false; + m_pair_type = pair_type; + } else + return false; + + return true; } -size_t -LibstdcppMapIteratorSyntheticFrontEnd::CalculateNumChildren () -{ - return 2; +size_t LibstdcppMapIteratorSyntheticFrontEnd::CalculateNumChildren() { + return 2; } lldb::ValueObjectSP -LibstdcppMapIteratorSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (m_pair_address != 0 && m_pair_type) - { - if (!m_pair_sp) - m_pair_sp = CreateValueObjectFromAddress("pair", m_pair_address, m_exe_ctx_ref, m_pair_type); - if (m_pair_sp) - return m_pair_sp->GetChildAtIndex(idx, true); - } - return lldb::ValueObjectSP(); +LibstdcppMapIteratorSyntheticFrontEnd::GetChildAtIndex(size_t idx) { + if (m_pair_address != 0 && m_pair_type) { + if (!m_pair_sp) + m_pair_sp = CreateValueObjectFromAddress("pair", m_pair_address, + m_exe_ctx_ref, m_pair_type); + if (m_pair_sp) + return m_pair_sp->GetChildAtIndex(idx, true); + } + return lldb::ValueObjectSP(); } -bool -LibstdcppMapIteratorSyntheticFrontEnd::MightHaveChildren () -{ - return true; -} +bool LibstdcppMapIteratorSyntheticFrontEnd::MightHaveChildren() { return true; } -size_t -LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - if (name == ConstString("first")) - return 0; - if (name == ConstString("second")) - return 1; - return UINT32_MAX; +size_t LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName( + const ConstString &name) { + if (name == ConstString("first")) + return 0; + if (name == ConstString("second")) + return 1; + return UINT32_MAX; } -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return (valobj_sp ? new LibstdcppMapIteratorSyntheticFrontEnd(valobj_sp) : nullptr); +SyntheticChildrenFrontEnd * +lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return (valobj_sp ? new LibstdcppMapIteratorSyntheticFrontEnd(valobj_sp) + : nullptr); } /* (lldb) fr var ibeg --ptr-depth 1 - (__gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > >) ibeg = { + (__gnu_cxx::__normal_iterator<int *, std::vector<int, std::allocator<int> > >) + ibeg = { _M_current = 0x00000001001037a0 { *_M_current = 1 } } */ -SyntheticChildrenFrontEnd* -lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - static ConstString g_item_name; - if (!g_item_name) - g_item_name.SetCString("_M_current"); - return (valobj_sp ? new VectorIteratorSyntheticFrontEnd(valobj_sp, g_item_name) : nullptr); +SyntheticChildrenFrontEnd * +lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + static ConstString g_item_name; + if (!g_item_name) + g_item_name.SetCString("_M_current"); + return (valobj_sp + ? new VectorIteratorSyntheticFrontEnd(valobj_sp, g_item_name) + : nullptr); } -lldb_private::formatters::VectorIteratorSyntheticFrontEnd::VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp, - ConstString item_name) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_exe_ctx_ref(), - m_item_name(item_name), - m_item_sp() -{ - if (valobj_sp) - Update(); +lldb_private::formatters::VectorIteratorSyntheticFrontEnd:: + VectorIteratorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp, + ConstString item_name) + : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), + m_item_name(item_name), m_item_sp() { + if (valobj_sp) + Update(); } -bool -VectorIteratorSyntheticFrontEnd::Update() -{ - m_item_sp.reset(); - - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - - if (!valobj_sp) - return false; - - ValueObjectSP item_ptr(valobj_sp->GetChildMemberWithName(m_item_name,true)); - if (!item_ptr) - return false; - if (item_ptr->GetValueAsUnsigned(0) == 0) - return false; - Error err; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - m_item_sp = CreateValueObjectFromAddress("item", item_ptr->GetValueAsUnsigned(0), m_exe_ctx_ref, item_ptr->GetCompilerType().GetPointeeType()); - if (err.Fail()) - m_item_sp.reset(); +bool VectorIteratorSyntheticFrontEnd::Update() { + m_item_sp.reset(); + + ValueObjectSP valobj_sp = m_backend.GetSP(); + if (!valobj_sp) return false; -} -size_t -VectorIteratorSyntheticFrontEnd::CalculateNumChildren() -{ - return 1; + if (!valobj_sp) + return false; + + ValueObjectSP item_ptr(valobj_sp->GetChildMemberWithName(m_item_name, true)); + if (!item_ptr) + return false; + if (item_ptr->GetValueAsUnsigned(0) == 0) + return false; + Error err; + m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + m_item_sp = CreateValueObjectFromAddress( + "item", item_ptr->GetValueAsUnsigned(0), m_exe_ctx_ref, + item_ptr->GetCompilerType().GetPointeeType()); + if (err.Fail()) + m_item_sp.reset(); + return false; } +size_t VectorIteratorSyntheticFrontEnd::CalculateNumChildren() { return 1; } + lldb::ValueObjectSP -VectorIteratorSyntheticFrontEnd::GetChildAtIndex(size_t idx) -{ - if (idx == 0) - return m_item_sp; - return lldb::ValueObjectSP(); +VectorIteratorSyntheticFrontEnd::GetChildAtIndex(size_t idx) { + if (idx == 0) + return m_item_sp; + return lldb::ValueObjectSP(); } -bool -VectorIteratorSyntheticFrontEnd::MightHaveChildren() -{ - return true; -} +bool VectorIteratorSyntheticFrontEnd::MightHaveChildren() { return true; } -size_t -VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName(const ConstString &name) -{ - if (name == ConstString("item")) - return 0; - return UINT32_MAX; +size_t VectorIteratorSyntheticFrontEnd::GetIndexOfChildWithName( + const ConstString &name) { + if (name == ConstString("item")) + return 0; + return UINT32_MAX; } -bool -lldb_private::formatters::LibStdcppStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - const bool scalar_is_load_addr = true; - AddressType addr_type; - lldb::addr_t addr_of_string = valobj.GetAddressOf(scalar_is_load_addr, &addr_type); - if (addr_of_string != LLDB_INVALID_ADDRESS) - { - switch (addr_type) - { - case eAddressTypeLoad: - { - ProcessSP process_sp(valobj.GetProcessSP()); - if (!process_sp) - return false; - - StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); - Error error; - lldb::addr_t addr_of_data = process_sp->ReadPointerFromMemory(addr_of_string, error); - if (error.Fail() || addr_of_data == 0 || addr_of_data == LLDB_INVALID_ADDRESS) - return false; - options.SetLocation(addr_of_data); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetNeedsZeroTermination(false); - options.SetBinaryZeroIsTerminator(true); - lldb::addr_t size_of_data = process_sp->ReadPointerFromMemory(addr_of_string + process_sp->GetAddressByteSize(), error); - if (error.Fail()) - return false; - options.SetSourceSize(size_of_data); - - if (!StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF8>(options)) - { - stream.Printf("Summary Unavailable"); - return true; - } - else - return true; - } - break; - case eAddressTypeHost: - break; - case eAddressTypeInvalid: - case eAddressTypeFile: - break; - } +bool lldb_private::formatters::LibStdcppStringSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + const bool scalar_is_load_addr = true; + AddressType addr_type; + lldb::addr_t addr_of_string = + valobj.GetAddressOf(scalar_is_load_addr, &addr_type); + if (addr_of_string != LLDB_INVALID_ADDRESS) { + switch (addr_type) { + case eAddressTypeLoad: { + ProcessSP process_sp(valobj.GetProcessSP()); + if (!process_sp) + return false; + + StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); + Error error; + lldb::addr_t addr_of_data = + process_sp->ReadPointerFromMemory(addr_of_string, error); + if (error.Fail() || addr_of_data == 0 || + addr_of_data == LLDB_INVALID_ADDRESS) + return false; + options.SetLocation(addr_of_data); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetNeedsZeroTermination(false); + options.SetBinaryZeroIsTerminator(true); + lldb::addr_t size_of_data = process_sp->ReadPointerFromMemory( + addr_of_string + process_sp->GetAddressByteSize(), error); + if (error.Fail()) + return false; + options.SetSourceSize(size_of_data); + + if (!StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF8>(options)) { + stream.Printf("Summary Unavailable"); + return true; + } else + return true; + } break; + case eAddressTypeHost: + break; + case eAddressTypeInvalid: + case eAddressTypeFile: + break; } - return false; + } + return false; } -bool -lldb_private::formatters::LibStdcppWStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - const bool scalar_is_load_addr = true; - AddressType addr_type; - lldb::addr_t addr_of_string = valobj.GetAddressOf(scalar_is_load_addr, &addr_type); - if (addr_of_string != LLDB_INVALID_ADDRESS) - { - switch (addr_type) - { - case eAddressTypeLoad: - { - ProcessSP process_sp(valobj.GetProcessSP()); - if (!process_sp) - return false; - - CompilerType wchar_compiler_type = valobj.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeWChar); - - if (!wchar_compiler_type) - return false; - - const uint32_t wchar_size = wchar_compiler_type.GetBitSize(nullptr); // Safe to pass NULL for exe_scope here - - StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); - Error error; - lldb::addr_t addr_of_data = process_sp->ReadPointerFromMemory(addr_of_string, error); - if (error.Fail() || addr_of_data == 0 || addr_of_data == LLDB_INVALID_ADDRESS) - return false; - options.SetLocation(addr_of_data); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetNeedsZeroTermination(false); - options.SetBinaryZeroIsTerminator(false); - lldb::addr_t size_of_data = process_sp->ReadPointerFromMemory(addr_of_string + process_sp->GetAddressByteSize(), error); - if (error.Fail()) - return false; - options.SetSourceSize(size_of_data); - options.SetPrefixToken("L"); - - switch (wchar_size) - { - case 8: - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF8>(options); - case 16: - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF16>(options); - case 32: - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF32>(options); - default: - stream.Printf("size for wchar_t is not valid"); - return true; - } - return true; - } - break; - case eAddressTypeHost: - break; - case eAddressTypeInvalid: - case eAddressTypeFile: - break; - } +bool lldb_private::formatters::LibStdcppWStringSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + const bool scalar_is_load_addr = true; + AddressType addr_type; + lldb::addr_t addr_of_string = + valobj.GetAddressOf(scalar_is_load_addr, &addr_type); + if (addr_of_string != LLDB_INVALID_ADDRESS) { + switch (addr_type) { + case eAddressTypeLoad: { + ProcessSP process_sp(valobj.GetProcessSP()); + if (!process_sp) + return false; + + CompilerType wchar_compiler_type = + valobj.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeWChar); + + if (!wchar_compiler_type) + return false; + + const uint32_t wchar_size = wchar_compiler_type.GetBitSize( + nullptr); // Safe to pass NULL for exe_scope here + + StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); + Error error; + lldb::addr_t addr_of_data = + process_sp->ReadPointerFromMemory(addr_of_string, error); + if (error.Fail() || addr_of_data == 0 || + addr_of_data == LLDB_INVALID_ADDRESS) + return false; + options.SetLocation(addr_of_data); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetNeedsZeroTermination(false); + options.SetBinaryZeroIsTerminator(false); + lldb::addr_t size_of_data = process_sp->ReadPointerFromMemory( + addr_of_string + process_sp->GetAddressByteSize(), error); + if (error.Fail()) + return false; + options.SetSourceSize(size_of_data); + options.SetPrefixToken("L"); + + switch (wchar_size) { + case 8: + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF8>(options); + case 16: + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF16>(options); + case 32: + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF32>(options); + default: + stream.Printf("size for wchar_t is not valid"); + return true; + } + return true; + } break; + case eAddressTypeHost: + break; + case eAddressTypeInvalid: + case eAddressTypeFile: + break; } - return false; + } + return false; } -LibStdcppSharedPtrSyntheticFrontEnd::LibStdcppSharedPtrSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) - : SyntheticChildrenFrontEnd(*valobj_sp) -{ - if (valobj_sp) - Update(); +LibStdcppSharedPtrSyntheticFrontEnd::LibStdcppSharedPtrSyntheticFrontEnd( + lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp) { + if (valobj_sp) + Update(); } -size_t -LibStdcppSharedPtrSyntheticFrontEnd::CalculateNumChildren() -{ - return 1; -} +size_t LibStdcppSharedPtrSyntheticFrontEnd::CalculateNumChildren() { return 1; } lldb::ValueObjectSP -LibStdcppSharedPtrSyntheticFrontEnd::GetChildAtIndex(size_t idx) -{ - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return lldb::ValueObjectSP(); - - if (idx == 0) - return valobj_sp->GetChildMemberWithName(ConstString("_M_ptr"), true); - else - return lldb::ValueObjectSP(); -} +LibStdcppSharedPtrSyntheticFrontEnd::GetChildAtIndex(size_t idx) { + ValueObjectSP valobj_sp = m_backend.GetSP(); + if (!valobj_sp) + return lldb::ValueObjectSP(); -bool -LibStdcppSharedPtrSyntheticFrontEnd::Update() -{ - return false; + if (idx == 0) + return valobj_sp->GetChildMemberWithName(ConstString("_M_ptr"), true); + else + return lldb::ValueObjectSP(); } -bool -LibStdcppSharedPtrSyntheticFrontEnd::MightHaveChildren() -{ - return true; -} +bool LibStdcppSharedPtrSyntheticFrontEnd::Update() { return false; } + +bool LibStdcppSharedPtrSyntheticFrontEnd::MightHaveChildren() { return true; } -size_t -LibStdcppSharedPtrSyntheticFrontEnd::GetIndexOfChildWithName(const ConstString &name) -{ - if (name == ConstString("_M_ptr")) - return 0; - return UINT32_MAX; +size_t LibStdcppSharedPtrSyntheticFrontEnd::GetIndexOfChildWithName( + const ConstString &name) { + if (name == ConstString("_M_ptr")) + return 0; + return UINT32_MAX; } SyntheticChildrenFrontEnd * -lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator(CXXSyntheticChildren *, - lldb::ValueObjectSP valobj_sp) -{ - return (valobj_sp ? new LibStdcppSharedPtrSyntheticFrontEnd(valobj_sp) : nullptr); +lldb_private::formatters::LibStdcppSharedPtrSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return (valobj_sp ? new LibStdcppSharedPtrSyntheticFrontEnd(valobj_sp) + : nullptr); } -bool -lldb_private::formatters::LibStdcppSmartPointerSummaryProvider(ValueObject &valobj, Stream &stream, - const TypeSummaryOptions &options) -{ - ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue()); - if (!valobj_sp) - return false; - - ValueObjectSP ptr_sp(valobj_sp->GetChildMemberWithName(ConstString("_M_ptr"), true)); - if (!ptr_sp) - return false; +bool lldb_private::formatters::LibStdcppSmartPointerSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ValueObjectSP valobj_sp(valobj.GetNonSyntheticValue()); + if (!valobj_sp) + return false; - ValueObjectSP usecount_sp( - valobj_sp->GetChildAtNamePath({ConstString("_M_refcount"), ConstString("_M_pi"), ConstString("_M_use_count")})); - if (!usecount_sp) - return false; + ValueObjectSP ptr_sp( + valobj_sp->GetChildMemberWithName(ConstString("_M_ptr"), true)); + if (!ptr_sp) + return false; - if (ptr_sp->GetValueAsUnsigned(0) == 0 || usecount_sp->GetValueAsUnsigned(0) == 0) - { - stream.Printf("nullptr"); - return true; - } + ValueObjectSP usecount_sp(valobj_sp->GetChildAtNamePath( + {ConstString("_M_refcount"), ConstString("_M_pi"), + ConstString("_M_use_count")})); + if (!usecount_sp) + return false; - Error error; - ValueObjectSP pointee_sp = ptr_sp->Dereference(error); - if (pointee_sp && error.Success()) - { - if (pointee_sp->DumpPrintableRepresentation(stream, ValueObject::eValueObjectRepresentationStyleSummary, - lldb::eFormatInvalid, - ValueObject::ePrintableRepresentationSpecialCasesDisable, false)) - { - return true; - } + if (ptr_sp->GetValueAsUnsigned(0) == 0 || + usecount_sp->GetValueAsUnsigned(0) == 0) { + stream.Printf("nullptr"); + return true; + } + + Error error; + ValueObjectSP pointee_sp = ptr_sp->Dereference(error); + if (pointee_sp && error.Success()) { + if (pointee_sp->DumpPrintableRepresentation( + stream, ValueObject::eValueObjectRepresentationStyleSummary, + lldb::eFormatInvalid, + ValueObject::ePrintableRepresentationSpecialCasesDisable, false)) { + return true; } + } - stream.Printf("ptr = 0x%" PRIx64, ptr_sp->GetValueAsUnsigned(0)); - return true; + stream.Printf("ptr = 0x%" PRIx64, ptr_sp->GetValueAsUnsigned(0)); + return true; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h index b84c0ff831e..c6c53562691 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h +++ b/lldb/source/Plugins/Language/CPlusPlus/LibStdcpp.h @@ -1,4 +1,5 @@ -//===-- LibStdCpp.h ---------------------------------------------------*- C++ -*-===// +//===-- LibStdCpp.h ---------------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -16,23 +17,32 @@ #include "lldb/DataFormatters/TypeSynthetic.h" namespace lldb_private { - namespace formatters - { - bool - LibStdcppStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // libcstdc++ c++11 std::string - - bool - LibStdcppWStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // libcstdc++ c++11 std::wstring - - bool - LibStdcppSmartPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // libstdc++ std::shared_ptr<> and std::weak_ptr<> - - SyntheticChildrenFrontEnd* LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* LibStdcppVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* LibStdcppSharedPtrSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - } // namespace formatters +namespace formatters { +bool LibStdcppStringSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // libcstdc++ c++11 std::string + +bool LibStdcppWStringSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); // libcstdc++ c++11 std::wstring + +bool LibStdcppSmartPointerSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions + &options); // libstdc++ std::shared_ptr<> and std::weak_ptr<> + +SyntheticChildrenFrontEnd * +LibstdcppMapIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +SyntheticChildrenFrontEnd * +LibStdcppVectorIteratorSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +SyntheticChildrenFrontEnd * +LibStdcppSharedPtrSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); +} // namespace formatters } // namespace lldb_private #endif // liblldb_LibStdCpp_h_ diff --git a/lldb/source/Plugins/Language/Go/GoFormatterFunctions.cpp b/lldb/source/Plugins/Language/Go/GoFormatterFunctions.cpp index 1d7cd76b973..110fc63f782 100644 --- a/lldb/source/Plugins/Language/Go/GoFormatterFunctions.cpp +++ b/lldb/source/Plugins/Language/Go/GoFormatterFunctions.cpp @@ -21,153 +21,132 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -namespace -{ -class GoSliceSyntheticFrontEnd : public SyntheticChildrenFrontEnd -{ - public: - GoSliceSyntheticFrontEnd(ValueObject &valobj) - : SyntheticChildrenFrontEnd(valobj) - { - Update(); +namespace { +class GoSliceSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + GoSliceSyntheticFrontEnd(ValueObject &valobj) + : SyntheticChildrenFrontEnd(valobj) { + Update(); + } + + ~GoSliceSyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override { return m_len; } + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override { + if (idx < m_len) { + ValueObjectSP &cached = m_children[idx]; + if (!cached) { + StreamString idx_name; + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); + lldb::addr_t object_at_idx = m_base_data_address; + object_at_idx += idx * m_type.GetByteSize(nullptr); + cached = CreateValueObjectFromAddress( + idx_name.GetData(), object_at_idx, + m_backend.GetExecutionContextRef(), m_type); + } + return cached; } - - ~GoSliceSyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override - { - return m_len; + return ValueObjectSP(); + } + + bool Update() override { + size_t old_count = m_len; + + ConstString array_const_str("array"); + ValueObjectSP array_sp = + m_backend.GetChildMemberWithName(array_const_str, true); + if (!array_sp) { + m_children.clear(); + return old_count == 0; } - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override - { - if (idx < m_len) - { - ValueObjectSP &cached = m_children[idx]; - if (!cached) - { - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - lldb::addr_t object_at_idx = m_base_data_address; - object_at_idx += idx * m_type.GetByteSize(nullptr); - cached = CreateValueObjectFromAddress(idx_name.GetData(), object_at_idx, - m_backend.GetExecutionContextRef(), m_type); - } - return cached; - } - return ValueObjectSP(); + m_type = array_sp->GetCompilerType().GetPointeeType(); + m_base_data_address = array_sp->GetPointerValue(); + + ConstString len_const_str("len"); + ValueObjectSP len_sp = + m_backend.GetChildMemberWithName(len_const_str, true); + if (len_sp) { + m_len = len_sp->GetValueAsUnsigned(0); + m_children.clear(); } - bool - Update() override - { - size_t old_count = m_len; - - ConstString array_const_str("array"); - ValueObjectSP array_sp = m_backend.GetChildMemberWithName(array_const_str, true); - if (!array_sp) - { - m_children.clear(); - return old_count == 0; - } - m_type = array_sp->GetCompilerType().GetPointeeType(); - m_base_data_address = array_sp->GetPointerValue(); - - ConstString len_const_str("len"); - ValueObjectSP len_sp = m_backend.GetChildMemberWithName(len_const_str, true); - if (len_sp) - { - m_len = len_sp->GetValueAsUnsigned(0); - m_children.clear(); - } - - return old_count == m_len; - } + return old_count == m_len; + } - bool - MightHaveChildren() override - { - return true; - } + bool MightHaveChildren() override { return true; } - size_t - GetIndexOfChildWithName(const ConstString &name) override - { - return ExtractIndexFromString(name.AsCString()); - } + size_t GetIndexOfChildWithName(const ConstString &name) override { + return ExtractIndexFromString(name.AsCString()); + } - private: - CompilerType m_type; - lldb::addr_t m_base_data_address; - size_t m_len; - std::map<size_t, lldb::ValueObjectSP> m_children; +private: + CompilerType m_type; + lldb::addr_t m_base_data_address; + size_t m_len; + std::map<size_t, lldb::ValueObjectSP> m_children; }; } // anonymous namespace -bool -lldb_private::formatters::GoStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &opts) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - if (valobj.IsPointerType()) - { - Error err; - ValueObjectSP deref = valobj.Dereference(err); - if (!err.Success()) - return false; - return GoStringSummaryProvider(*deref, stream, opts); - } - - ConstString str_name("str"); - ConstString len_name("len"); - - ValueObjectSP data_sp = valobj.GetChildMemberWithName(str_name, true); - ValueObjectSP len_sp = valobj.GetChildMemberWithName(len_name, true); - if (!data_sp || !len_sp) - return false; - bool success; - lldb::addr_t valobj_addr = data_sp->GetValueAsUnsigned(0, &success); - - if (!success) - return false; - - uint64_t length = len_sp->GetValueAsUnsigned(0); - if (length == 0) - { - stream.Printf("\"\""); - return true; - } - - StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(valobj_addr); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetSourceSize(length); - options.SetNeedsZeroTermination(false); - options.SetLanguage(eLanguageTypeGo); - - if (!StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF8>(options)) - { - stream.Printf("Summary Unavailable"); - return true; - } - +bool lldb_private::formatters::GoStringSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &opts) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + if (valobj.IsPointerType()) { + Error err; + ValueObjectSP deref = valobj.Dereference(err); + if (!err.Success()) + return false; + return GoStringSummaryProvider(*deref, stream, opts); + } + + ConstString str_name("str"); + ConstString len_name("len"); + + ValueObjectSP data_sp = valobj.GetChildMemberWithName(str_name, true); + ValueObjectSP len_sp = valobj.GetChildMemberWithName(len_name, true); + if (!data_sp || !len_sp) + return false; + bool success; + lldb::addr_t valobj_addr = data_sp->GetValueAsUnsigned(0, &success); + + if (!success) + return false; + + uint64_t length = len_sp->GetValueAsUnsigned(0); + if (length == 0) { + stream.Printf("\"\""); return true; + } + + StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); + options.SetLocation(valobj_addr); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetSourceSize(length); + options.SetNeedsZeroTermination(false); + options.SetLanguage(eLanguageTypeGo); + + if (!StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF8>(options)) { + stream.Printf("Summary Unavailable"); + return true; + } + + return true; } SyntheticChildrenFrontEnd * -lldb_private::formatters::GoSliceSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return nullptr; - - lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); - if (!process_sp) - return nullptr; - return new GoSliceSyntheticFrontEnd(*valobj_sp); +lldb_private::formatters::GoSliceSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + if (!valobj_sp) + return nullptr; + + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) + return nullptr; + return new GoSliceSyntheticFrontEnd(*valobj_sp); } diff --git a/lldb/source/Plugins/Language/Go/GoFormatterFunctions.h b/lldb/source/Plugins/Language/Go/GoFormatterFunctions.h index ae1eda0f0c5..596eb2ae71f 100644 --- a/lldb/source/Plugins/Language/Go/GoFormatterFunctions.h +++ b/lldb/source/Plugins/Language/Go/GoFormatterFunctions.h @@ -28,14 +28,14 @@ #include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/Target.h" -namespace lldb_private -{ -namespace formatters -{ +namespace lldb_private { +namespace formatters { -bool GoStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); +bool GoStringSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); -SyntheticChildrenFrontEnd *GoSliceSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP); +SyntheticChildrenFrontEnd * +GoSliceSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP); } // namespace formatters } // namespace lldb_private diff --git a/lldb/source/Plugins/Language/Go/GoLanguage.cpp b/lldb/source/Plugins/Language/Go/GoLanguage.cpp index ed010ffa4b2..85c41d1fe91 100644 --- a/lldb/source/Plugins/Language/Go/GoLanguage.cpp +++ b/lldb/source/Plugins/Language/Go/GoLanguage.cpp @@ -18,129 +18,109 @@ // Project includes #include "GoLanguage.h" +#include "Plugins/Language/Go/GoFormatterFunctions.h" #include "lldb/Core/ConstString.h" #include "lldb/Core/PluginManager.h" #include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/Symbol/GoASTContext.h" -#include "Plugins/Language/Go/GoFormatterFunctions.h" using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -void -GoLanguage::Initialize() -{ - PluginManager::RegisterPlugin(GetPluginNameStatic(), "Go Language", CreateInstance); +void GoLanguage::Initialize() { + PluginManager::RegisterPlugin(GetPluginNameStatic(), "Go Language", + CreateInstance); } -void -GoLanguage::Terminate() -{ - PluginManager::UnregisterPlugin(CreateInstance); +void GoLanguage::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); } -lldb_private::ConstString -GoLanguage::GetPluginNameStatic() -{ - static ConstString g_name("Go"); - return g_name; +lldb_private::ConstString GoLanguage::GetPluginNameStatic() { + static ConstString g_name("Go"); + return g_name; } //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ -lldb_private::ConstString -GoLanguage::GetPluginName() -{ - return GetPluginNameStatic(); +lldb_private::ConstString GoLanguage::GetPluginName() { + return GetPluginNameStatic(); } -uint32_t -GoLanguage::GetPluginVersion() -{ - return 1; -} +uint32_t GoLanguage::GetPluginVersion() { return 1; } //------------------------------------------------------------------ // Static Functions //------------------------------------------------------------------ -Language * -GoLanguage::CreateInstance(lldb::LanguageType language) -{ - if (language == eLanguageTypeGo) - return new GoLanguage(); - return nullptr; +Language *GoLanguage::CreateInstance(lldb::LanguageType language) { + if (language == eLanguageTypeGo) + return new GoLanguage(); + return nullptr; } HardcodedFormatters::HardcodedSummaryFinder -GoLanguage::GetHardcodedSummaries() -{ - static std::once_flag g_initialize; - static HardcodedFormatters::HardcodedSummaryFinder g_formatters; +GoLanguage::GetHardcodedSummaries() { + static std::once_flag g_initialize; + static HardcodedFormatters::HardcodedSummaryFinder g_formatters; - std::call_once(g_initialize, []() -> void - { - g_formatters.push_back( - [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, - FormatManager &) -> TypeSummaryImpl::SharedPointer - { - static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat( - TypeSummaryImpl::Flags().SetDontShowChildren(true), - lldb_private::formatters::GoStringSummaryProvider, "Go string summary provider")); - if (GoASTContext::IsGoString(valobj.GetCompilerType())) - { - return formatter_sp; - } - if (GoASTContext::IsGoString(valobj.GetCompilerType().GetPointeeType())) - { - return formatter_sp; - } - return nullptr; - }); - g_formatters.push_back( - [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, - FormatManager &) -> TypeSummaryImpl::SharedPointer - { - static lldb::TypeSummaryImplSP formatter_sp( - new StringSummaryFormat(TypeSummaryImpl::Flags().SetHideItemNames(true), - "(len ${var.len}, cap ${var.cap})")); - if (GoASTContext::IsGoSlice(valobj.GetCompilerType())) - { - return formatter_sp; - } - if (GoASTContext::IsGoSlice(valobj.GetCompilerType().GetPointeeType())) - { - return formatter_sp; - } - return nullptr; - }); - }); - return g_formatters; + std::call_once(g_initialize, []() -> void { + g_formatters.push_back( + [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, + FormatManager &) -> TypeSummaryImpl::SharedPointer { + static CXXFunctionSummaryFormat::SharedPointer formatter_sp( + new CXXFunctionSummaryFormat( + TypeSummaryImpl::Flags().SetDontShowChildren(true), + lldb_private::formatters::GoStringSummaryProvider, + "Go string summary provider")); + if (GoASTContext::IsGoString(valobj.GetCompilerType())) { + return formatter_sp; + } + if (GoASTContext::IsGoString( + valobj.GetCompilerType().GetPointeeType())) { + return formatter_sp; + } + return nullptr; + }); + g_formatters.push_back( + [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, + FormatManager &) -> TypeSummaryImpl::SharedPointer { + static lldb::TypeSummaryImplSP formatter_sp(new StringSummaryFormat( + TypeSummaryImpl::Flags().SetHideItemNames(true), + "(len ${var.len}, cap ${var.cap})")); + if (GoASTContext::IsGoSlice(valobj.GetCompilerType())) { + return formatter_sp; + } + if (GoASTContext::IsGoSlice( + valobj.GetCompilerType().GetPointeeType())) { + return formatter_sp; + } + return nullptr; + }); + }); + return g_formatters; } HardcodedFormatters::HardcodedSyntheticFinder -GoLanguage::GetHardcodedSynthetics() -{ - static std::once_flag g_initialize; - static HardcodedFormatters::HardcodedSyntheticFinder g_formatters; +GoLanguage::GetHardcodedSynthetics() { + static std::once_flag g_initialize; + static HardcodedFormatters::HardcodedSyntheticFinder g_formatters; - std::call_once(g_initialize, []() -> void - { - g_formatters.push_back( - [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, - FormatManager &fmt_mgr) -> SyntheticChildren::SharedPointer - { - static CXXSyntheticChildren::SharedPointer formatter_sp( - new CXXSyntheticChildren(SyntheticChildren::Flags(), "slice synthetic children", - lldb_private::formatters::GoSliceSyntheticFrontEndCreator)); - if (GoASTContext::IsGoSlice(valobj.GetCompilerType())) - { - return formatter_sp; - } - return nullptr; - }); - }); + std::call_once(g_initialize, []() -> void { + g_formatters.push_back( + [](lldb_private::ValueObject &valobj, lldb::DynamicValueType, + FormatManager &fmt_mgr) -> SyntheticChildren::SharedPointer { + static CXXSyntheticChildren::SharedPointer formatter_sp( + new CXXSyntheticChildren( + SyntheticChildren::Flags(), "slice synthetic children", + lldb_private::formatters::GoSliceSyntheticFrontEndCreator)); + if (GoASTContext::IsGoSlice(valobj.GetCompilerType())) { + return formatter_sp; + } + return nullptr; + }); + }); - return g_formatters; + return g_formatters; } diff --git a/lldb/source/Plugins/Language/Go/GoLanguage.h b/lldb/source/Plugins/Language/Go/GoLanguage.h index 67dd04c2a22..4dc8ed0745c 100644 --- a/lldb/source/Plugins/Language/Go/GoLanguage.h +++ b/lldb/source/Plugins/Language/Go/GoLanguage.h @@ -18,47 +18,44 @@ #include "llvm/ADT/StringRef.h" // Project includes -#include "lldb/lldb-private.h" #include "lldb/Core/ConstString.h" #include "lldb/Target/Language.h" +#include "lldb/lldb-private.h" -namespace lldb_private -{ +namespace lldb_private { -class GoLanguage : public Language -{ - public: - GoLanguage() = default; +class GoLanguage : public Language { +public: + GoLanguage() = default; - ~GoLanguage() override = default; + ~GoLanguage() override = default; - lldb::LanguageType - GetLanguageType() const override - { - return lldb::eLanguageTypeGo; - } + lldb::LanguageType GetLanguageType() const override { + return lldb::eLanguageTypeGo; + } - HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override; + HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries() override; - HardcodedFormatters::HardcodedSyntheticFinder GetHardcodedSynthetics() override; + HardcodedFormatters::HardcodedSyntheticFinder + GetHardcodedSynthetics() override; - //------------------------------------------------------------------ - // Static Functions - //------------------------------------------------------------------ - static void Initialize(); + //------------------------------------------------------------------ + // Static Functions + //------------------------------------------------------------------ + static void Initialize(); - static void Terminate(); + static void Terminate(); - static lldb_private::Language *CreateInstance(lldb::LanguageType language); + static lldb_private::Language *CreateInstance(lldb::LanguageType language); - static lldb_private::ConstString GetPluginNameStatic(); + static lldb_private::ConstString GetPluginNameStatic(); - //------------------------------------------------------------------ - // PluginInterface protocol - //------------------------------------------------------------------ - ConstString GetPluginName() override; + //------------------------------------------------------------------ + // PluginInterface protocol + //------------------------------------------------------------------ + ConstString GetPluginName() override; - uint32_t GetPluginVersion() override; + uint32_t GetPluginVersion() override; }; } // namespace lldb_private diff --git a/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.cpp b/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.cpp index 29e6ad0ee89..8ee8ef508af 100644 --- a/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.cpp +++ b/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.cpp @@ -20,167 +20,148 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -namespace -{ +namespace { -class JavaArraySyntheticFrontEnd : public SyntheticChildrenFrontEnd -{ +class JavaArraySyntheticFrontEnd : public SyntheticChildrenFrontEnd { public: - JavaArraySyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp) - { - if (valobj_sp) - Update(); - } - - size_t - CalculateNumChildren() override - { - ValueObjectSP valobj = GetDereferencedValueObject(); - if (!valobj) - return 0; - - CompilerType type = valobj->GetCompilerType(); - uint32_t size = JavaASTContext::CalculateArraySize(type, *valobj); - if (size == UINT32_MAX) - return 0; - return size; - } - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override - { - ValueObjectSP valobj = GetDereferencedValueObject(); - if (!valobj) - return nullptr; - - ProcessSP process_sp = valobj->GetProcessSP(); - if (!process_sp) - return nullptr; - - CompilerType type = valobj->GetCompilerType(); - CompilerType element_type = type.GetArrayElementType(); - lldb::addr_t address = valobj->GetAddressOf() + JavaASTContext::CalculateArrayElementOffset(type, idx); - - Error error; - size_t byte_size = element_type.GetByteSize(nullptr); - DataBufferSP buffer_sp(new DataBufferHeap(byte_size, 0)); - size_t bytes_read = process_sp->ReadMemory(address, buffer_sp->GetBytes(), byte_size, error); - if (error.Fail() || byte_size != bytes_read) - return nullptr; - - StreamString name; - name.Printf("[%" PRIu64 "]", (uint64_t)idx); - DataExtractor data(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize()); - return CreateValueObjectFromData(name.GetData(), data, valobj->GetExecutionContextRef(), - element_type); - } - - bool - Update() override - { - return false; - } - - bool - MightHaveChildren() override - { - return true; - } - - size_t - GetIndexOfChildWithName(const ConstString &name) override - { - return ExtractIndexFromString(name.GetCString()); - } + JavaArraySyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp) { + if (valobj_sp) + Update(); + } + + size_t CalculateNumChildren() override { + ValueObjectSP valobj = GetDereferencedValueObject(); + if (!valobj) + return 0; + + CompilerType type = valobj->GetCompilerType(); + uint32_t size = JavaASTContext::CalculateArraySize(type, *valobj); + if (size == UINT32_MAX) + return 0; + return size; + } + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override { + ValueObjectSP valobj = GetDereferencedValueObject(); + if (!valobj) + return nullptr; + + ProcessSP process_sp = valobj->GetProcessSP(); + if (!process_sp) + return nullptr; + + CompilerType type = valobj->GetCompilerType(); + CompilerType element_type = type.GetArrayElementType(); + lldb::addr_t address = + valobj->GetAddressOf() + + JavaASTContext::CalculateArrayElementOffset(type, idx); + + Error error; + size_t byte_size = element_type.GetByteSize(nullptr); + DataBufferSP buffer_sp(new DataBufferHeap(byte_size, 0)); + size_t bytes_read = process_sp->ReadMemory(address, buffer_sp->GetBytes(), + byte_size, error); + if (error.Fail() || byte_size != bytes_read) + return nullptr; + + StreamString name; + name.Printf("[%" PRIu64 "]", (uint64_t)idx); + DataExtractor data(buffer_sp, process_sp->GetByteOrder(), + process_sp->GetAddressByteSize()); + return CreateValueObjectFromData( + name.GetData(), data, valobj->GetExecutionContextRef(), element_type); + } + + bool Update() override { return false; } + + bool MightHaveChildren() override { return true; } + + size_t GetIndexOfChildWithName(const ConstString &name) override { + return ExtractIndexFromString(name.GetCString()); + } private: - ValueObjectSP - GetDereferencedValueObject() - { - if (!m_backend.IsPointerOrReferenceType()) - return m_backend.GetSP(); - - Error error; - return m_backend.Dereference(error); - } + ValueObjectSP GetDereferencedValueObject() { + if (!m_backend.IsPointerOrReferenceType()) + return m_backend.GetSP(); + + Error error; + return m_backend.Dereference(error); + } }; } // end of anonymous namespace -bool -lldb_private::formatters::JavaStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &opts) -{ - if (valobj.IsPointerOrReferenceType()) - { - Error error; - ValueObjectSP deref = valobj.Dereference(error); - if (error.Fail()) - return false; - return JavaStringSummaryProvider(*deref, stream, opts); - } - - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ConstString data_name("value"); - ConstString length_name("count"); - - ValueObjectSP length_sp = valobj.GetChildMemberWithName(length_name, true); - ValueObjectSP data_sp = valobj.GetChildMemberWithName(data_name, true); - if (!data_sp || !length_sp) - return false; - - bool success = false; - uint64_t length = length_sp->GetValueAsUnsigned(0, &success); - if (!success) - return false; - - if (length == 0) - { - stream.Printf("\"\""); - return true; - } - lldb::addr_t valobj_addr = data_sp->GetAddressOf(); - - StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); - options.SetLocation(valobj_addr); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetSourceSize(length); - options.SetNeedsZeroTermination(false); - options.SetLanguage(eLanguageTypeJava); - - if (StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF16>(options)) - return true; - - stream.Printf("Summary Unavailable"); +bool lldb_private::formatters::JavaStringSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &opts) { + if (valobj.IsPointerOrReferenceType()) { + Error error; + ValueObjectSP deref = valobj.Dereference(error); + if (error.Fail()) + return false; + return JavaStringSummaryProvider(*deref, stream, opts); + } + + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ConstString data_name("value"); + ConstString length_name("count"); + + ValueObjectSP length_sp = valobj.GetChildMemberWithName(length_name, true); + ValueObjectSP data_sp = valobj.GetChildMemberWithName(data_name, true); + if (!data_sp || !length_sp) + return false; + + bool success = false; + uint64_t length = length_sp->GetValueAsUnsigned(0, &success); + if (!success) + return false; + + if (length == 0) { + stream.Printf("\"\""); + return true; + } + lldb::addr_t valobj_addr = data_sp->GetAddressOf(); + + StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); + options.SetLocation(valobj_addr); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetSourceSize(length); + options.SetNeedsZeroTermination(false); + options.SetLanguage(eLanguageTypeJava); + + if (StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF16>(options)) return true; + + stream.Printf("Summary Unavailable"); + return true; } -bool -lldb_private::formatters::JavaArraySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) -{ - if (valobj.IsPointerOrReferenceType()) - { - Error error; - ValueObjectSP deref = valobj.Dereference(error); - if (error.Fail()) - return false; - return JavaArraySummaryProvider(*deref, stream, options); - } - - CompilerType type = valobj.GetCompilerType(); - uint32_t size = JavaASTContext::CalculateArraySize(type, valobj); - if (size == UINT32_MAX) - return false; - stream.Printf("[%u]{...}", size); - return true; +bool lldb_private::formatters::JavaArraySummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + if (valobj.IsPointerOrReferenceType()) { + Error error; + ValueObjectSP deref = valobj.Dereference(error); + if (error.Fail()) + return false; + return JavaArraySummaryProvider(*deref, stream, options); + } + + CompilerType type = valobj.GetCompilerType(); + uint32_t size = JavaASTContext::CalculateArraySize(type, valobj); + if (size == UINT32_MAX) + return false; + stream.Printf("[%u]{...}", size); + return true; } -SyntheticChildrenFrontEnd* -lldb_private::formatters::JavaArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return valobj_sp ? new JavaArraySyntheticFrontEnd(valobj_sp) : nullptr; +SyntheticChildrenFrontEnd * +lldb_private::formatters::JavaArraySyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return valobj_sp ? new JavaArraySyntheticFrontEnd(valobj_sp) : nullptr; } diff --git a/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.h b/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.h index f9588c5590a..d1983429529 100644 --- a/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.h +++ b/lldb/source/Plugins/Language/Java/JavaFormatterFunctions.h @@ -16,19 +16,18 @@ // Project includes #include "lldb/lldb-forward.h" -namespace lldb_private -{ -namespace formatters -{ +namespace lldb_private { +namespace formatters { -bool -JavaStringSummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); +bool JavaStringSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); -bool -JavaArraySummaryProvider(ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); +bool JavaArraySummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); -SyntheticChildrenFrontEnd* -JavaArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp); +SyntheticChildrenFrontEnd * +JavaArraySyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP valobj_sp); } // namespace formatters } // namespace lldb_private diff --git a/lldb/source/Plugins/Language/Java/JavaLanguage.cpp b/lldb/source/Plugins/Language/Java/JavaLanguage.cpp index a4f883f6882..77121c8823e 100644 --- a/lldb/source/Plugins/Language/Java/JavaLanguage.cpp +++ b/lldb/source/Plugins/Language/Java/JavaLanguage.cpp @@ -29,84 +29,72 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -void -JavaLanguage::Initialize() -{ - PluginManager::RegisterPlugin(GetPluginNameStatic(), "Java Language", CreateInstance); +void JavaLanguage::Initialize() { + PluginManager::RegisterPlugin(GetPluginNameStatic(), "Java Language", + CreateInstance); } -void -JavaLanguage::Terminate() -{ - PluginManager::UnregisterPlugin(CreateInstance); +void JavaLanguage::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); } -lldb_private::ConstString -JavaLanguage::GetPluginNameStatic() -{ - static ConstString g_name("Java"); - return g_name; +lldb_private::ConstString JavaLanguage::GetPluginNameStatic() { + static ConstString g_name("Java"); + return g_name; } -lldb_private::ConstString -JavaLanguage::GetPluginName() -{ - return GetPluginNameStatic(); +lldb_private::ConstString JavaLanguage::GetPluginName() { + return GetPluginNameStatic(); } -uint32_t -JavaLanguage::GetPluginVersion() -{ - return 1; -} +uint32_t JavaLanguage::GetPluginVersion() { return 1; } -Language * -JavaLanguage::CreateInstance(lldb::LanguageType language) -{ - if (language == eLanguageTypeJava) - return new JavaLanguage(); - return nullptr; +Language *JavaLanguage::CreateInstance(lldb::LanguageType language) { + if (language == eLanguageTypeJava) + return new JavaLanguage(); + return nullptr; } -bool -JavaLanguage::IsNilReference(ValueObject &valobj) -{ - if (!valobj.GetCompilerType().IsReferenceType()) - return false; +bool JavaLanguage::IsNilReference(ValueObject &valobj) { + if (!valobj.GetCompilerType().IsReferenceType()) + return false; - // If we failed to read the value then it is not a nil reference. - return valobj.GetValueAsUnsigned(UINT64_MAX) == 0; + // If we failed to read the value then it is not a nil reference. + return valobj.GetValueAsUnsigned(UINT64_MAX) == 0; } -lldb::TypeCategoryImplSP -JavaLanguage::GetFormatters() -{ - static std::once_flag g_initialize; - static TypeCategoryImplSP g_category; - - std::call_once(g_initialize, [this]() -> void { - DataVisualization::Categories::GetCategory(GetPluginName(), g_category); - if (g_category) - { - const char* array_regexp = "^.*\\[\\]&?$"; - - lldb::TypeSummaryImplSP string_summary_sp(new CXXFunctionSummaryFormat( - TypeSummaryImpl::Flags().SetDontShowChildren(true), lldb_private::formatters::JavaStringSummaryProvider, - "java.lang.String summary provider")); - g_category->GetTypeSummariesContainer()->Add(ConstString("java::lang::String"), string_summary_sp); - - lldb::TypeSummaryImplSP array_summary_sp(new CXXFunctionSummaryFormat( - TypeSummaryImpl::Flags().SetDontShowChildren(true), lldb_private::formatters::JavaArraySummaryProvider, - "Java array summary provider")); - g_category->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(array_regexp)), - array_summary_sp); +lldb::TypeCategoryImplSP JavaLanguage::GetFormatters() { + static std::once_flag g_initialize; + static TypeCategoryImplSP g_category; + + std::call_once(g_initialize, [this]() -> void { + DataVisualization::Categories::GetCategory(GetPluginName(), g_category); + if (g_category) { + const char *array_regexp = "^.*\\[\\]&?$"; + + lldb::TypeSummaryImplSP string_summary_sp(new CXXFunctionSummaryFormat( + TypeSummaryImpl::Flags().SetDontShowChildren(true), + lldb_private::formatters::JavaStringSummaryProvider, + "java.lang.String summary provider")); + g_category->GetTypeSummariesContainer()->Add( + ConstString("java::lang::String"), string_summary_sp); + + lldb::TypeSummaryImplSP array_summary_sp(new CXXFunctionSummaryFormat( + TypeSummaryImpl::Flags().SetDontShowChildren(true), + lldb_private::formatters::JavaArraySummaryProvider, + "Java array summary provider")); + g_category->GetRegexTypeSummariesContainer()->Add( + RegularExpressionSP(new RegularExpression(array_regexp)), + array_summary_sp); #ifndef LLDB_DISABLE_PYTHON - AddCXXSynthetic(g_category, lldb_private::formatters::JavaArraySyntheticFrontEndCreator, - "Java array synthetic children", ConstString(array_regexp), - SyntheticChildren::Flags().SetCascades(true), true); + AddCXXSynthetic( + g_category, + lldb_private::formatters::JavaArraySyntheticFrontEndCreator, + "Java array synthetic children", ConstString(array_regexp), + SyntheticChildren::Flags().SetCascades(true), true); #endif - } - }); - return g_category; + } + }); + return g_category; } diff --git a/lldb/source/Plugins/Language/Java/JavaLanguage.h b/lldb/source/Plugins/Language/Java/JavaLanguage.h index 164facd27ab..6cf27ab5ffa 100644 --- a/lldb/source/Plugins/Language/Java/JavaLanguage.h +++ b/lldb/source/Plugins/Language/Java/JavaLanguage.h @@ -22,41 +22,29 @@ #include "lldb/Target/Language.h" #include "lldb/lldb-private.h" -namespace lldb_private -{ +namespace lldb_private { -class JavaLanguage : public Language -{ +class JavaLanguage : public Language { public: - lldb::LanguageType - GetLanguageType() const override - { - return lldb::eLanguageTypeJava; - } + lldb::LanguageType GetLanguageType() const override { + return lldb::eLanguageTypeJava; + } - static void - Initialize(); + static void Initialize(); - static void - Terminate(); + static void Terminate(); - static lldb_private::Language * - CreateInstance(lldb::LanguageType language); + static lldb_private::Language *CreateInstance(lldb::LanguageType language); - static lldb_private::ConstString - GetPluginNameStatic(); + static lldb_private::ConstString GetPluginNameStatic(); - ConstString - GetPluginName() override; + ConstString GetPluginName() override; - uint32_t - GetPluginVersion() override; + uint32_t GetPluginVersion() override; - bool - IsNilReference(ValueObject &valobj) override; + bool IsNilReference(ValueObject &valobj) override; - lldb::TypeCategoryImplSP - GetFormatters() override; + lldb::TypeCategoryImplSP GetFormatters() override; }; } // namespace lldb_private diff --git a/lldb/source/Plugins/Language/OCaml/OCamlLanguage.cpp b/lldb/source/Plugins/Language/OCaml/OCamlLanguage.cpp index abc6c8b53d7..ef9f2b56792 100644 --- a/lldb/source/Plugins/Language/OCaml/OCamlLanguage.cpp +++ b/lldb/source/Plugins/Language/OCaml/OCamlLanguage.cpp @@ -1,4 +1,5 @@ -//===-- OCamlLanguage.cpp ----------------------------------------*- C++ -*-===// +//===-- OCamlLanguage.cpp ----------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -27,52 +28,36 @@ using namespace lldb; using namespace lldb_private; -void -OCamlLanguage::Initialize() -{ - PluginManager::RegisterPlugin(GetPluginNameStatic(), "OCaml Language", CreateInstance); +void OCamlLanguage::Initialize() { + PluginManager::RegisterPlugin(GetPluginNameStatic(), "OCaml Language", + CreateInstance); } -void -OCamlLanguage::Terminate() -{ - PluginManager::UnregisterPlugin(CreateInstance); +void OCamlLanguage::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); } -lldb_private::ConstString -OCamlLanguage::GetPluginNameStatic() -{ - static ConstString g_name("OCaml"); - return g_name; +lldb_private::ConstString OCamlLanguage::GetPluginNameStatic() { + static ConstString g_name("OCaml"); + return g_name; } -lldb_private::ConstString -OCamlLanguage::GetPluginName() -{ - return GetPluginNameStatic(); +lldb_private::ConstString OCamlLanguage::GetPluginName() { + return GetPluginNameStatic(); } -uint32_t -OCamlLanguage::GetPluginVersion() -{ - return 1; -} +uint32_t OCamlLanguage::GetPluginVersion() { return 1; } -Language * -OCamlLanguage::CreateInstance(lldb::LanguageType language) -{ - if (language == eLanguageTypeOCaml) - return new OCamlLanguage(); - return nullptr; +Language *OCamlLanguage::CreateInstance(lldb::LanguageType language) { + if (language == eLanguageTypeOCaml) + return new OCamlLanguage(); + return nullptr; } -bool -OCamlLanguage::IsNilReference(ValueObject &valobj) -{ - if (!valobj.GetCompilerType().IsReferenceType()) - return false; +bool OCamlLanguage::IsNilReference(ValueObject &valobj) { + if (!valobj.GetCompilerType().IsReferenceType()) + return false; - // If we failed to read the value then it is not a nil reference. - return valobj.GetValueAsUnsigned(UINT64_MAX) == 0; + // If we failed to read the value then it is not a nil reference. + return valobj.GetValueAsUnsigned(UINT64_MAX) == 0; } - diff --git a/lldb/source/Plugins/Language/OCaml/OCamlLanguage.h b/lldb/source/Plugins/Language/OCaml/OCamlLanguage.h index 33e3761e59a..f7dc6398eaf 100644 --- a/lldb/source/Plugins/Language/OCaml/OCamlLanguage.h +++ b/lldb/source/Plugins/Language/OCaml/OCamlLanguage.h @@ -1,4 +1,5 @@ -//===-- OCamlLanguage.h ------------------------------------------*- C++ -*-===// +//===-- OCamlLanguage.h ------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -22,38 +23,27 @@ #include "lldb/Target/Language.h" #include "lldb/lldb-private.h" -namespace lldb_private -{ +namespace lldb_private { -class OCamlLanguage : public Language -{ +class OCamlLanguage : public Language { public: - lldb::LanguageType - GetLanguageType() const override - { - return lldb::eLanguageTypeOCaml; - } + lldb::LanguageType GetLanguageType() const override { + return lldb::eLanguageTypeOCaml; + } - static void - Initialize(); + static void Initialize(); - static void - Terminate(); + static void Terminate(); - static lldb_private::Language * - CreateInstance(lldb::LanguageType language); + static lldb_private::Language *CreateInstance(lldb::LanguageType language); - static lldb_private::ConstString - GetPluginNameStatic(); + static lldb_private::ConstString GetPluginNameStatic(); - ConstString - GetPluginName() override; + ConstString GetPluginName() override; - uint32_t - GetPluginVersion() override; + uint32_t GetPluginVersion() override; - bool - IsNilReference(ValueObject &valobj) override; + bool IsNilReference(ValueObject &valobj) override; }; } // namespace lldb_private diff --git a/lldb/source/Plugins/Language/ObjC/CF.cpp b/lldb/source/Plugins/Language/ObjC/CF.cpp index 617bb613aa0..f67db465f72 100644 --- a/lldb/source/Plugins/Language/ObjC/CF.cpp +++ b/lldb/source/Plugins/Language/ObjC/CF.cpp @@ -1,4 +1,5 @@ -//===-- CF.cpp ----------------------------------------------------*- C++ -*-===// +//===-- CF.cpp ----------------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -26,293 +27,277 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -bool -lldb_private::formatters::CFAbsoluteTimeSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - time_t epoch = GetOSXEpoch(); - epoch = epoch + (time_t)valobj.GetValueAsUnsigned(0); - tm *tm_date = localtime(&epoch); - if (!tm_date) - return false; - std::string buffer(1024,0); - if (strftime (&buffer[0], 1023, "%Z", tm_date) == 0) - return false; - stream.Printf("%04d-%02d-%02d %02d:%02d:%02d %s", tm_date->tm_year+1900, tm_date->tm_mon+1, tm_date->tm_mday, tm_date->tm_hour, tm_date->tm_min, tm_date->tm_sec, buffer.c_str()); - return true; +bool lldb_private::formatters::CFAbsoluteTimeSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + time_t epoch = GetOSXEpoch(); + epoch = epoch + (time_t)valobj.GetValueAsUnsigned(0); + tm *tm_date = localtime(&epoch); + if (!tm_date) + return false; + std::string buffer(1024, 0); + if (strftime(&buffer[0], 1023, "%Z", tm_date) == 0) + return false; + stream.Printf("%04d-%02d-%02d %02d:%02d:%02d %s", tm_date->tm_year + 1900, + tm_date->tm_mon + 1, tm_date->tm_mday, tm_date->tm_hour, + tm_date->tm_min, tm_date->tm_sec, buffer.c_str()); + return true; } -bool -lldb_private::formatters::CFBagSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - static ConstString g_TypeHint("CFBag"); - - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint32_t count = 0; - - bool is_type_ok = false; // check to see if this is a CFBag we know about - if (descriptor->IsCFType()) - { - ConstString type_name(valobj.GetTypeName()); - - static ConstString g___CFBag("__CFBag"); - static ConstString g_conststruct__CFBag("const struct __CFBag"); - - if (type_name == g___CFBag || - type_name == g_conststruct__CFBag) - { - if (valobj.IsPointerType()) - is_type_ok = true; - } - } - - if (is_type_ok) - { - lldb::addr_t offset = 2*ptr_size+4 + valobj_addr; - Error error; - count = process_sp->ReadUnsignedIntegerFromMemory(offset, 4, 0, error); - if (error.Fail()) - return false; +bool lldb_private::formatters::CFBagSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + static ConstString g_TypeHint("CFBag"); + + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor.get() || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + uint32_t count = 0; + + bool is_type_ok = false; // check to see if this is a CFBag we know about + if (descriptor->IsCFType()) { + ConstString type_name(valobj.GetTypeName()); + + static ConstString g___CFBag("__CFBag"); + static ConstString g_conststruct__CFBag("const struct __CFBag"); + + if (type_name == g___CFBag || type_name == g_conststruct__CFBag) { + if (valobj.IsPointerType()) + is_type_ok = true; } - else - return false; - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(options.GetLanguage())) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } + } + + if (is_type_ok) { + lldb::addr_t offset = 2 * ptr_size + 4 + valobj_addr; + Error error; + count = process_sp->ReadUnsignedIntegerFromMemory(offset, 4, 0, error); + if (error.Fail()) + return false; + } else + return false; + + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(options.GetLanguage())) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } - - stream.Printf("%s\"%u value%s\"%s", - prefix.c_str(), - count,(count == 1 ? "" : "s"), - suffix.c_str()); - return true; + } + + stream.Printf("%s\"%u value%s\"%s", prefix.c_str(), count, + (count == 1 ? "" : "s"), suffix.c_str()); + return true; } -bool -lldb_private::formatters::CFBitVectorSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint32_t count = 0; - - bool is_type_ok = false; // check to see if this is a CFBag we know about - if (descriptor->IsCFType()) - { - ConstString type_name(valobj.GetTypeName()); - if (type_name == ConstString("__CFMutableBitVector") || type_name == ConstString("__CFBitVector") || type_name == ConstString("CFMutableBitVectorRef") || type_name == ConstString("CFBitVectorRef")) - { - if (valobj.IsPointerType()) - is_type_ok = true; - } +bool lldb_private::formatters::CFBitVectorSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor.get() || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + uint32_t count = 0; + + bool is_type_ok = false; // check to see if this is a CFBag we know about + if (descriptor->IsCFType()) { + ConstString type_name(valobj.GetTypeName()); + if (type_name == ConstString("__CFMutableBitVector") || + type_name == ConstString("__CFBitVector") || + type_name == ConstString("CFMutableBitVectorRef") || + type_name == ConstString("CFBitVectorRef")) { + if (valobj.IsPointerType()) + is_type_ok = true; } - - if (is_type_ok == false) - return false; - - Error error; - count = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+2*ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - uint64_t num_bytes = count / 8 + ((count & 7) ? 1 : 0); - addr_t data_ptr = process_sp->ReadPointerFromMemory(valobj_addr+2*ptr_size+2*ptr_size, error); - if (error.Fail()) - return false; - // make sure we do not try to read huge amounts of data - if (num_bytes > 1024) - num_bytes = 1024; - DataBufferSP buffer_sp(new DataBufferHeap(num_bytes,0)); - num_bytes = process_sp->ReadMemory(data_ptr, buffer_sp->GetBytes(), num_bytes, error); - if (error.Fail() || num_bytes == 0) - return false; - uint8_t *bytes = buffer_sp->GetBytes(); - for (uint64_t byte_idx = 0; byte_idx < num_bytes-1; byte_idx++) - { - uint8_t byte = bytes[byte_idx]; - bool bit0 = (byte & 1) == 1; - bool bit1 = (byte & 2) == 2; - bool bit2 = (byte & 4) == 4; - bool bit3 = (byte & 8) == 8; - bool bit4 = (byte & 16) == 16; - bool bit5 = (byte & 32) == 32; - bool bit6 = (byte & 64) == 64; - bool bit7 = (byte & 128) == 128; - stream.Printf("%c%c%c%c %c%c%c%c ", - (bit7 ? '1' : '0'), - (bit6 ? '1' : '0'), - (bit5 ? '1' : '0'), - (bit4 ? '1' : '0'), - (bit3 ? '1' : '0'), - (bit2 ? '1' : '0'), - (bit1 ? '1' : '0'), - (bit0 ? '1' : '0')); - count -= 8; + } + + if (is_type_ok == false) + return false; + + Error error; + count = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size, + ptr_size, 0, error); + if (error.Fail()) + return false; + uint64_t num_bytes = count / 8 + ((count & 7) ? 1 : 0); + addr_t data_ptr = process_sp->ReadPointerFromMemory( + valobj_addr + 2 * ptr_size + 2 * ptr_size, error); + if (error.Fail()) + return false; + // make sure we do not try to read huge amounts of data + if (num_bytes > 1024) + num_bytes = 1024; + DataBufferSP buffer_sp(new DataBufferHeap(num_bytes, 0)); + num_bytes = + process_sp->ReadMemory(data_ptr, buffer_sp->GetBytes(), num_bytes, error); + if (error.Fail() || num_bytes == 0) + return false; + uint8_t *bytes = buffer_sp->GetBytes(); + for (uint64_t byte_idx = 0; byte_idx < num_bytes - 1; byte_idx++) { + uint8_t byte = bytes[byte_idx]; + bool bit0 = (byte & 1) == 1; + bool bit1 = (byte & 2) == 2; + bool bit2 = (byte & 4) == 4; + bool bit3 = (byte & 8) == 8; + bool bit4 = (byte & 16) == 16; + bool bit5 = (byte & 32) == 32; + bool bit6 = (byte & 64) == 64; + bool bit7 = (byte & 128) == 128; + stream.Printf("%c%c%c%c %c%c%c%c ", (bit7 ? '1' : '0'), (bit6 ? '1' : '0'), + (bit5 ? '1' : '0'), (bit4 ? '1' : '0'), (bit3 ? '1' : '0'), + (bit2 ? '1' : '0'), (bit1 ? '1' : '0'), (bit0 ? '1' : '0')); + count -= 8; + } + { + // print the last byte ensuring we do not print spurious bits + uint8_t byte = bytes[num_bytes - 1]; + bool bit0 = (byte & 1) == 1; + bool bit1 = (byte & 2) == 2; + bool bit2 = (byte & 4) == 4; + bool bit3 = (byte & 8) == 8; + bool bit4 = (byte & 16) == 16; + bool bit5 = (byte & 32) == 32; + bool bit6 = (byte & 64) == 64; + bool bit7 = (byte & 128) == 128; + if (count) { + stream.Printf("%c", bit7 ? '1' : '0'); + count -= 1; + } + if (count) { + stream.Printf("%c", bit6 ? '1' : '0'); + count -= 1; + } + if (count) { + stream.Printf("%c", bit5 ? '1' : '0'); + count -= 1; + } + if (count) { + stream.Printf("%c", bit4 ? '1' : '0'); + count -= 1; } - { - // print the last byte ensuring we do not print spurious bits - uint8_t byte = bytes[num_bytes-1]; - bool bit0 = (byte & 1) == 1; - bool bit1 = (byte & 2) == 2; - bool bit2 = (byte & 4) == 4; - bool bit3 = (byte & 8) == 8; - bool bit4 = (byte & 16) == 16; - bool bit5 = (byte & 32) == 32; - bool bit6 = (byte & 64) == 64; - bool bit7 = (byte & 128) == 128; - if (count) - { - stream.Printf("%c",bit7 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit6 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit5 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit4 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit3 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit2 ? '1' : '0'); - count -= 1; - } - if (count) - { - stream.Printf("%c",bit1 ? '1' : '0'); - count -= 1; - } - if (count) - stream.Printf("%c",bit0 ? '1' : '0'); + if (count) { + stream.Printf("%c", bit3 ? '1' : '0'); + count -= 1; } - return true; + if (count) { + stream.Printf("%c", bit2 ? '1' : '0'); + count -= 1; + } + if (count) { + stream.Printf("%c", bit1 ? '1' : '0'); + count -= 1; + } + if (count) + stream.Printf("%c", bit0 ? '1' : '0'); + } + return true; } -bool -lldb_private::formatters::CFBinaryHeapSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - static ConstString g_TypeHint("CFBinaryHeap"); - - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint32_t count = 0; - - bool is_type_ok = false; // check to see if this is a CFBinaryHeap we know about - if (descriptor->IsCFType()) - { - ConstString type_name(valobj.GetTypeName()); - - static ConstString g___CFBinaryHeap("__CFBinaryHeap"); - static ConstString g_conststruct__CFBinaryHeap("const struct __CFBinaryHeap"); - static ConstString g_CFBinaryHeapRef("CFBinaryHeapRef"); - - if (type_name == g___CFBinaryHeap || - type_name == g_conststruct__CFBinaryHeap || - type_name == g_CFBinaryHeapRef) - { - if (valobj.IsPointerType()) - is_type_ok = true; - } - } - - if (is_type_ok) - { - lldb::addr_t offset = 2*ptr_size + valobj_addr; - Error error; - count = process_sp->ReadUnsignedIntegerFromMemory(offset, 4, 0, error); - if (error.Fail()) - return false; +bool lldb_private::formatters::CFBinaryHeapSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + static ConstString g_TypeHint("CFBinaryHeap"); + + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor.get() || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + uint32_t count = 0; + + bool is_type_ok = + false; // check to see if this is a CFBinaryHeap we know about + if (descriptor->IsCFType()) { + ConstString type_name(valobj.GetTypeName()); + + static ConstString g___CFBinaryHeap("__CFBinaryHeap"); + static ConstString g_conststruct__CFBinaryHeap( + "const struct __CFBinaryHeap"); + static ConstString g_CFBinaryHeapRef("CFBinaryHeapRef"); + + if (type_name == g___CFBinaryHeap || + type_name == g_conststruct__CFBinaryHeap || + type_name == g_CFBinaryHeapRef) { + if (valobj.IsPointerType()) + is_type_ok = true; } - else - return false; - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(options.GetLanguage())) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } + } + + if (is_type_ok) { + lldb::addr_t offset = 2 * ptr_size + valobj_addr; + Error error; + count = process_sp->ReadUnsignedIntegerFromMemory(offset, 4, 0, error); + if (error.Fail()) + return false; + } else + return false; + + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(options.GetLanguage())) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } - - stream.Printf("%s\"%u item%s\"%s", - prefix.c_str(), - count,(count == 1 ? "" : "s"), - suffix.c_str()); - return true; + } + + stream.Printf("%s\"%u item%s\"%s", prefix.c_str(), count, + (count == 1 ? "" : "s"), suffix.c_str()); + return true; } diff --git a/lldb/source/Plugins/Language/ObjC/CF.h b/lldb/source/Plugins/Language/ObjC/CF.h index 4044f09f585..ea47267db93 100644 --- a/lldb/source/Plugins/Language/ObjC/CF.h +++ b/lldb/source/Plugins/Language/ObjC/CF.h @@ -15,20 +15,19 @@ #include "lldb/DataFormatters/TypeSummary.h" namespace lldb_private { - namespace formatters - { - bool - CFBagSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - CFBinaryHeapSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - CFBitVectorSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - CFAbsoluteTimeSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - } // namespace formatters +namespace formatters { +bool CFBagSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool CFBinaryHeapSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool CFBitVectorSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool CFAbsoluteTimeSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); +} // namespace formatters } // namespace lldb_private #endif // liblldb_CF_h_ diff --git a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp index e09a70001fa..e23f6a52c55 100644 --- a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp +++ b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp @@ -26,8 +26,8 @@ #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/Language.h" #include "lldb/Target/ObjCLanguageRuntime.h" -#include "lldb/Target/Target.h" #include "lldb/Target/Process.h" +#include "lldb/Target/Target.h" #include "lldb/Utility/ProcessStructReader.h" #include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.h" @@ -38,964 +38,904 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -bool -lldb_private::formatters::NSBundleSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"NSBundle")) - { - uint64_t offset = 5 * ptr_size; - ValueObjectSP text(valobj.GetSyntheticChildAtOffset(offset, valobj.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeObjCID), true)); - - StreamString summary_stream; - bool was_nsstring_ok = NSStringSummaryProvider(*text, summary_stream, options); - if (was_nsstring_ok && summary_stream.GetSize() > 0) - { - stream.Printf("%s",summary_stream.GetData()); - return true; - } - } - +bool lldb_private::formatters::NSBundleSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) return false; -} -bool -lldb_private::formatters::NSTimeZoneSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"__NSTimeZone")) - { - uint64_t offset = ptr_size; - ValueObjectSP text(valobj.GetSyntheticChildAtOffset(offset, valobj.GetCompilerType(), true)); - StreamString summary_stream; - bool was_nsstring_ok = NSStringSummaryProvider(*text, summary_stream, options); - if (was_nsstring_ok && summary_stream.GetSize() > 0) - { - stream.Printf("%s",summary_stream.GetData()); - return true; - } - } - + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) return false; -} -bool -lldb_private::formatters::NSNotificationSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"NSConcreteNotification")) - { - uint64_t offset = ptr_size; - ValueObjectSP text(valobj.GetSyntheticChildAtOffset(offset, valobj.GetCompilerType(), true)); - StreamString summary_stream; - bool was_nsstring_ok = NSStringSummaryProvider(*text, summary_stream, options); - if (was_nsstring_ok && summary_stream.GetSize() > 0) - { - stream.Printf("%s",summary_stream.GetData()); - return true; - } - } - + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) return false; -} -bool -lldb_private::formatters::NSMachPortSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - uint64_t port_number = 0; - - if (!strcmp(class_name,"NSMachPort")) - { - uint64_t offset = (ptr_size == 4 ? 12 : 20); - Error error; - port_number = process_sp->ReadUnsignedIntegerFromMemory(offset+valobj_addr, 4, 0, error); - if (error.Success()) - { - stream.Printf("mach port: %u",(uint32_t)(port_number & 0x00000000FFFFFFFF)); - return true; - } - } - + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) return false; -} -bool -lldb_private::formatters::NSIndexSetSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - uint64_t count = 0; - - do { - if (!strcmp(class_name,"NSIndexSet") || !strcmp(class_name,"NSMutableIndexSet")) - { - Error error; - uint32_t mode = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+ptr_size, 4, 0, error); - if (error.Fail()) - return false; - // this means the set is empty - count = 0 - if ((mode & 1) == 1) - { - count = 0; - break; - } - if ((mode & 2) == 2) - mode = 1; // this means the set only has one range - else - mode = 2; // this means the set has multiple ranges - if (mode == 1) - { - count = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+3*ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - } - else - { - // read a pointer to the data at 2*ptr_size - count = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+2*ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - // read the data at 2*ptr_size from the first location - count = process_sp->ReadUnsignedIntegerFromMemory(count+2*ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - } - } - else - return false; - } while (false); - stream.Printf("%" PRIu64 " index%s", - count, - (count == 1 ? "" : "es")); - return true; -} + const char *class_name = descriptor->GetClassName().GetCString(); -static void -NSNumber_FormatChar (ValueObject& valobj, - Stream& stream, - char value, - lldb::LanguageType lang) -{ - static ConstString g_TypeHint("NSNumber:char"); - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(lang)) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } + if (!class_name || !*class_name) + return false; + + if (!strcmp(class_name, "NSBundle")) { + uint64_t offset = 5 * ptr_size; + ValueObjectSP text(valobj.GetSyntheticChildAtOffset( + offset, + valobj.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeObjCID), + true)); + + StreamString summary_stream; + bool was_nsstring_ok = + NSStringSummaryProvider(*text, summary_stream, options); + if (was_nsstring_ok && summary_stream.GetSize() > 0) { + stream.Printf("%s", summary_stream.GetData()); + return true; } - - stream.Printf("%s%hhd%s", - prefix.c_str(), - value, - suffix.c_str()); + } + + return false; } -static void -NSNumber_FormatShort (ValueObject& valobj, - Stream& stream, - short value, - lldb::LanguageType lang) -{ - static ConstString g_TypeHint("NSNumber:short"); - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(lang)) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } +bool lldb_private::formatters::NSTimeZoneSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + const char *class_name = descriptor->GetClassName().GetCString(); + + if (!class_name || !*class_name) + return false; + + if (!strcmp(class_name, "__NSTimeZone")) { + uint64_t offset = ptr_size; + ValueObjectSP text(valobj.GetSyntheticChildAtOffset( + offset, valobj.GetCompilerType(), true)); + StreamString summary_stream; + bool was_nsstring_ok = + NSStringSummaryProvider(*text, summary_stream, options); + if (was_nsstring_ok && summary_stream.GetSize() > 0) { + stream.Printf("%s", summary_stream.GetData()); + return true; } - - stream.Printf("%s%hd%s", - prefix.c_str(), - value, - suffix.c_str()); + } + + return false; } -static void -NSNumber_FormatInt (ValueObject& valobj, - Stream& stream, - int value, - lldb::LanguageType lang) -{ - static ConstString g_TypeHint("NSNumber:int"); - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(lang)) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } +bool lldb_private::formatters::NSNotificationSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + const char *class_name = descriptor->GetClassName().GetCString(); + + if (!class_name || !*class_name) + return false; + + if (!strcmp(class_name, "NSConcreteNotification")) { + uint64_t offset = ptr_size; + ValueObjectSP text(valobj.GetSyntheticChildAtOffset( + offset, valobj.GetCompilerType(), true)); + StreamString summary_stream; + bool was_nsstring_ok = + NSStringSummaryProvider(*text, summary_stream, options); + if (was_nsstring_ok && summary_stream.GetSize() > 0) { + stream.Printf("%s", summary_stream.GetData()); + return true; } - - stream.Printf("%s%d%s", - prefix.c_str(), - value, - suffix.c_str()); + } + + return false; } -static void -NSNumber_FormatLong (ValueObject& valobj, - Stream& stream, - uint64_t value, - lldb::LanguageType lang) -{ - static ConstString g_TypeHint("NSNumber:long"); - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(lang)) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } +bool lldb_private::formatters::NSMachPortSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + const char *class_name = descriptor->GetClassName().GetCString(); + + if (!class_name || !*class_name) + return false; + + uint64_t port_number = 0; + + if (!strcmp(class_name, "NSMachPort")) { + uint64_t offset = (ptr_size == 4 ? 12 : 20); + Error error; + port_number = process_sp->ReadUnsignedIntegerFromMemory( + offset + valobj_addr, 4, 0, error); + if (error.Success()) { + stream.Printf("mach port: %u", + (uint32_t)(port_number & 0x00000000FFFFFFFF)); + return true; } - - stream.Printf("%s%" PRId64 "%s", - prefix.c_str(), - value, - suffix.c_str()); + } + + return false; } -static void -NSNumber_FormatFloat (ValueObject& valobj, - Stream& stream, - float value, - lldb::LanguageType lang) -{ - static ConstString g_TypeHint("NSNumber:float"); - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(lang)) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } - } - - stream.Printf("%s%f%s", - prefix.c_str(), - value, - suffix.c_str()); +bool lldb_private::formatters::NSIndexSetSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + const char *class_name = descriptor->GetClassName().GetCString(); + + if (!class_name || !*class_name) + return false; + + uint64_t count = 0; + + do { + if (!strcmp(class_name, "NSIndexSet") || + !strcmp(class_name, "NSMutableIndexSet")) { + Error error; + uint32_t mode = process_sp->ReadUnsignedIntegerFromMemory( + valobj_addr + ptr_size, 4, 0, error); + if (error.Fail()) + return false; + // this means the set is empty - count = 0 + if ((mode & 1) == 1) { + count = 0; + break; + } + if ((mode & 2) == 2) + mode = 1; // this means the set only has one range + else + mode = 2; // this means the set has multiple ranges + if (mode == 1) { + count = process_sp->ReadUnsignedIntegerFromMemory( + valobj_addr + 3 * ptr_size, ptr_size, 0, error); + if (error.Fail()) + return false; + } else { + // read a pointer to the data at 2*ptr_size + count = process_sp->ReadUnsignedIntegerFromMemory( + valobj_addr + 2 * ptr_size, ptr_size, 0, error); + if (error.Fail()) + return false; + // read the data at 2*ptr_size from the first location + count = process_sp->ReadUnsignedIntegerFromMemory(count + 2 * ptr_size, + ptr_size, 0, error); + if (error.Fail()) + return false; + } + } else + return false; + } while (false); + stream.Printf("%" PRIu64 " index%s", count, (count == 1 ? "" : "es")); + return true; } -static void -NSNumber_FormatDouble (ValueObject& valobj, - Stream& stream, - double value, - lldb::LanguageType lang) -{ - static ConstString g_TypeHint("NSNumber:double"); - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(lang)) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } +static void NSNumber_FormatChar(ValueObject &valobj, Stream &stream, char value, + lldb::LanguageType lang) { + static ConstString g_TypeHint("NSNumber:char"); + + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(lang)) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } - - stream.Printf("%s%g%s", - prefix.c_str(), - value, - suffix.c_str()); + } + + stream.Printf("%s%hhd%s", prefix.c_str(), value, suffix.c_str()); } -bool -lldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name, "__NSCFBoolean")) - return ObjCBooleanSummaryProvider(valobj, stream, options); - - if (!strcmp(class_name,"NSNumber") || !strcmp(class_name,"__NSCFNumber")) - { - uint64_t value = 0; - uint64_t i_bits = 0; - if (descriptor->GetTaggedPointerInfo(&i_bits,&value)) - { - switch (i_bits) - { - case 0: - NSNumber_FormatChar(valobj, stream, (char)value, options.GetLanguage()); - break; - case 1: - case 4: - NSNumber_FormatShort(valobj, stream, (short)value, options.GetLanguage()); - break; - case 2: - case 8: - NSNumber_FormatInt(valobj, stream, (int)value, options.GetLanguage()); - break; - case 3: - case 12: - NSNumber_FormatLong(valobj, stream, value, options.GetLanguage()); - break; - default: - return false; - } - return true; - } - else - { - Error error; - uint8_t data_type = (process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, 1, 0, error) & 0x1F); - uint64_t data_location = valobj_addr + 2*ptr_size; - uint64_t value = 0; - if (error.Fail()) - return false; - switch (data_type) - { - case 1: // 0B00001 - value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 1, 0, error); - if (error.Fail()) - return false; - NSNumber_FormatChar(valobj, stream, (char)value, options.GetLanguage()); - break; - case 2: // 0B0010 - value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 2, 0, error); - if (error.Fail()) - return false; - NSNumber_FormatShort(valobj, stream, (short)value, options.GetLanguage()); - break; - case 3: // 0B0011 - value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error); - if (error.Fail()) - return false; - NSNumber_FormatInt(valobj, stream, (int)value, options.GetLanguage()); - break; - case 17: // 0B10001 - data_location += 8; - LLVM_FALLTHROUGH; - case 4: // 0B0100 - value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error); - if (error.Fail()) - return false; - NSNumber_FormatLong(valobj, stream, value, options.GetLanguage()); - break; - case 5: // 0B0101 - { - uint32_t flt_as_int = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error); - if (error.Fail()) - return false; - float flt_value = 0.0f; - memcpy(&flt_value, &flt_as_int, sizeof(flt_as_int)); - NSNumber_FormatFloat(valobj, stream, flt_value, options.GetLanguage()); - break; - } - case 6: // 0B0110 - { - uint64_t dbl_as_lng = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error); - if (error.Fail()) - return false; - double dbl_value = 0.0; - memcpy(&dbl_value, &dbl_as_lng, sizeof(dbl_as_lng)); - NSNumber_FormatDouble(valobj, stream, dbl_value, options.GetLanguage()); - break; - } - default: - return false; - } - return true; - } +static void NSNumber_FormatShort(ValueObject &valobj, Stream &stream, + short value, lldb::LanguageType lang) { + static ConstString g_TypeHint("NSNumber:short"); + + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(lang)) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } + } - return false; + stream.Printf("%s%hd%s", prefix.c_str(), value, suffix.c_str()); } -bool -lldb_private::formatters::NSURLSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (strcmp(class_name, "NSURL") == 0) - { - uint64_t offset_text = ptr_size + ptr_size + 8; // ISA + pointer + 8 bytes of data (even on 32bit) - uint64_t offset_base = offset_text + ptr_size; - CompilerType type(valobj.GetCompilerType()); - ValueObjectSP text(valobj.GetSyntheticChildAtOffset(offset_text, type, true)); - ValueObjectSP base(valobj.GetSyntheticChildAtOffset(offset_base, type, true)); - if (!text) - return false; - if (text->GetValueAsUnsigned(0) == 0) - return false; - StreamString summary; - if (!NSStringSummaryProvider(*text, summary, options)) - return false; - if (base && base->GetValueAsUnsigned(0)) - { - if (summary.GetSize() > 0) - summary.GetString().resize(summary.GetSize()-1); - summary.Printf(" -- "); - StreamString base_summary; - if (NSURLSummaryProvider(*base, base_summary, options) && base_summary.GetSize() > 0) - summary.Printf("%s",base_summary.GetSize() > 2 ? base_summary.GetData() + 2 : base_summary.GetData()); - } - if (summary.GetSize()) - { - stream.Printf("%s",summary.GetData()); - return true; - } +static void NSNumber_FormatInt(ValueObject &valobj, Stream &stream, int value, + lldb::LanguageType lang) { + static ConstString g_TypeHint("NSNumber:int"); + + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(lang)) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } + } - return false; + stream.Printf("%s%d%s", prefix.c_str(), value, suffix.c_str()); } -bool -lldb_private::formatters::NSDateSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint64_t date_value_bits = 0; - double date_value = 0.0; - - ConstString class_name = descriptor->GetClassName(); - - static const ConstString g_NSDate("NSDate"); - static const ConstString g___NSDate("__NSDate"); - static const ConstString g___NSTaggedDate("__NSTaggedDate"); - static const ConstString g_NSCalendarDate("NSCalendarDate"); - - if (class_name.IsEmpty()) - return false; - - if ((class_name == g_NSDate) || - (class_name == g___NSDate) || - (class_name == g___NSTaggedDate)) - { - uint64_t info_bits=0,value_bits = 0; - if (descriptor->GetTaggedPointerInfo(&info_bits,&value_bits)) - { - date_value_bits = ((value_bits << 8) | (info_bits << 4)); - memcpy(&date_value, &date_value_bits, sizeof(date_value_bits)); - } - else - { - llvm::Triple triple(process_sp->GetTarget().GetArchitecture().GetTriple()); - uint32_t delta = (triple.isWatchOS() && triple.isWatchABI()) ? 8 : ptr_size; - Error error; - date_value_bits = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+delta, 8, 0, error); - memcpy(&date_value, &date_value_bits, sizeof(date_value_bits)); - if (error.Fail()) - return false; - } - } - else if (class_name == g_NSCalendarDate) - { - Error error; - date_value_bits = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr+2*ptr_size, 8, 0, error); - memcpy(&date_value, &date_value_bits, sizeof(date_value_bits)); - if (error.Fail()) - return false; - } - else - return false; +static void NSNumber_FormatLong(ValueObject &valobj, Stream &stream, + uint64_t value, lldb::LanguageType lang) { + static ConstString g_TypeHint("NSNumber:long"); - if (date_value == -63114076800) - { - stream.Printf("0001-12-30 00:00:00 +0000"); - return true; + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(lang)) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } - // this snippet of code assumes that time_t == seconds since Jan-1-1970 - // this is generally true and POSIXly happy, but might break if a library - // vendor decides to get creative - time_t epoch = GetOSXEpoch(); - epoch = epoch + (time_t)date_value; - tm *tm_date = gmtime(&epoch); - if (!tm_date) - return false; - std::string buffer(1024,0); - if (strftime (&buffer[0], 1023, "%Z", tm_date) == 0) - return false; - stream.Printf("%04d-%02d-%02d %02d:%02d:%02d %s", tm_date->tm_year+1900, tm_date->tm_mon+1, tm_date->tm_mday, tm_date->tm_hour, tm_date->tm_min, tm_date->tm_sec, buffer.c_str()); - return true; -} + } -bool -lldb_private::formatters::ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptorFromISA(valobj.GetValueAsUnsigned(0))); - - if (!descriptor || !descriptor->IsValid()) - return false; - - ConstString class_name = descriptor->GetClassName(); - - if (class_name.IsEmpty()) - return false; - - if (ConstString cs = Mangled(class_name).GetDemangledName(lldb::eLanguageTypeUnknown)) - class_name = cs; - - stream.Printf("%s",class_name.AsCString("<unknown class>")); - return true; + stream.Printf("%s%" PRId64 "%s", prefix.c_str(), value, suffix.c_str()); } -class ObjCClassSyntheticChildrenFrontEnd : public SyntheticChildrenFrontEnd -{ -public: - ObjCClassSyntheticChildrenFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp) - { - } - - ~ObjCClassSyntheticChildrenFrontEnd() override = default; +static void NSNumber_FormatFloat(ValueObject &valobj, Stream &stream, + float value, lldb::LanguageType lang) { + static ConstString g_TypeHint("NSNumber:float"); - size_t - CalculateNumChildren() override - { - return 0; - } - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override - { - return lldb::ValueObjectSP(); - } - - bool - Update() override - { - return false; - } - - bool - MightHaveChildren() override - { - return false; + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(lang)) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } - - size_t - GetIndexOfChildWithName(const ConstString &name) override - { - return UINT32_MAX; + } + + stream.Printf("%s%f%s", prefix.c_str(), value, suffix.c_str()); +} + +static void NSNumber_FormatDouble(ValueObject &valobj, Stream &stream, + double value, lldb::LanguageType lang) { + static ConstString g_TypeHint("NSNumber:double"); + + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(lang)) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } -}; + } -SyntheticChildrenFrontEnd* -lldb_private::formatters::ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - return new ObjCClassSyntheticChildrenFrontEnd(valobj_sp); + stream.Printf("%s%g%s", prefix.c_str(), value, suffix.c_str()); } -template<bool needs_at> -bool -lldb_private::formatters::NSDataSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - bool is_64bit = (process_sp->GetAddressByteSize() == 8); - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - +bool lldb_private::formatters::NSNumberSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + const char *class_name = descriptor->GetClassName().GetCString(); + + if (!class_name || !*class_name) + return false; + + if (!strcmp(class_name, "__NSCFBoolean")) + return ObjCBooleanSummaryProvider(valobj, stream, options); + + if (!strcmp(class_name, "NSNumber") || !strcmp(class_name, "__NSCFNumber")) { uint64_t value = 0; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"NSConcreteData") || - !strcmp(class_name,"NSConcreteMutableData") || - !strcmp(class_name,"__NSCFData")) - { - uint32_t offset = (is_64bit ? 16 : 8); - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, is_64bit ? 8 : 4, 0, error); + uint64_t i_bits = 0; + if (descriptor->GetTaggedPointerInfo(&i_bits, &value)) { + switch (i_bits) { + case 0: + NSNumber_FormatChar(valobj, stream, (char)value, options.GetLanguage()); + break; + case 1: + case 4: + NSNumber_FormatShort(valobj, stream, (short)value, + options.GetLanguage()); + break; + case 2: + case 8: + NSNumber_FormatInt(valobj, stream, (int)value, options.GetLanguage()); + break; + case 3: + case 12: + NSNumber_FormatLong(valobj, stream, value, options.GetLanguage()); + break; + default: + return false; + } + return true; + } else { + Error error; + uint8_t data_type = (process_sp->ReadUnsignedIntegerFromMemory( + valobj_addr + ptr_size, 1, 0, error) & + 0x1F); + uint64_t data_location = valobj_addr + 2 * ptr_size; + uint64_t value = 0; + if (error.Fail()) + return false; + switch (data_type) { + case 1: // 0B00001 + value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 1, 0, + error); if (error.Fail()) - return false; - } - else if (!strcmp(class_name, "_NSInlineData")) - { - uint32_t offset = (is_64bit ? 8 : 4); - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, 2, 0, error); + return false; + NSNumber_FormatChar(valobj, stream, (char)value, options.GetLanguage()); + break; + case 2: // 0B0010 + value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 2, 0, + error); if (error.Fail()) - return false; - } - else if (!strcmp(class_name, "_NSZeroData")) - { - value = 0; + return false; + NSNumber_FormatShort(valobj, stream, (short)value, + options.GetLanguage()); + break; + case 3: // 0B0011 + value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, + error); + if (error.Fail()) + return false; + NSNumber_FormatInt(valobj, stream, (int)value, options.GetLanguage()); + break; + case 17: // 0B10001 + data_location += 8; + LLVM_FALLTHROUGH; + case 4: // 0B0100 + value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, + error); + if (error.Fail()) + return false; + NSNumber_FormatLong(valobj, stream, value, options.GetLanguage()); + break; + case 5: // 0B0101 + { + uint32_t flt_as_int = process_sp->ReadUnsignedIntegerFromMemory( + data_location, 4, 0, error); + if (error.Fail()) + return false; + float flt_value = 0.0f; + memcpy(&flt_value, &flt_as_int, sizeof(flt_as_int)); + NSNumber_FormatFloat(valobj, stream, flt_value, options.GetLanguage()); + break; + } + case 6: // 0B0110 + { + uint64_t dbl_as_lng = process_sp->ReadUnsignedIntegerFromMemory( + data_location, 8, 0, error); + if (error.Fail()) + return false; + double dbl_value = 0.0; + memcpy(&dbl_value, &dbl_as_lng, sizeof(dbl_as_lng)); + NSNumber_FormatDouble(valobj, stream, dbl_value, options.GetLanguage()); + break; + } + default: + return false; + } + return true; } - else - return false; - - stream.Printf("%s%" PRIu64 " byte%s%s", - (needs_at ? "@\"" : ""), - value, - (value != 1 ? "s" : ""), - (needs_at ? "\"" : "")); - - return true; + } + + return false; } -bool -lldb_private::formatters::ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - const uint32_t type_info = valobj.GetCompilerType().GetTypeInfo(); - - ValueObjectSP real_guy_sp = valobj.GetSP(); - - if (type_info & eTypeIsPointer) - { - Error err; - real_guy_sp = valobj.Dereference(err); - if (err.Fail() || !real_guy_sp) - return false; +bool lldb_private::formatters::NSURLSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + const char *class_name = descriptor->GetClassName().GetCString(); + + if (!class_name || !*class_name) + return false; + + if (strcmp(class_name, "NSURL") == 0) { + uint64_t offset_text = ptr_size + ptr_size + + 8; // ISA + pointer + 8 bytes of data (even on 32bit) + uint64_t offset_base = offset_text + ptr_size; + CompilerType type(valobj.GetCompilerType()); + ValueObjectSP text( + valobj.GetSyntheticChildAtOffset(offset_text, type, true)); + ValueObjectSP base( + valobj.GetSyntheticChildAtOffset(offset_base, type, true)); + if (!text) + return false; + if (text->GetValueAsUnsigned(0) == 0) + return false; + StreamString summary; + if (!NSStringSummaryProvider(*text, summary, options)) + return false; + if (base && base->GetValueAsUnsigned(0)) { + if (summary.GetSize() > 0) + summary.GetString().resize(summary.GetSize() - 1); + summary.Printf(" -- "); + StreamString base_summary; + if (NSURLSummaryProvider(*base, base_summary, options) && + base_summary.GetSize() > 0) + summary.Printf("%s", base_summary.GetSize() > 2 + ? base_summary.GetData() + 2 + : base_summary.GetData()); } - else if (type_info & eTypeIsReference) - { - real_guy_sp = valobj.GetChildAtIndex(0, true); - if (!real_guy_sp) - return false; + if (summary.GetSize()) { + stream.Printf("%s", summary.GetData()); + return true; } - uint8_t value = (real_guy_sp->GetValueAsUnsigned(0) & 0xFF); - switch (value) - { - case 0: - stream.Printf("NO"); - break; - case 1: - stream.Printf("YES"); - break; - default: - stream.Printf("%u",value); - break; + } + + return false; +} + +bool lldb_private::formatters::NSDateSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + uint64_t date_value_bits = 0; + double date_value = 0.0; + + ConstString class_name = descriptor->GetClassName(); + + static const ConstString g_NSDate("NSDate"); + static const ConstString g___NSDate("__NSDate"); + static const ConstString g___NSTaggedDate("__NSTaggedDate"); + static const ConstString g_NSCalendarDate("NSCalendarDate"); + + if (class_name.IsEmpty()) + return false; + + if ((class_name == g_NSDate) || (class_name == g___NSDate) || + (class_name == g___NSTaggedDate)) { + uint64_t info_bits = 0, value_bits = 0; + if (descriptor->GetTaggedPointerInfo(&info_bits, &value_bits)) { + date_value_bits = ((value_bits << 8) | (info_bits << 4)); + memcpy(&date_value, &date_value_bits, sizeof(date_value_bits)); + } else { + llvm::Triple triple( + process_sp->GetTarget().GetArchitecture().GetTriple()); + uint32_t delta = + (triple.isWatchOS() && triple.isWatchABI()) ? 8 : ptr_size; + Error error; + date_value_bits = process_sp->ReadUnsignedIntegerFromMemory( + valobj_addr + delta, 8, 0, error); + memcpy(&date_value, &date_value_bits, sizeof(date_value_bits)); + if (error.Fail()) + return false; } + } else if (class_name == g_NSCalendarDate) { + Error error; + date_value_bits = process_sp->ReadUnsignedIntegerFromMemory( + valobj_addr + 2 * ptr_size, 8, 0, error); + memcpy(&date_value, &date_value_bits, sizeof(date_value_bits)); + if (error.Fail()) + return false; + } else + return false; + + if (date_value == -63114076800) { + stream.Printf("0001-12-30 00:00:00 +0000"); return true; + } + // this snippet of code assumes that time_t == seconds since Jan-1-1970 + // this is generally true and POSIXly happy, but might break if a library + // vendor decides to get creative + time_t epoch = GetOSXEpoch(); + epoch = epoch + (time_t)date_value; + tm *tm_date = gmtime(&epoch); + if (!tm_date) + return false; + std::string buffer(1024, 0); + if (strftime(&buffer[0], 1023, "%Z", tm_date) == 0) + return false; + stream.Printf("%04d-%02d-%02d %02d:%02d:%02d %s", tm_date->tm_year + 1900, + tm_date->tm_mon + 1, tm_date->tm_mday, tm_date->tm_hour, + tm_date->tm_min, tm_date->tm_sec, buffer.c_str()); + return true; } -bool -lldb_private::formatters::ObjCBooleanSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - lldb::addr_t valobj_ptr_value = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); - if (valobj_ptr_value == LLDB_INVALID_ADDRESS) - return false; +bool lldb_private::formatters::ObjCClassSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; - ProcessSP process_sp(valobj.GetProcessSP()); - if (!process_sp) - return false; + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); - if (AppleObjCRuntime *objc_runtime = (AppleObjCRuntime*)process_sp->GetObjCLanguageRuntime()) - { - lldb::addr_t cf_true = LLDB_INVALID_ADDRESS, - cf_false = LLDB_INVALID_ADDRESS; - objc_runtime->GetValuesForGlobalCFBooleans(cf_true, cf_false); - if (valobj_ptr_value == cf_true) - { - stream.PutCString("YES"); - return true; - } - if (valobj_ptr_value == cf_false) - { - stream.PutCString("NO"); - return true; - } - } + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptorFromISA(valobj.GetValueAsUnsigned(0))); + if (!descriptor || !descriptor->IsValid()) return false; + + ConstString class_name = descriptor->GetClassName(); + + if (class_name.IsEmpty()) + return false; + + if (ConstString cs = + Mangled(class_name).GetDemangledName(lldb::eLanguageTypeUnknown)) + class_name = cs; + + stream.Printf("%s", class_name.AsCString("<unknown class>")); + return true; } -template <bool is_sel_ptr> -bool -lldb_private::formatters::ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - lldb::ValueObjectSP valobj_sp; - - CompilerType charstar (valobj.GetCompilerType().GetBasicTypeFromAST(eBasicTypeChar).GetPointerType()); - - if (!charstar) - return false; - - ExecutionContext exe_ctx(valobj.GetExecutionContextRef()); - - if (is_sel_ptr) - { - lldb::addr_t data_address = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); - if (data_address == LLDB_INVALID_ADDRESS) - return false; - valobj_sp = ValueObject::CreateValueObjectFromAddress("text", data_address, exe_ctx, charstar); +class ObjCClassSyntheticChildrenFrontEnd : public SyntheticChildrenFrontEnd { +public: + ObjCClassSyntheticChildrenFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp) {} + + ~ObjCClassSyntheticChildrenFrontEnd() override = default; + + size_t CalculateNumChildren() override { return 0; } + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override { + return lldb::ValueObjectSP(); + } + + bool Update() override { return false; } + + bool MightHaveChildren() override { return false; } + + size_t GetIndexOfChildWithName(const ConstString &name) override { + return UINT32_MAX; + } +}; + +SyntheticChildrenFrontEnd * +lldb_private::formatters::ObjCClassSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + return new ObjCClassSyntheticChildrenFrontEnd(valobj_sp); +} + +template <bool needs_at> +bool lldb_private::formatters::NSDataSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) + return false; + + bool is_64bit = (process_sp->GetAddressByteSize() == 8); + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + uint64_t value = 0; + + const char *class_name = descriptor->GetClassName().GetCString(); + + if (!class_name || !*class_name) + return false; + + if (!strcmp(class_name, "NSConcreteData") || + !strcmp(class_name, "NSConcreteMutableData") || + !strcmp(class_name, "__NSCFData")) { + uint32_t offset = (is_64bit ? 16 : 8); + Error error; + value = process_sp->ReadUnsignedIntegerFromMemory( + valobj_addr + offset, is_64bit ? 8 : 4, 0, error); + if (error.Fail()) + return false; + } else if (!strcmp(class_name, "_NSInlineData")) { + uint32_t offset = (is_64bit ? 8 : 4); + Error error; + value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, 2, + 0, error); + if (error.Fail()) + return false; + } else if (!strcmp(class_name, "_NSZeroData")) { + value = 0; + } else + return false; + + stream.Printf("%s%" PRIu64 " byte%s%s", (needs_at ? "@\"" : ""), value, + (value != 1 ? "s" : ""), (needs_at ? "\"" : "")); + + return true; +} + +bool lldb_private::formatters::ObjCBOOLSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + const uint32_t type_info = valobj.GetCompilerType().GetTypeInfo(); + + ValueObjectSP real_guy_sp = valobj.GetSP(); + + if (type_info & eTypeIsPointer) { + Error err; + real_guy_sp = valobj.Dereference(err); + if (err.Fail() || !real_guy_sp) + return false; + } else if (type_info & eTypeIsReference) { + real_guy_sp = valobj.GetChildAtIndex(0, true); + if (!real_guy_sp) + return false; + } + uint8_t value = (real_guy_sp->GetValueAsUnsigned(0) & 0xFF); + switch (value) { + case 0: + stream.Printf("NO"); + break; + case 1: + stream.Printf("YES"); + break; + default: + stream.Printf("%u", value); + break; + } + return true; +} + +bool lldb_private::formatters::ObjCBooleanSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + lldb::addr_t valobj_ptr_value = + valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); + if (valobj_ptr_value == LLDB_INVALID_ADDRESS) + return false; + + ProcessSP process_sp(valobj.GetProcessSP()); + if (!process_sp) + return false; + + if (AppleObjCRuntime *objc_runtime = + (AppleObjCRuntime *)process_sp->GetObjCLanguageRuntime()) { + lldb::addr_t cf_true = LLDB_INVALID_ADDRESS, + cf_false = LLDB_INVALID_ADDRESS; + objc_runtime->GetValuesForGlobalCFBooleans(cf_true, cf_false); + if (valobj_ptr_value == cf_true) { + stream.PutCString("YES"); + return true; } - else - { - DataExtractor data; - Error error; - valobj.GetData(data, error); - if (error.Fail()) - return false; - valobj_sp = ValueObject::CreateValueObjectFromData("text", data, exe_ctx, charstar); + if (valobj_ptr_value == cf_false) { + stream.PutCString("NO"); + return true; } - - if (!valobj_sp) - return false; - - stream.Printf("%s",valobj_sp->GetSummaryAsCString()); - return true; + } + + return false; +} + +template <bool is_sel_ptr> +bool lldb_private::formatters::ObjCSELSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + lldb::ValueObjectSP valobj_sp; + + CompilerType charstar(valobj.GetCompilerType() + .GetBasicTypeFromAST(eBasicTypeChar) + .GetPointerType()); + + if (!charstar) + return false; + + ExecutionContext exe_ctx(valobj.GetExecutionContextRef()); + + if (is_sel_ptr) { + lldb::addr_t data_address = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); + if (data_address == LLDB_INVALID_ADDRESS) + return false; + valobj_sp = ValueObject::CreateValueObjectFromAddress("text", data_address, + exe_ctx, charstar); + } else { + DataExtractor data; + Error error; + valobj.GetData(data, error); + if (error.Fail()) + return false; + valobj_sp = + ValueObject::CreateValueObjectFromData("text", data, exe_ctx, charstar); + } + + if (!valobj_sp) + return false; + + stream.Printf("%s", valobj_sp->GetSummaryAsCString()); + return true; } // POSIX has an epoch on Jan-1-1970, but Cocoa prefers Jan-1-2001 // this call gives the POSIX equivalent of the Cocoa epoch -time_t -lldb_private::formatters::GetOSXEpoch () -{ - static time_t epoch = 0; - if (!epoch) - { +time_t lldb_private::formatters::GetOSXEpoch() { + static time_t epoch = 0; + if (!epoch) { #ifndef _WIN32 - tzset(); - tm tm_epoch; - tm_epoch.tm_sec = 0; - tm_epoch.tm_hour = 0; - tm_epoch.tm_min = 0; - tm_epoch.tm_mon = 0; - tm_epoch.tm_mday = 1; - tm_epoch.tm_year = 2001-1900; - tm_epoch.tm_isdst = -1; - tm_epoch.tm_gmtoff = 0; - tm_epoch.tm_zone = nullptr; - epoch = timegm(&tm_epoch); + tzset(); + tm tm_epoch; + tm_epoch.tm_sec = 0; + tm_epoch.tm_hour = 0; + tm_epoch.tm_min = 0; + tm_epoch.tm_mon = 0; + tm_epoch.tm_mday = 1; + tm_epoch.tm_year = 2001 - 1900; + tm_epoch.tm_isdst = -1; + tm_epoch.tm_gmtoff = 0; + tm_epoch.tm_zone = nullptr; + epoch = timegm(&tm_epoch); #endif - } - return epoch; + } + return epoch; } -template bool -lldb_private::formatters::NSDataSummaryProvider<true> (ValueObject&, Stream&, const TypeSummaryOptions&); +template bool lldb_private::formatters::NSDataSummaryProvider<true>( + ValueObject &, Stream &, const TypeSummaryOptions &); -template bool -lldb_private::formatters::NSDataSummaryProvider<false> (ValueObject&, Stream&, const TypeSummaryOptions&); +template bool lldb_private::formatters::NSDataSummaryProvider<false>( + ValueObject &, Stream &, const TypeSummaryOptions &); -template bool -lldb_private::formatters::ObjCSELSummaryProvider<true> (ValueObject&, Stream&, const TypeSummaryOptions&); +template bool lldb_private::formatters::ObjCSELSummaryProvider<true>( + ValueObject &, Stream &, const TypeSummaryOptions &); -template bool -lldb_private::formatters::ObjCSELSummaryProvider<false> (ValueObject&, Stream&, const TypeSummaryOptions&); +template bool lldb_private::formatters::ObjCSELSummaryProvider<false>( + ValueObject &, Stream &, const TypeSummaryOptions &); diff --git a/lldb/source/Plugins/Language/ObjC/Cocoa.h b/lldb/source/Plugins/Language/ObjC/Cocoa.h index 5ab35446234..491a1196e63 100644 --- a/lldb/source/Plugins/Language/ObjC/Cocoa.h +++ b/lldb/source/Plugins/Language/ObjC/Cocoa.h @@ -1,4 +1,5 @@ -//===-- Cocoa.h ---------------------------------------------------*- C++ -*-===// +//===-- Cocoa.h ---------------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -17,92 +18,96 @@ #include "lldb/Target/ObjCLanguageRuntime.h" namespace lldb_private { - namespace formatters - { - bool - NSIndexSetSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSArraySummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - template<bool needs_at> - bool - NSDataSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSNumberSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSNotificationSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSTimeZoneSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSMachPortSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSDateSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSBundleSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSURLSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - extern template bool - NSDataSummaryProvider<true> (ValueObject&, Stream&, const TypeSummaryOptions&) ; - - extern template bool - NSDataSummaryProvider<false> (ValueObject&, Stream&, const TypeSummaryOptions&) ; - - SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* NSIndexPathSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - bool - ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - SyntheticChildrenFrontEnd* ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - bool - ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - ObjCBooleanSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - template <bool is_sel_ptr> - bool - ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - extern template bool - ObjCSELSummaryProvider<true> (ValueObject&, Stream&, const TypeSummaryOptions&); - - extern template bool - ObjCSELSummaryProvider<false> (ValueObject&, Stream&, const TypeSummaryOptions&); - - bool - NSError_SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSException_SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - SyntheticChildrenFrontEnd* - NSErrorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp); - - SyntheticChildrenFrontEnd* - NSExceptionSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp); - - class NSArray_Additionals - { - public: - static std::map<ConstString, CXXFunctionSummaryFormat::Callback>& - GetAdditionalSummaries (); - - static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>& - GetAdditionalSynthetics (); - }; - } // namespace formatters +namespace formatters { +bool NSIndexSetSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool NSArraySummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +template <bool needs_at> +bool NSDataSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool NSNumberSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool NSNotificationSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool NSTimeZoneSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool NSMachPortSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool NSDateSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool NSBundleSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool NSURLSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +extern template bool NSDataSummaryProvider<true>(ValueObject &, Stream &, + const TypeSummaryOptions &); + +extern template bool NSDataSummaryProvider<false>(ValueObject &, Stream &, + const TypeSummaryOptions &); + +SyntheticChildrenFrontEnd * +NSArraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP); + +SyntheticChildrenFrontEnd * +NSIndexPathSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +bool ObjCClassSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +SyntheticChildrenFrontEnd * +ObjCClassSyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP); + +bool ObjCBOOLSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool ObjCBooleanSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +template <bool is_sel_ptr> +bool ObjCSELSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +extern template bool ObjCSELSummaryProvider<true>(ValueObject &, Stream &, + const TypeSummaryOptions &); + +extern template bool ObjCSELSummaryProvider<false>(ValueObject &, Stream &, + const TypeSummaryOptions &); + +bool NSError_SummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool NSException_SummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +SyntheticChildrenFrontEnd * +NSErrorSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP valobj_sp); + +SyntheticChildrenFrontEnd * +NSExceptionSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP valobj_sp); + +class NSArray_Additionals { +public: + static std::map<ConstString, CXXFunctionSummaryFormat::Callback> & + GetAdditionalSummaries(); + + static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> & + GetAdditionalSynthetics(); +}; +} // namespace formatters } // namespace lldb_private #endif // liblldb_Cocoa_h_ diff --git a/lldb/source/Plugins/Language/ObjC/CoreMedia.cpp b/lldb/source/Plugins/Language/ObjC/CoreMedia.cpp index 4103067b8d5..dacbf78755e 100644 --- a/lldb/source/Plugins/Language/ObjC/CoreMedia.cpp +++ b/lldb/source/Plugins/Language/ObjC/CoreMedia.cpp @@ -1,4 +1,5 @@ -//===-- CoreMedia.cpp --------------------------------------------*- C++ -*-===// +//===-- CoreMedia.cpp --------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -18,72 +19,77 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -bool -lldb_private::formatters::CMTimeSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - CompilerType type = valobj.GetCompilerType(); - if (!type.IsValid()) - return false; +bool lldb_private::formatters::CMTimeSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + CompilerType type = valobj.GetCompilerType(); + if (!type.IsValid()) + return false; - TypeSystem *type_system = valobj.GetExecutionContextRef().GetTargetSP()->GetScratchTypeSystemForLanguage(nullptr, lldb::eLanguageTypeC); - if (!type_system) - return false; - - // fetch children by offset to compensate for potential lack of debug info - auto int64_ty = type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 64); - auto int32_ty = type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 32); - - auto value_sp(valobj.GetSyntheticChildAtOffset(0, int64_ty, true)); - auto timescale_sp(valobj.GetSyntheticChildAtOffset(8, int32_ty, true)); - auto flags_sp(valobj.GetSyntheticChildAtOffset(12, int32_ty, true)); - - if (!value_sp || !timescale_sp || !flags_sp) - return false; - - auto value = value_sp->GetValueAsUnsigned(0); - auto timescale = (int32_t)timescale_sp->GetValueAsUnsigned(0); // the timescale specifies the fraction of a second each unit in the numerator occupies - auto flags = Flags(flags_sp->GetValueAsUnsigned(0) & 0x00000000000000FF); // the flags I need sit in the LSB - - const unsigned int FlagPositiveInf = 4; - const unsigned int FlagNegativeInf = 8; - const unsigned int FlagIndefinite = 16; - - if (flags.AnySet(FlagIndefinite)) - { - stream.Printf("indefinite"); - return true; - } - - if (flags.AnySet(FlagPositiveInf)) - { - stream.Printf("+oo"); - return true; - } - - if (flags.AnySet(FlagNegativeInf)) - { - stream.Printf("-oo"); - return true; - } - - if (timescale == 0) - return false; - - switch (timescale) - { - case 0: - return false; - case 1: - stream.Printf("%" PRId64 " seconds", value); - return true; - case 2: - stream.Printf("%" PRId64 " half seconds", value); - return true; - case 3: - stream.Printf("%" PRId64 " third%sof a second", value, value == 1 ? " " : "s "); - return true; - default: - stream.Printf("%" PRId64 " %" PRId32 "th%sof a second", value, timescale, value == 1 ? " " : "s "); - return true; - } + TypeSystem *type_system = + valobj.GetExecutionContextRef() + .GetTargetSP() + ->GetScratchTypeSystemForLanguage(nullptr, lldb::eLanguageTypeC); + if (!type_system) + return false; + + // fetch children by offset to compensate for potential lack of debug info + auto int64_ty = + type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 64); + auto int32_ty = + type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 32); + + auto value_sp(valobj.GetSyntheticChildAtOffset(0, int64_ty, true)); + auto timescale_sp(valobj.GetSyntheticChildAtOffset(8, int32_ty, true)); + auto flags_sp(valobj.GetSyntheticChildAtOffset(12, int32_ty, true)); + + if (!value_sp || !timescale_sp || !flags_sp) + return false; + + auto value = value_sp->GetValueAsUnsigned(0); + auto timescale = (int32_t)timescale_sp->GetValueAsUnsigned( + 0); // the timescale specifies the fraction of a second each unit in the + // numerator occupies + auto flags = Flags(flags_sp->GetValueAsUnsigned(0) & + 0x00000000000000FF); // the flags I need sit in the LSB + + const unsigned int FlagPositiveInf = 4; + const unsigned int FlagNegativeInf = 8; + const unsigned int FlagIndefinite = 16; + + if (flags.AnySet(FlagIndefinite)) { + stream.Printf("indefinite"); + return true; + } + + if (flags.AnySet(FlagPositiveInf)) { + stream.Printf("+oo"); + return true; + } + + if (flags.AnySet(FlagNegativeInf)) { + stream.Printf("-oo"); + return true; + } + + if (timescale == 0) + return false; + + switch (timescale) { + case 0: + return false; + case 1: + stream.Printf("%" PRId64 " seconds", value); + return true; + case 2: + stream.Printf("%" PRId64 " half seconds", value); + return true; + case 3: + stream.Printf("%" PRId64 " third%sof a second", value, + value == 1 ? " " : "s "); + return true; + default: + stream.Printf("%" PRId64 " %" PRId32 "th%sof a second", value, timescale, + value == 1 ? " " : "s "); + return true; + } } diff --git a/lldb/source/Plugins/Language/ObjC/CoreMedia.h b/lldb/source/Plugins/Language/ObjC/CoreMedia.h index 2ffabaadccf..20de792fc96 100644 --- a/lldb/source/Plugins/Language/ObjC/CoreMedia.h +++ b/lldb/source/Plugins/Language/ObjC/CoreMedia.h @@ -1,4 +1,5 @@ -//===-- CoreMedia.h -----------------------------------------------*- C++ -*-===// +//===-- CoreMedia.h -----------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -15,12 +16,11 @@ #include "lldb/DataFormatters/TypeSummary.h" namespace lldb_private { - namespace formatters - { - - bool - CMTimeSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - } // namespace formatters +namespace formatters { + +bool CMTimeSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); +} // namespace formatters } // namespace lldb_private #endif // liblldb_CF_h_ diff --git a/lldb/source/Plugins/Language/ObjC/NSArray.cpp b/lldb/source/Plugins/Language/ObjC/NSArray.cpp index 5de97b6f025..034687bfe01 100644 --- a/lldb/source/Plugins/Language/ObjC/NSArray.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSArray.cpp @@ -15,6 +15,7 @@ // Project includes #include "Cocoa.h" +#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Error.h" #include "lldb/Core/Stream.h" @@ -26,801 +27,683 @@ #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/Language.h" #include "lldb/Target/ObjCLanguageRuntime.h" -#include "Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntime.h" #include "lldb/Target/Target.h" using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -namespace lldb_private { - namespace formatters { - std::map<ConstString, CXXFunctionSummaryFormat::Callback>& - NSArray_Additionals::GetAdditionalSummaries () - { - static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map; - return g_map; - } - - std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>& - NSArray_Additionals::GetAdditionalSynthetics () - { - static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> g_map; - return g_map; - } - - class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~NSArrayMSyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override = 0; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - protected: - virtual lldb::addr_t - GetDataAddress () = 0; - - virtual uint64_t - GetUsedCount () = 0; - - virtual uint64_t - GetOffset () = 0; - - virtual uint64_t - GetSize () = 0; - - ExecutionContextRef m_exe_ctx_ref; - uint8_t m_ptr_size; - CompilerType m_id_type; - }; - - class NSArrayMSyntheticFrontEnd_109 : public NSArrayMSyntheticFrontEnd - { - public: - NSArrayMSyntheticFrontEnd_109 (lldb::ValueObjectSP valobj_sp); - - ~NSArrayMSyntheticFrontEnd_109() override; - - bool - Update() override; - - protected: - lldb::addr_t - GetDataAddress() override; - - uint64_t - GetUsedCount() override; - - uint64_t - GetOffset() override; - - uint64_t - GetSize() override; - - private: - struct DataDescriptor_32 - { - uint32_t _used; - uint32_t _priv1 : 2; - uint32_t _size : 30; - uint32_t _priv2 : 2; - uint32_t _offset : 30; - uint32_t _priv3; - uint32_t _data; - }; - - struct DataDescriptor_64 - { - uint64_t _used; - uint64_t _priv1 : 2; - uint64_t _size : 62; - uint64_t _priv2 : 2; - uint64_t _offset : 62; - uint32_t _priv3; - uint64_t _data; - }; - - DataDescriptor_32 *m_data_32; - DataDescriptor_64 *m_data_64; - }; - - class NSArrayMSyntheticFrontEnd_1010 : public NSArrayMSyntheticFrontEnd - { - public: - NSArrayMSyntheticFrontEnd_1010 (lldb::ValueObjectSP valobj_sp); - - ~NSArrayMSyntheticFrontEnd_1010() override; - - bool - Update() override; - - protected: - lldb::addr_t - GetDataAddress() override; - - uint64_t - GetUsedCount() override; - - uint64_t - GetOffset() override; - - uint64_t - GetSize() override; - - private: - struct DataDescriptor_32 - { - uint32_t _used; - uint32_t _offset; - uint32_t _size : 28; - uint64_t _priv1 : 4; - uint32_t _priv2; - uint32_t _data; - }; - - struct DataDescriptor_64 - { - uint64_t _used; - uint64_t _offset; - uint64_t _size : 60; - uint64_t _priv1 : 4; - uint32_t _priv2; - uint64_t _data; - }; - - DataDescriptor_32 *m_data_32; - DataDescriptor_64 *m_data_64; - }; - - class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~NSArrayISyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - private: - ExecutionContextRef m_exe_ctx_ref; - uint8_t m_ptr_size; - uint64_t m_items; - lldb::addr_t m_data_ptr; - CompilerType m_id_type; - }; - - class NSArray0SyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSArray0SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~NSArray0SyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - }; - - class NSArray1SyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSArray1SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~NSArray1SyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - }; - } // namespace formatters -} // namespace lldb_private - -bool -lldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - static ConstString g_TypeHint("NSArray"); - - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint64_t value = 0; - - ConstString class_name(descriptor->GetClassName()); - - static const ConstString g_NSArrayI("__NSArrayI"); - static const ConstString g_NSArrayM("__NSArrayM"); - static const ConstString g_NSArray0("__NSArray0"); - static const ConstString g_NSArray1("__NSSingleObjectArrayI"); - static const ConstString g_NSArrayCF("__NSCFArray"); - - if (class_name.IsEmpty()) - return false; - - if (class_name == g_NSArrayI) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - } - else if (class_name == g_NSArrayM) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - } - else if (class_name == g_NSArray0) - { - value = 0; - } - else if (class_name == g_NSArray1) - { - value = 1; - } - else if (class_name == g_NSArrayCF) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - } - else - { - auto& map(NSArray_Additionals::GetAdditionalSummaries()); - auto iter = map.find(class_name), end = map.end(); - if (iter != end) - return iter->second(valobj, stream, options); - else - return false; - } - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(options.GetLanguage())) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } - } - - stream.Printf("%s%" PRIu64 " %s%s%s", - prefix.c_str(), - value, - "element", - value == 1 ? "" : "s", - suffix.c_str()); - return true; -} - -lldb_private::formatters::NSArrayMSyntheticFrontEnd::NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp), -m_exe_ctx_ref(), -m_ptr_size(8), -m_id_type() -{ - if (valobj_sp) - { - clang::ASTContext *ast = valobj_sp->GetExecutionContextRef().GetTargetSP()->GetScratchClangASTContext()->getASTContext(); - if (ast) - m_id_type = CompilerType(ast, ast->ObjCBuiltinIdTy); - if (valobj_sp->GetProcessSP()) - m_ptr_size = valobj_sp->GetProcessSP()->GetAddressByteSize(); - } +namespace lldb_private { +namespace formatters { +std::map<ConstString, CXXFunctionSummaryFormat::Callback> & +NSArray_Additionals::GetAdditionalSummaries() { + static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map; + return g_map; } -lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::NSArrayMSyntheticFrontEnd_109 (lldb::ValueObjectSP valobj_sp) : - NSArrayMSyntheticFrontEnd(valobj_sp), - m_data_32(nullptr), - m_data_64(nullptr) -{ +std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> & +NSArray_Additionals::GetAdditionalSynthetics() { + static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> + g_map; + return g_map; } -lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::NSArrayMSyntheticFrontEnd_1010 (lldb::ValueObjectSP valobj_sp) : - NSArrayMSyntheticFrontEnd(valobj_sp), - m_data_32(nullptr), - m_data_64(nullptr) -{ -} +class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSArrayMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); -size_t -lldb_private::formatters::NSArrayMSyntheticFrontEnd::CalculateNumChildren () -{ - return GetUsedCount(); -} + ~NSArrayMSyntheticFrontEnd() override = default; -lldb::ValueObjectSP -lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (idx >= CalculateNumChildren()) - return lldb::ValueObjectSP(); - lldb::addr_t object_at_idx = GetDataAddress(); - size_t pyhs_idx = idx; - pyhs_idx += GetOffset(); - if (GetSize() <= pyhs_idx) - pyhs_idx -= GetSize(); - object_at_idx += (pyhs_idx * m_ptr_size); - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - return CreateValueObjectFromAddress(idx_name.GetData(), - object_at_idx, - m_exe_ctx_ref, - m_id_type); -} - -bool -lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::Update() -{ - ValueObjectSP valobj_sp = m_backend.GetSP(); - m_ptr_size = 0; - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override = 0; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +protected: + virtual lldb::addr_t GetDataAddress() = 0; + + virtual uint64_t GetUsedCount() = 0; + + virtual uint64_t GetOffset() = 0; + + virtual uint64_t GetSize() = 0; + + ExecutionContextRef m_exe_ctx_ref; + uint8_t m_ptr_size; + CompilerType m_id_type; +}; + +class NSArrayMSyntheticFrontEnd_109 : public NSArrayMSyntheticFrontEnd { +public: + NSArrayMSyntheticFrontEnd_109(lldb::ValueObjectSP valobj_sp); + + ~NSArrayMSyntheticFrontEnd_109() override; + + bool Update() override; + +protected: + lldb::addr_t GetDataAddress() override; + + uint64_t GetUsedCount() override; + + uint64_t GetOffset() override; + + uint64_t GetSize() override; + +private: + struct DataDescriptor_32 { + uint32_t _used; + uint32_t _priv1 : 2; + uint32_t _size : 30; + uint32_t _priv2 : 2; + uint32_t _offset : 30; + uint32_t _priv3; + uint32_t _data; + }; + + struct DataDescriptor_64 { + uint64_t _used; + uint64_t _priv1 : 2; + uint64_t _size : 62; + uint64_t _priv2 : 2; + uint64_t _offset : 62; + uint32_t _priv3; + uint64_t _data; + }; + + DataDescriptor_32 *m_data_32; + DataDescriptor_64 *m_data_64; +}; + +class NSArrayMSyntheticFrontEnd_1010 : public NSArrayMSyntheticFrontEnd { +public: + NSArrayMSyntheticFrontEnd_1010(lldb::ValueObjectSP valobj_sp); + + ~NSArrayMSyntheticFrontEnd_1010() override; + + bool Update() override; + +protected: + lldb::addr_t GetDataAddress() override; + + uint64_t GetUsedCount() override; + + uint64_t GetOffset() override; + + uint64_t GetSize() override; + +private: + struct DataDescriptor_32 { + uint32_t _used; + uint32_t _offset; + uint32_t _size : 28; + uint64_t _priv1 : 4; + uint32_t _priv2; + uint32_t _data; + }; + + struct DataDescriptor_64 { + uint64_t _used; + uint64_t _offset; + uint64_t _size : 60; + uint64_t _priv1 : 4; + uint32_t _priv2; + uint64_t _data; + }; + + DataDescriptor_32 *m_data_32; + DataDescriptor_64 *m_data_64; +}; + +class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSArrayISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~NSArrayISyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +private: + ExecutionContextRef m_exe_ctx_ref; + uint8_t m_ptr_size; + uint64_t m_items; + lldb::addr_t m_data_ptr; + CompilerType m_id_type; +}; + +class NSArray0SyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSArray0SyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~NSArray0SyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; +}; + +class NSArray1SyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSArray1SyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~NSArray1SyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; +}; +} // namespace formatters +} // namespace lldb_private + +bool lldb_private::formatters::NSArraySummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + static ConstString g_TypeHint("NSArray"); + + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + uint64_t value = 0; + + ConstString class_name(descriptor->GetClassName()); + + static const ConstString g_NSArrayI("__NSArrayI"); + static const ConstString g_NSArrayM("__NSArrayM"); + static const ConstString g_NSArray0("__NSArray0"); + static const ConstString g_NSArray1("__NSSingleObjectArrayI"); + static const ConstString g_NSArrayCF("__NSCFArray"); + + if (class_name.IsEmpty()) + return false; + + if (class_name == g_NSArrayI) { Error error; - error.Clear(); - lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); - if (!process_sp) - return false; - m_ptr_size = process_sp->GetAddressByteSize(); - uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; - if (m_ptr_size == 4) - { - m_data_32 = new DataDescriptor_32(); - process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); - } + value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, + ptr_size, 0, error); + if (error.Fail()) + return false; + } else if (class_name == g_NSArrayM) { + Error error; + value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, + ptr_size, 0, error); + if (error.Fail()) + return false; + } else if (class_name == g_NSArray0) { + value = 0; + } else if (class_name == g_NSArray1) { + value = 1; + } else if (class_name == g_NSArrayCF) { + Error error; + value = process_sp->ReadUnsignedIntegerFromMemory( + valobj_addr + 2 * ptr_size, ptr_size, 0, error); + if (error.Fail()) + return false; + } else { + auto &map(NSArray_Additionals::GetAdditionalSummaries()); + auto iter = map.find(class_name), end = map.end(); + if (iter != end) + return iter->second(valobj, stream, options); else - { - m_data_64 = new DataDescriptor_64(); - process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); + return false; + } + + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(options.GetLanguage())) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } - if (error.Fail()) - return false; + } + + stream.Printf("%s%" PRIu64 " %s%s%s", prefix.c_str(), value, "element", + value == 1 ? "" : "s", suffix.c_str()); + return true; +} + +lldb_private::formatters::NSArrayMSyntheticFrontEnd::NSArrayMSyntheticFrontEnd( + lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_ptr_size(8), + m_id_type() { + if (valobj_sp) { + clang::ASTContext *ast = valobj_sp->GetExecutionContextRef() + .GetTargetSP() + ->GetScratchClangASTContext() + ->getASTContext(); + if (ast) + m_id_type = CompilerType(ast, ast->ObjCBuiltinIdTy); + if (valobj_sp->GetProcessSP()) + m_ptr_size = valobj_sp->GetProcessSP()->GetAddressByteSize(); + } +} + +lldb_private::formatters::NSArrayMSyntheticFrontEnd_109:: + NSArrayMSyntheticFrontEnd_109(lldb::ValueObjectSP valobj_sp) + : NSArrayMSyntheticFrontEnd(valobj_sp), m_data_32(nullptr), + m_data_64(nullptr) {} + +lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010:: + NSArrayMSyntheticFrontEnd_1010(lldb::ValueObjectSP valobj_sp) + : NSArrayMSyntheticFrontEnd(valobj_sp), m_data_32(nullptr), + m_data_64(nullptr) {} + +size_t +lldb_private::formatters::NSArrayMSyntheticFrontEnd::CalculateNumChildren() { + return GetUsedCount(); +} + +lldb::ValueObjectSP +lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + if (idx >= CalculateNumChildren()) + return lldb::ValueObjectSP(); + lldb::addr_t object_at_idx = GetDataAddress(); + size_t pyhs_idx = idx; + pyhs_idx += GetOffset(); + if (GetSize() <= pyhs_idx) + pyhs_idx -= GetSize(); + object_at_idx += (pyhs_idx * m_ptr_size); + StreamString idx_name; + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); + return CreateValueObjectFromAddress(idx_name.GetData(), object_at_idx, + m_exe_ctx_ref, m_id_type); +} + +bool lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::Update() { + ValueObjectSP valobj_sp = m_backend.GetSP(); + m_ptr_size = 0; + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; + if (!valobj_sp) return false; + m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + Error error; + error.Clear(); + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) + return false; + m_ptr_size = process_sp->GetAddressByteSize(); + uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; + if (m_ptr_size == 4) { + m_data_32 = new DataDescriptor_32(); + process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32), + error); + } else { + m_data_64 = new DataDescriptor_64(); + process_sp->ReadMemory(data_location, m_data_64, sizeof(DataDescriptor_64), + error); + } + if (error.Fail()) + return false; + return false; } -bool -lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::Update() -{ - ValueObjectSP valobj_sp = m_backend.GetSP(); - m_ptr_size = 0; - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - Error error; - error.Clear(); - lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); - if (!process_sp) - return false; - m_ptr_size = process_sp->GetAddressByteSize(); - uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; - if (m_ptr_size == 4) - { - m_data_32 = new DataDescriptor_32(); - process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); - } - else - { - m_data_64 = new DataDescriptor_64(); - process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); - } - if (error.Fail()) - return false; +bool lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::Update() { + ValueObjectSP valobj_sp = m_backend.GetSP(); + m_ptr_size = 0; + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; + if (!valobj_sp) + return false; + m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + Error error; + error.Clear(); + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) return false; + m_ptr_size = process_sp->GetAddressByteSize(); + uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; + if (m_ptr_size == 4) { + m_data_32 = new DataDescriptor_32(); + process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32), + error); + } else { + m_data_64 = new DataDescriptor_64(); + process_sp->ReadMemory(data_location, m_data_64, sizeof(DataDescriptor_64), + error); + } + if (error.Fail()) + return false; + return false; } -bool -lldb_private::formatters::NSArrayMSyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::NSArrayMSyntheticFrontEnd::MightHaveChildren() { + return true; } size_t -lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; +lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName( + const ConstString &name) { + const char *item_name = name.GetCString(); + uint32_t idx = ExtractIndexFromString(item_name); + if (idx < UINT32_MAX && idx >= CalculateNumChildren()) + return UINT32_MAX; + return idx; } -lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::~NSArrayMSyntheticFrontEnd_109() -{ - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; +lldb_private::formatters::NSArrayMSyntheticFrontEnd_109:: + ~NSArrayMSyntheticFrontEnd_109() { + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; } lldb::addr_t -lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetDataAddress () -{ - if (!m_data_32 && !m_data_64) - return LLDB_INVALID_ADDRESS; - return m_data_32 ? m_data_32->_data : - m_data_64->_data; +lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetDataAddress() { + if (!m_data_32 && !m_data_64) + return LLDB_INVALID_ADDRESS; + return m_data_32 ? m_data_32->_data : m_data_64->_data; } uint64_t -lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetUsedCount () -{ - if (!m_data_32 && !m_data_64) - return 0; - return m_data_32 ? m_data_32->_used : - m_data_64->_used; +lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetUsedCount() { + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_used : m_data_64->_used; } -uint64_t -lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetOffset () -{ - if (!m_data_32 && !m_data_64) - return 0; - return m_data_32 ? m_data_32->_offset : - m_data_64->_offset; +uint64_t lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetOffset() { + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_offset : m_data_64->_offset; } -uint64_t -lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetSize () -{ - if (!m_data_32 && !m_data_64) - return 0; - return m_data_32 ? m_data_32->_size : - m_data_64->_size; +uint64_t lldb_private::formatters::NSArrayMSyntheticFrontEnd_109::GetSize() { + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_size : m_data_64->_size; } -lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::~NSArrayMSyntheticFrontEnd_1010() -{ - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; +lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010:: + ~NSArrayMSyntheticFrontEnd_1010() { + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; } lldb::addr_t -lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetDataAddress () -{ - if (!m_data_32 && !m_data_64) - return LLDB_INVALID_ADDRESS; - return m_data_32 ? m_data_32->_data : - m_data_64->_data; +lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetDataAddress() { + if (!m_data_32 && !m_data_64) + return LLDB_INVALID_ADDRESS; + return m_data_32 ? m_data_32->_data : m_data_64->_data; } uint64_t -lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetUsedCount () -{ - if (!m_data_32 && !m_data_64) - return 0; - return m_data_32 ? m_data_32->_used : - m_data_64->_used; +lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetUsedCount() { + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_used : m_data_64->_used; } -uint64_t -lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetOffset () -{ - if (!m_data_32 && !m_data_64) - return 0; - return m_data_32 ? m_data_32->_offset : - m_data_64->_offset; +uint64_t lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetOffset() { + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_offset : m_data_64->_offset; } -uint64_t -lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetSize () -{ - if (!m_data_32 && !m_data_64) - return 0; - return m_data_32 ? m_data_32->_size : - m_data_64->_size; -} - -lldb_private::formatters::NSArrayISyntheticFrontEnd::NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_exe_ctx_ref(), - m_ptr_size(8), - m_items(0), - m_data_ptr(0) -{ - if (valobj_sp) - { - CompilerType type = valobj_sp->GetCompilerType(); - if (type) - { - ClangASTContext *ast = valobj_sp->GetExecutionContextRef().GetTargetSP()->GetScratchClangASTContext(); - if (ast) - m_id_type = CompilerType(ast->getASTContext(), ast->getASTContext()->ObjCBuiltinIdTy); - } +uint64_t lldb_private::formatters::NSArrayMSyntheticFrontEnd_1010::GetSize() { + if (!m_data_32 && !m_data_64) + return 0; + return m_data_32 ? m_data_32->_size : m_data_64->_size; +} + +lldb_private::formatters::NSArrayISyntheticFrontEnd::NSArrayISyntheticFrontEnd( + lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_ptr_size(8), + m_items(0), m_data_ptr(0) { + if (valobj_sp) { + CompilerType type = valobj_sp->GetCompilerType(); + if (type) { + ClangASTContext *ast = valobj_sp->GetExecutionContextRef() + .GetTargetSP() + ->GetScratchClangASTContext(); + if (ast) + m_id_type = CompilerType(ast->getASTContext(), + ast->getASTContext()->ObjCBuiltinIdTy); } + } } size_t -lldb_private::formatters::NSArrayISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; +lldb_private::formatters::NSArrayISyntheticFrontEnd::GetIndexOfChildWithName( + const ConstString &name) { + const char *item_name = name.GetCString(); + uint32_t idx = ExtractIndexFromString(item_name); + if (idx < UINT32_MAX && idx >= CalculateNumChildren()) + return UINT32_MAX; + return idx; } size_t -lldb_private::formatters::NSArrayISyntheticFrontEnd::CalculateNumChildren () -{ - return m_items; -} - -bool -lldb_private::formatters::NSArrayISyntheticFrontEnd::Update() -{ - m_ptr_size = 0; - m_items = 0; - m_data_ptr = 0; - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - Error error; - error.Clear(); - lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); - if (!process_sp) - return false; - m_ptr_size = process_sp->GetAddressByteSize(); - uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; - m_items = process_sp->ReadPointerFromMemory(data_location, error); - if (error.Fail()) - return false; - m_data_ptr = data_location+m_ptr_size; +lldb_private::formatters::NSArrayISyntheticFrontEnd::CalculateNumChildren() { + return m_items; +} + +bool lldb_private::formatters::NSArrayISyntheticFrontEnd::Update() { + m_ptr_size = 0; + m_items = 0; + m_data_ptr = 0; + ValueObjectSP valobj_sp = m_backend.GetSP(); + if (!valobj_sp) + return false; + m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + Error error; + error.Clear(); + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) return false; + m_ptr_size = process_sp->GetAddressByteSize(); + uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; + m_items = process_sp->ReadPointerFromMemory(data_location, error); + if (error.Fail()) + return false; + m_data_ptr = data_location + m_ptr_size; + return false; } -bool -lldb_private::formatters::NSArrayISyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::NSArrayISyntheticFrontEnd::MightHaveChildren() { + return true; } lldb::ValueObjectSP -lldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (idx >= CalculateNumChildren()) - return lldb::ValueObjectSP(); - lldb::addr_t object_at_idx = m_data_ptr; - object_at_idx += (idx * m_ptr_size); - ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); - if (!process_sp) - return lldb::ValueObjectSP(); - Error error; - if (error.Fail()) - return lldb::ValueObjectSP(); - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - return CreateValueObjectFromAddress(idx_name.GetData(), - object_at_idx, - m_exe_ctx_ref, - m_id_type); +lldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + if (idx >= CalculateNumChildren()) + return lldb::ValueObjectSP(); + lldb::addr_t object_at_idx = m_data_ptr; + object_at_idx += (idx * m_ptr_size); + ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); + if (!process_sp) + return lldb::ValueObjectSP(); + Error error; + if (error.Fail()) + return lldb::ValueObjectSP(); + StreamString idx_name; + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); + return CreateValueObjectFromAddress(idx_name.GetData(), object_at_idx, + m_exe_ctx_ref, m_id_type); } -lldb_private::formatters::NSArray0SyntheticFrontEnd::NSArray0SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp) -{ -} +lldb_private::formatters::NSArray0SyntheticFrontEnd::NSArray0SyntheticFrontEnd( + lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp) {} size_t -lldb_private::formatters::NSArray0SyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - return UINT32_MAX; +lldb_private::formatters::NSArray0SyntheticFrontEnd::GetIndexOfChildWithName( + const ConstString &name) { + return UINT32_MAX; } size_t -lldb_private::formatters::NSArray0SyntheticFrontEnd::CalculateNumChildren () -{ - return 0; +lldb_private::formatters::NSArray0SyntheticFrontEnd::CalculateNumChildren() { + return 0; } -bool -lldb_private::formatters::NSArray0SyntheticFrontEnd::Update() -{ - return false; +bool lldb_private::formatters::NSArray0SyntheticFrontEnd::Update() { + return false; } -bool -lldb_private::formatters::NSArray0SyntheticFrontEnd::MightHaveChildren () -{ - return false; +bool lldb_private::formatters::NSArray0SyntheticFrontEnd::MightHaveChildren() { + return false; } lldb::ValueObjectSP -lldb_private::formatters::NSArray0SyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - return lldb::ValueObjectSP(); +lldb_private::formatters::NSArray0SyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + return lldb::ValueObjectSP(); } -lldb_private::formatters::NSArray1SyntheticFrontEnd::NSArray1SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd (*valobj_sp.get()) -{ -} +lldb_private::formatters::NSArray1SyntheticFrontEnd::NSArray1SyntheticFrontEnd( + lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp.get()) {} size_t -lldb_private::formatters::NSArray1SyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - static const ConstString g_zero("[0]"); - - if (name == g_zero) - return 0; - - return UINT32_MAX; +lldb_private::formatters::NSArray1SyntheticFrontEnd::GetIndexOfChildWithName( + const ConstString &name) { + static const ConstString g_zero("[0]"); + + if (name == g_zero) + return 0; + + return UINT32_MAX; } size_t -lldb_private::formatters::NSArray1SyntheticFrontEnd::CalculateNumChildren () -{ - return 1; +lldb_private::formatters::NSArray1SyntheticFrontEnd::CalculateNumChildren() { + return 1; } -bool -lldb_private::formatters::NSArray1SyntheticFrontEnd::Update() -{ - return false; +bool lldb_private::formatters::NSArray1SyntheticFrontEnd::Update() { + return false; } -bool -lldb_private::formatters::NSArray1SyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::NSArray1SyntheticFrontEnd::MightHaveChildren() { + return true; } lldb::ValueObjectSP -lldb_private::formatters::NSArray1SyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - static const ConstString g_zero("[0]"); - - if (idx == 0) - { - CompilerType id_type(m_backend.GetTargetSP()->GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeObjCID)); - return m_backend.GetSyntheticChildAtOffset(m_backend.GetProcessSP()->GetAddressByteSize(), id_type, true, g_zero); - } - return lldb::ValueObjectSP(); -} +lldb_private::formatters::NSArray1SyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + static const ConstString g_zero("[0]"); + + if (idx == 0) { + CompilerType id_type( + m_backend.GetTargetSP()->GetScratchClangASTContext()->GetBasicType( + lldb::eBasicTypeObjCID)); + return m_backend.GetSyntheticChildAtOffset( + m_backend.GetProcessSP()->GetAddressByteSize(), id_type, true, g_zero); + } + return lldb::ValueObjectSP(); +} + +SyntheticChildrenFrontEnd * +lldb_private::formatters::NSArraySyntheticFrontEndCreator( + CXXSyntheticChildren *synth, lldb::ValueObjectSP valobj_sp) { + if (!valobj_sp) + return nullptr; -SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren* synth, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return nullptr; - - lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); - if (!process_sp) - return nullptr; - AppleObjCRuntime *runtime = llvm::dyn_cast_or_null<AppleObjCRuntime>(process_sp->GetObjCLanguageRuntime()); - if (!runtime) - return nullptr; - - CompilerType valobj_type(valobj_sp->GetCompilerType()); - Flags flags(valobj_type.GetTypeInfo()); - - if (flags.IsClear(eTypeIsPointer)) - { - Error error; - valobj_sp = valobj_sp->AddressOf(error); - if (error.Fail() || !valobj_sp) - return nullptr; - } - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp)); - - if (!descriptor || !descriptor->IsValid()) - return nullptr; - - ConstString class_name(descriptor->GetClassName()); - - static const ConstString g_NSArrayI("__NSArrayI"); - static const ConstString g_NSArrayM("__NSArrayM"); - static const ConstString g_NSArray0("__NSArray0"); - static const ConstString g_NSArray1("__NSSingleObjectArrayI"); - - if (class_name.IsEmpty()) - return nullptr; - - if (class_name == g_NSArrayI) - { - return (new NSArrayISyntheticFrontEnd(valobj_sp)); - } - else if (class_name == g_NSArray0) - { - return (new NSArray0SyntheticFrontEnd(valobj_sp)); - } - else if (class_name == g_NSArray1) - { - return (new NSArray1SyntheticFrontEnd(valobj_sp)); - } - else if (class_name == g_NSArrayM) - { - if (runtime->GetFoundationVersion() >= 1100) - return (new NSArrayMSyntheticFrontEnd_1010(valobj_sp)); - else - return (new NSArrayMSyntheticFrontEnd_109(valobj_sp)); - } - else - { - auto& map(NSArray_Additionals::GetAdditionalSynthetics()); - auto iter = map.find(class_name), end = map.end(); - if (iter != end) - return iter->second(synth, valobj_sp); - } - + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) + return nullptr; + AppleObjCRuntime *runtime = llvm::dyn_cast_or_null<AppleObjCRuntime>( + process_sp->GetObjCLanguageRuntime()); + if (!runtime) return nullptr; + + CompilerType valobj_type(valobj_sp->GetCompilerType()); + Flags flags(valobj_type.GetTypeInfo()); + + if (flags.IsClear(eTypeIsPointer)) { + Error error; + valobj_sp = valobj_sp->AddressOf(error); + if (error.Fail() || !valobj_sp) + return nullptr; + } + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(*valobj_sp)); + + if (!descriptor || !descriptor->IsValid()) + return nullptr; + + ConstString class_name(descriptor->GetClassName()); + + static const ConstString g_NSArrayI("__NSArrayI"); + static const ConstString g_NSArrayM("__NSArrayM"); + static const ConstString g_NSArray0("__NSArray0"); + static const ConstString g_NSArray1("__NSSingleObjectArrayI"); + + if (class_name.IsEmpty()) + return nullptr; + + if (class_name == g_NSArrayI) { + return (new NSArrayISyntheticFrontEnd(valobj_sp)); + } else if (class_name == g_NSArray0) { + return (new NSArray0SyntheticFrontEnd(valobj_sp)); + } else if (class_name == g_NSArray1) { + return (new NSArray1SyntheticFrontEnd(valobj_sp)); + } else if (class_name == g_NSArrayM) { + if (runtime->GetFoundationVersion() >= 1100) + return (new NSArrayMSyntheticFrontEnd_1010(valobj_sp)); + else + return (new NSArrayMSyntheticFrontEnd_109(valobj_sp)); + } else { + auto &map(NSArray_Additionals::GetAdditionalSynthetics()); + auto iter = map.find(class_name), end = map.end(); + if (iter != end) + return iter->second(synth, valobj_sp); + } + + return nullptr; } diff --git a/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp b/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp index cdebd6b3c23..e1fa67319ee 100644 --- a/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp @@ -34,768 +34,689 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -std::map<ConstString, CXXFunctionSummaryFormat::Callback>& -NSDictionary_Additionals::GetAdditionalSummaries () -{ - static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map; - return g_map; +std::map<ConstString, CXXFunctionSummaryFormat::Callback> & +NSDictionary_Additionals::GetAdditionalSummaries() { + static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map; + return g_map; } -std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>& -NSDictionary_Additionals::GetAdditionalSynthetics () -{ - static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> g_map; - return g_map; +std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> & +NSDictionary_Additionals::GetAdditionalSynthetics() { + static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> + g_map; + return g_map; } -static CompilerType -GetLLDBNSPairType (TargetSP target_sp) -{ - CompilerType compiler_type; - - ClangASTContext *target_ast_context = target_sp->GetScratchClangASTContext(); - - if (target_ast_context) - { - ConstString g___lldb_autogen_nspair("__lldb_autogen_nspair"); - - compiler_type = target_ast_context->GetTypeForIdentifier<clang::CXXRecordDecl>(g___lldb_autogen_nspair); - - if (!compiler_type) - { - compiler_type = target_ast_context->CreateRecordType(nullptr, lldb::eAccessPublic, g___lldb_autogen_nspair.GetCString(), clang::TTK_Struct, lldb::eLanguageTypeC); - - if (compiler_type) - { - ClangASTContext::StartTagDeclarationDefinition(compiler_type); - CompilerType id_compiler_type = target_ast_context->GetBasicType (eBasicTypeObjCID); - ClangASTContext::AddFieldToRecordType(compiler_type, "key", id_compiler_type, lldb::eAccessPublic, 0); - ClangASTContext::AddFieldToRecordType(compiler_type, "value", id_compiler_type, lldb::eAccessPublic, 0); - ClangASTContext::CompleteTagDeclarationDefinition(compiler_type); - } - } +static CompilerType GetLLDBNSPairType(TargetSP target_sp) { + CompilerType compiler_type; + + ClangASTContext *target_ast_context = target_sp->GetScratchClangASTContext(); + + if (target_ast_context) { + ConstString g___lldb_autogen_nspair("__lldb_autogen_nspair"); + + compiler_type = + target_ast_context->GetTypeForIdentifier<clang::CXXRecordDecl>( + g___lldb_autogen_nspair); + + if (!compiler_type) { + compiler_type = target_ast_context->CreateRecordType( + nullptr, lldb::eAccessPublic, g___lldb_autogen_nspair.GetCString(), + clang::TTK_Struct, lldb::eLanguageTypeC); + + if (compiler_type) { + ClangASTContext::StartTagDeclarationDefinition(compiler_type); + CompilerType id_compiler_type = + target_ast_context->GetBasicType(eBasicTypeObjCID); + ClangASTContext::AddFieldToRecordType( + compiler_type, "key", id_compiler_type, lldb::eAccessPublic, 0); + ClangASTContext::AddFieldToRecordType( + compiler_type, "value", id_compiler_type, lldb::eAccessPublic, 0); + ClangASTContext::CompleteTagDeclarationDefinition(compiler_type); + } } - return compiler_type; + } + return compiler_type; } namespace lldb_private { - namespace formatters { - class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~NSDictionaryISyntheticFrontEnd() override; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - private: - struct DataDescriptor_32 - { - uint32_t _used : 26; - uint32_t _szidx : 6; - }; - - struct DataDescriptor_64 - { - uint64_t _used : 58; - uint32_t _szidx : 6; - }; - - struct DictionaryItemDescriptor - { - lldb::addr_t key_ptr; - lldb::addr_t val_ptr; - lldb::ValueObjectSP valobj_sp; - }; - - ExecutionContextRef m_exe_ctx_ref; - uint8_t m_ptr_size; - lldb::ByteOrder m_order; - DataDescriptor_32 *m_data_32; - DataDescriptor_64 *m_data_64; - lldb::addr_t m_data_ptr; - CompilerType m_pair_type; - std::vector<DictionaryItemDescriptor> m_children; - }; - - class NSDictionary1SyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSDictionary1SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~NSDictionary1SyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - private: - ValueObjectSP m_pair; - }; - - class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~NSDictionaryMSyntheticFrontEnd() override; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - private: - struct DataDescriptor_32 - { - uint32_t _used : 26; - uint32_t _kvo : 1; - uint32_t _size; - uint32_t _mutations; - uint32_t _objs_addr; - uint32_t _keys_addr; - }; - - struct DataDescriptor_64 - { - uint64_t _used : 58; - uint32_t _kvo : 1; - uint64_t _size; - uint64_t _mutations; - uint64_t _objs_addr; - uint64_t _keys_addr; - }; - - struct DictionaryItemDescriptor - { - lldb::addr_t key_ptr; - lldb::addr_t val_ptr; - lldb::ValueObjectSP valobj_sp; - }; - - ExecutionContextRef m_exe_ctx_ref; - uint8_t m_ptr_size; - lldb::ByteOrder m_order; - DataDescriptor_32 *m_data_32; - DataDescriptor_64 *m_data_64; - CompilerType m_pair_type; - std::vector<DictionaryItemDescriptor> m_children; - }; - } // namespace formatters +namespace formatters { +class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSDictionaryISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~NSDictionaryISyntheticFrontEnd() override; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +private: + struct DataDescriptor_32 { + uint32_t _used : 26; + uint32_t _szidx : 6; + }; + + struct DataDescriptor_64 { + uint64_t _used : 58; + uint32_t _szidx : 6; + }; + + struct DictionaryItemDescriptor { + lldb::addr_t key_ptr; + lldb::addr_t val_ptr; + lldb::ValueObjectSP valobj_sp; + }; + + ExecutionContextRef m_exe_ctx_ref; + uint8_t m_ptr_size; + lldb::ByteOrder m_order; + DataDescriptor_32 *m_data_32; + DataDescriptor_64 *m_data_64; + lldb::addr_t m_data_ptr; + CompilerType m_pair_type; + std::vector<DictionaryItemDescriptor> m_children; +}; + +class NSDictionary1SyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSDictionary1SyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~NSDictionary1SyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +private: + ValueObjectSP m_pair; +}; + +class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSDictionaryMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~NSDictionaryMSyntheticFrontEnd() override; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +private: + struct DataDescriptor_32 { + uint32_t _used : 26; + uint32_t _kvo : 1; + uint32_t _size; + uint32_t _mutations; + uint32_t _objs_addr; + uint32_t _keys_addr; + }; + + struct DataDescriptor_64 { + uint64_t _used : 58; + uint32_t _kvo : 1; + uint64_t _size; + uint64_t _mutations; + uint64_t _objs_addr; + uint64_t _keys_addr; + }; + + struct DictionaryItemDescriptor { + lldb::addr_t key_ptr; + lldb::addr_t val_ptr; + lldb::ValueObjectSP valobj_sp; + }; + + ExecutionContextRef m_exe_ctx_ref; + uint8_t m_ptr_size; + lldb::ByteOrder m_order; + DataDescriptor_32 *m_data_32; + DataDescriptor_64 *m_data_64; + CompilerType m_pair_type; + std::vector<DictionaryItemDescriptor> m_children; +}; +} // namespace formatters } // namespace lldb_private -template<bool name_entries> -bool -lldb_private::formatters::NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - static ConstString g_TypeHint("NSDictionary"); - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - bool is_64bit = (ptr_size == 8); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint64_t value = 0; - - ConstString class_name(descriptor->GetClassName()); - - static const ConstString g_DictionaryI("__NSDictionaryI"); - static const ConstString g_DictionaryM("__NSDictionaryM"); - static const ConstString g_Dictionary1("__NSSingleEntryDictionaryI"); - - if (class_name.IsEmpty()) - return false; - - if (class_name == g_DictionaryI) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); - } - else if (class_name == g_DictionaryM) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); - } - else if (class_name == g_Dictionary1) - { - value = 1; - } - /*else if (!strcmp(class_name,"__NSCFDictionary")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? 20 : 12), 4, 0, error); - if (error.Fail()) - return false; - if (is_64bit) - value &= ~0x0f1f000000000000UL; - }*/ +template <bool name_entries> +bool lldb_private::formatters::NSDictionarySummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + static ConstString g_TypeHint("NSDictionary"); + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + bool is_64bit = (ptr_size == 8); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + uint64_t value = 0; + + ConstString class_name(descriptor->GetClassName()); + + static const ConstString g_DictionaryI("__NSDictionaryI"); + static const ConstString g_DictionaryM("__NSDictionaryM"); + static const ConstString g_Dictionary1("__NSSingleEntryDictionaryI"); + + if (class_name.IsEmpty()) + return false; + + if (class_name == g_DictionaryI) { + Error error; + value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, + ptr_size, 0, error); + if (error.Fail()) + return false; + value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); + } else if (class_name == g_DictionaryM) { + Error error; + value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, + ptr_size, 0, error); + if (error.Fail()) + return false; + value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); + } else if (class_name == g_Dictionary1) { + value = 1; + } + /*else if (!strcmp(class_name,"__NSCFDictionary")) + { + Error error; + value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? + 20 : 12), 4, 0, error); + if (error.Fail()) + return false; + if (is_64bit) + value &= ~0x0f1f000000000000UL; + }*/ + else { + auto &map(NSDictionary_Additionals::GetAdditionalSummaries()); + auto iter = map.find(class_name), end = map.end(); + if (iter != end) + return iter->second(valobj, stream, options); else - { - auto& map(NSDictionary_Additionals::GetAdditionalSummaries()); - auto iter = map.find(class_name), end = map.end(); - if (iter != end) - return iter->second(valobj, stream, options); - else - return false; - } - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(options.GetLanguage())) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } + return false; + } + + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(options.GetLanguage())) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } - - stream.Printf("%s%" PRIu64 " %s%s%s", - prefix.c_str(), - value, - "key/value pair", - value == 1 ? "" : "s", - suffix.c_str()); - return true; + } + + stream.Printf("%s%" PRIu64 " %s%s%s", prefix.c_str(), value, "key/value pair", + value == 1 ? "" : "s", suffix.c_str()); + return true; } -SyntheticChildrenFrontEnd* lldb_private::formatters::NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren* synth, lldb::ValueObjectSP valobj_sp) -{ - lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); - if (!process_sp) - return nullptr; - ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - if (!runtime) - return nullptr; - - CompilerType valobj_type(valobj_sp->GetCompilerType()); - Flags flags(valobj_type.GetTypeInfo()); - - if (flags.IsClear(eTypeIsPointer)) - { - Error error; - valobj_sp = valobj_sp->AddressOf(error); - if (error.Fail() || !valobj_sp) - return nullptr; - } - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp)); - - if (!descriptor || !descriptor->IsValid()) - return nullptr; - - ConstString class_name(descriptor->GetClassName()); - - static const ConstString g_DictionaryI("__NSDictionaryI"); - static const ConstString g_DictionaryM("__NSDictionaryM"); - static const ConstString g_Dictionary1("__NSSingleEntryDictionaryI"); - - if (class_name.IsEmpty()) - return nullptr; - - if (class_name == g_DictionaryI) - { - return (new NSDictionaryISyntheticFrontEnd(valobj_sp)); - } - else if (class_name == g_DictionaryM) - { - return (new NSDictionaryMSyntheticFrontEnd(valobj_sp)); - } - else if (class_name == g_Dictionary1) - { - return (new NSDictionary1SyntheticFrontEnd(valobj_sp)); - } - else - { - auto& map(NSDictionary_Additionals::GetAdditionalSynthetics()); - auto iter = map.find(class_name), end = map.end(); - if (iter != end) - return iter->second(synth, valobj_sp); - } - +SyntheticChildrenFrontEnd * +lldb_private::formatters::NSDictionarySyntheticFrontEndCreator( + CXXSyntheticChildren *synth, lldb::ValueObjectSP valobj_sp) { + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) + return nullptr; + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + if (!runtime) + return nullptr; + + CompilerType valobj_type(valobj_sp->GetCompilerType()); + Flags flags(valobj_type.GetTypeInfo()); + + if (flags.IsClear(eTypeIsPointer)) { + Error error; + valobj_sp = valobj_sp->AddressOf(error); + if (error.Fail() || !valobj_sp) + return nullptr; + } + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(*valobj_sp)); + + if (!descriptor || !descriptor->IsValid()) return nullptr; -} -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_exe_ctx_ref(), - m_ptr_size(8), - m_order(lldb::eByteOrderInvalid), - m_data_32(nullptr), - m_data_64(nullptr), - m_pair_type() -{ + ConstString class_name(descriptor->GetClassName()); + + static const ConstString g_DictionaryI("__NSDictionaryI"); + static const ConstString g_DictionaryM("__NSDictionaryM"); + static const ConstString g_Dictionary1("__NSSingleEntryDictionaryI"); + + if (class_name.IsEmpty()) + return nullptr; + + if (class_name == g_DictionaryI) { + return (new NSDictionaryISyntheticFrontEnd(valobj_sp)); + } else if (class_name == g_DictionaryM) { + return (new NSDictionaryMSyntheticFrontEnd(valobj_sp)); + } else if (class_name == g_Dictionary1) { + return (new NSDictionary1SyntheticFrontEnd(valobj_sp)); + } else { + auto &map(NSDictionary_Additionals::GetAdditionalSynthetics()); + auto iter = map.find(class_name), end = map.end(); + if (iter != end) + return iter->second(synth, valobj_sp); + } + + return nullptr; } -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::~NSDictionaryISyntheticFrontEnd () -{ - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; +lldb_private::formatters::NSDictionaryISyntheticFrontEnd:: + NSDictionaryISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_ptr_size(8), + m_order(lldb::eByteOrderInvalid), m_data_32(nullptr), m_data_64(nullptr), + m_pair_type() {} + +lldb_private::formatters::NSDictionaryISyntheticFrontEnd:: + ~NSDictionaryISyntheticFrontEnd() { + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; } -size_t -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; +size_t lldb_private::formatters::NSDictionaryISyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + const char *item_name = name.GetCString(); + uint32_t idx = ExtractIndexFromString(item_name); + if (idx < UINT32_MAX && idx >= CalculateNumChildren()) + return UINT32_MAX; + return idx; } -size_t -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::CalculateNumChildren () -{ - if (!m_data_32 && !m_data_64) - return 0; - return (m_data_32 ? m_data_32->_used : m_data_64->_used); +size_t lldb_private::formatters::NSDictionaryISyntheticFrontEnd:: + CalculateNumChildren() { + if (!m_data_32 && !m_data_64) + return 0; + return (m_data_32 ? m_data_32->_used : m_data_64->_used); } -bool -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::Update() -{ - m_children.clear(); - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; - m_ptr_size = 0; - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - Error error; - error.Clear(); - lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); - if (!process_sp) - return false; - m_ptr_size = process_sp->GetAddressByteSize(); - m_order = process_sp->GetByteOrder(); - uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; - if (m_ptr_size == 4) - { - m_data_32 = new DataDescriptor_32(); - process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); - } - else - { - m_data_64 = new DataDescriptor_64(); - process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); - } - if (error.Fail()) - return false; - m_data_ptr = data_location + m_ptr_size; +bool lldb_private::formatters::NSDictionaryISyntheticFrontEnd::Update() { + m_children.clear(); + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; + m_ptr_size = 0; + ValueObjectSP valobj_sp = m_backend.GetSP(); + if (!valobj_sp) + return false; + m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + Error error; + error.Clear(); + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) return false; + m_ptr_size = process_sp->GetAddressByteSize(); + m_order = process_sp->GetByteOrder(); + uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; + if (m_ptr_size == 4) { + m_data_32 = new DataDescriptor_32(); + process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32), + error); + } else { + m_data_64 = new DataDescriptor_64(); + process_sp->ReadMemory(data_location, m_data_64, sizeof(DataDescriptor_64), + error); + } + if (error.Fail()) + return false; + m_data_ptr = data_location + m_ptr_size; + return false; } -bool -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::NSDictionaryISyntheticFrontEnd:: + MightHaveChildren() { + return true; } lldb::ValueObjectSP -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - uint32_t num_children = CalculateNumChildren(); - - if (idx >= num_children) +lldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + uint32_t num_children = CalculateNumChildren(); + + if (idx >= num_children) + return lldb::ValueObjectSP(); + + if (m_children.empty()) { + // do the scan phase + lldb::addr_t key_at_idx = 0, val_at_idx = 0; + + uint32_t tries = 0; + uint32_t test_idx = 0; + + while (tries < num_children) { + key_at_idx = m_data_ptr + (2 * test_idx * m_ptr_size); + val_at_idx = key_at_idx + m_ptr_size; + ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); + if (!process_sp) return lldb::ValueObjectSP(); - - if (m_children.empty()) - { - // do the scan phase - lldb::addr_t key_at_idx = 0, val_at_idx = 0; - - uint32_t tries = 0; - uint32_t test_idx = 0; - - while(tries < num_children) - { - key_at_idx = m_data_ptr + (2*test_idx * m_ptr_size); - val_at_idx = key_at_idx + m_ptr_size; - ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); - if (!process_sp) - return lldb::ValueObjectSP(); - Error error; - key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - - test_idx++; - - if (!key_at_idx || !val_at_idx) - continue; - tries++; - - DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()}; - - m_children.push_back(descriptor); - } - } - - if (idx >= m_children.size()) // should never happen + Error error; + key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error); + if (error.Fail()) return lldb::ValueObjectSP(); - - DictionaryItemDescriptor &dict_item = m_children[idx]; - if (!dict_item.valobj_sp) - { - if (!m_pair_type.IsValid()) - { - TargetSP target_sp(m_backend.GetTargetSP()); - if (!target_sp) - return ValueObjectSP(); - m_pair_type = GetLLDBNSPairType(target_sp); - } - if (!m_pair_type.IsValid()) - return ValueObjectSP(); - - DataBufferSP buffer_sp(new DataBufferHeap(2*m_ptr_size,0)); - - if (m_ptr_size == 8) - { - uint64_t *data_ptr = (uint64_t *)buffer_sp->GetBytes(); - *data_ptr = dict_item.key_ptr; - *(data_ptr+1) = dict_item.val_ptr; - } - else - { - uint32_t *data_ptr = (uint32_t *)buffer_sp->GetBytes(); - *data_ptr = dict_item.key_ptr; - *(data_ptr+1) = dict_item.val_ptr; - } - - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - DataExtractor data(buffer_sp, m_order, m_ptr_size); - dict_item.valobj_sp = CreateValueObjectFromData(idx_name.GetData(), - data, - m_exe_ctx_ref, - m_pair_type); + val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error); + if (error.Fail()) + return lldb::ValueObjectSP(); + + test_idx++; + + if (!key_at_idx || !val_at_idx) + continue; + tries++; + + DictionaryItemDescriptor descriptor = {key_at_idx, val_at_idx, + lldb::ValueObjectSP()}; + + m_children.push_back(descriptor); + } + } + + if (idx >= m_children.size()) // should never happen + return lldb::ValueObjectSP(); + + DictionaryItemDescriptor &dict_item = m_children[idx]; + if (!dict_item.valobj_sp) { + if (!m_pair_type.IsValid()) { + TargetSP target_sp(m_backend.GetTargetSP()); + if (!target_sp) + return ValueObjectSP(); + m_pair_type = GetLLDBNSPairType(target_sp); + } + if (!m_pair_type.IsValid()) + return ValueObjectSP(); + + DataBufferSP buffer_sp(new DataBufferHeap(2 * m_ptr_size, 0)); + + if (m_ptr_size == 8) { + uint64_t *data_ptr = (uint64_t *)buffer_sp->GetBytes(); + *data_ptr = dict_item.key_ptr; + *(data_ptr + 1) = dict_item.val_ptr; + } else { + uint32_t *data_ptr = (uint32_t *)buffer_sp->GetBytes(); + *data_ptr = dict_item.key_ptr; + *(data_ptr + 1) = dict_item.val_ptr; } - return dict_item.valobj_sp; -} -lldb_private::formatters::NSDictionary1SyntheticFrontEnd::NSDictionary1SyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : -SyntheticChildrenFrontEnd(*valobj_sp.get()), -m_pair(nullptr) -{ + StreamString idx_name; + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); + DataExtractor data(buffer_sp, m_order, m_ptr_size); + dict_item.valobj_sp = CreateValueObjectFromData(idx_name.GetData(), data, + m_exe_ctx_ref, m_pair_type); + } + return dict_item.valobj_sp; } -size_t -lldb_private::formatters::NSDictionary1SyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - static const ConstString g_zero("[0]"); - - if (name == g_zero) - return 0; - - return UINT32_MAX; +lldb_private::formatters::NSDictionary1SyntheticFrontEnd:: + NSDictionary1SyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp.get()), m_pair(nullptr) {} + +size_t lldb_private::formatters::NSDictionary1SyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + static const ConstString g_zero("[0]"); + + if (name == g_zero) + return 0; + + return UINT32_MAX; } -size_t -lldb_private::formatters::NSDictionary1SyntheticFrontEnd::CalculateNumChildren () -{ - return 1; +size_t lldb_private::formatters::NSDictionary1SyntheticFrontEnd:: + CalculateNumChildren() { + return 1; } -bool -lldb_private::formatters::NSDictionary1SyntheticFrontEnd::Update() -{ - m_pair.reset(); - return false; +bool lldb_private::formatters::NSDictionary1SyntheticFrontEnd::Update() { + m_pair.reset(); + return false; } -bool -lldb_private::formatters::NSDictionary1SyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::NSDictionary1SyntheticFrontEnd:: + MightHaveChildren() { + return true; } lldb::ValueObjectSP -lldb_private::formatters::NSDictionary1SyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - if (idx != 0) - return lldb::ValueObjectSP(); - - if (m_pair.get()) - return m_pair; - - auto process_sp(m_backend.GetProcessSP()); - if (!process_sp) - return nullptr; - - auto ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t key_ptr = m_backend.GetValueAsUnsigned(LLDB_INVALID_ADDRESS) + ptr_size; - lldb::addr_t value_ptr = key_ptr + ptr_size; - - Error error; - - lldb::addr_t value_at_idx = process_sp->ReadPointerFromMemory(key_ptr, error); - if (error.Fail()) - return nullptr; - lldb::addr_t key_at_idx = process_sp->ReadPointerFromMemory(value_ptr, error); - if (error.Fail()) - return nullptr; - - auto pair_type = GetLLDBNSPairType(process_sp->GetTarget().shared_from_this()); - - DataBufferSP buffer_sp(new DataBufferHeap(2*ptr_size,0)); - - if (ptr_size == 8) - { - uint64_t *data_ptr = (uint64_t *)buffer_sp->GetBytes(); - *data_ptr = key_at_idx; - *(data_ptr+1) = value_at_idx; - } - else - { - uint32_t *data_ptr = (uint32_t *)buffer_sp->GetBytes(); - *data_ptr = key_ptr; - *(data_ptr+1) = value_ptr; - } - - DataExtractor data(buffer_sp, process_sp->GetByteOrder(), ptr_size); - m_pair = CreateValueObjectFromData("[0]", - data, - m_backend.GetExecutionContextRef(), - pair_type); - - +lldb_private::formatters::NSDictionary1SyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + if (idx != 0) + return lldb::ValueObjectSP(); + + if (m_pair.get()) return m_pair; -} -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_exe_ctx_ref(), - m_ptr_size(8), - m_order(lldb::eByteOrderInvalid), - m_data_32(nullptr), - m_data_64(nullptr), - m_pair_type() -{ + auto process_sp(m_backend.GetProcessSP()); + if (!process_sp) + return nullptr; + + auto ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t key_ptr = + m_backend.GetValueAsUnsigned(LLDB_INVALID_ADDRESS) + ptr_size; + lldb::addr_t value_ptr = key_ptr + ptr_size; + + Error error; + + lldb::addr_t value_at_idx = process_sp->ReadPointerFromMemory(key_ptr, error); + if (error.Fail()) + return nullptr; + lldb::addr_t key_at_idx = process_sp->ReadPointerFromMemory(value_ptr, error); + if (error.Fail()) + return nullptr; + + auto pair_type = + GetLLDBNSPairType(process_sp->GetTarget().shared_from_this()); + + DataBufferSP buffer_sp(new DataBufferHeap(2 * ptr_size, 0)); + + if (ptr_size == 8) { + uint64_t *data_ptr = (uint64_t *)buffer_sp->GetBytes(); + *data_ptr = key_at_idx; + *(data_ptr + 1) = value_at_idx; + } else { + uint32_t *data_ptr = (uint32_t *)buffer_sp->GetBytes(); + *data_ptr = key_ptr; + *(data_ptr + 1) = value_ptr; + } + + DataExtractor data(buffer_sp, process_sp->GetByteOrder(), ptr_size); + m_pair = CreateValueObjectFromData( + "[0]", data, m_backend.GetExecutionContextRef(), pair_type); + + return m_pair; } -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::~NSDictionaryMSyntheticFrontEnd () -{ - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; +lldb_private::formatters::NSDictionaryMSyntheticFrontEnd:: + NSDictionaryMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_ptr_size(8), + m_order(lldb::eByteOrderInvalid), m_data_32(nullptr), m_data_64(nullptr), + m_pair_type() {} + +lldb_private::formatters::NSDictionaryMSyntheticFrontEnd:: + ~NSDictionaryMSyntheticFrontEnd() { + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; } -size_t -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; +size_t lldb_private::formatters::NSDictionaryMSyntheticFrontEnd:: + GetIndexOfChildWithName(const ConstString &name) { + const char *item_name = name.GetCString(); + uint32_t idx = ExtractIndexFromString(item_name); + if (idx < UINT32_MAX && idx >= CalculateNumChildren()) + return UINT32_MAX; + return idx; } -size_t -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::CalculateNumChildren () -{ - if (!m_data_32 && !m_data_64) - return 0; - return (m_data_32 ? m_data_32->_used : m_data_64->_used); +size_t lldb_private::formatters::NSDictionaryMSyntheticFrontEnd:: + CalculateNumChildren() { + if (!m_data_32 && !m_data_64) + return 0; + return (m_data_32 ? m_data_32->_used : m_data_64->_used); } -bool -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::Update() -{ - m_children.clear(); - ValueObjectSP valobj_sp = m_backend.GetSP(); - m_ptr_size = 0; - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - Error error; - error.Clear(); - lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); - if (!process_sp) - return false; - m_ptr_size = process_sp->GetAddressByteSize(); - m_order = process_sp->GetByteOrder(); - uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; - if (m_ptr_size == 4) - { - m_data_32 = new DataDescriptor_32(); - process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); - } - else - { - m_data_64 = new DataDescriptor_64(); - process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); - } - if (error.Fail()) - return false; +bool lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::Update() { + m_children.clear(); + ValueObjectSP valobj_sp = m_backend.GetSP(); + m_ptr_size = 0; + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; + if (!valobj_sp) + return false; + m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + Error error; + error.Clear(); + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) return false; + m_ptr_size = process_sp->GetAddressByteSize(); + m_order = process_sp->GetByteOrder(); + uint64_t data_location = valobj_sp->GetValueAsUnsigned(0) + m_ptr_size; + if (m_ptr_size == 4) { + m_data_32 = new DataDescriptor_32(); + process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32), + error); + } else { + m_data_64 = new DataDescriptor_64(); + process_sp->ReadMemory(data_location, m_data_64, sizeof(DataDescriptor_64), + error); + } + if (error.Fail()) + return false; + return false; } -bool -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::NSDictionaryMSyntheticFrontEnd:: + MightHaveChildren() { + return true; } lldb::ValueObjectSP -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - lldb::addr_t m_keys_ptr = (m_data_32 ? m_data_32->_keys_addr : m_data_64->_keys_addr); - lldb::addr_t m_values_ptr = (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr); - - uint32_t num_children = CalculateNumChildren(); - - if (idx >= num_children) +lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetChildAtIndex( + size_t idx) { + lldb::addr_t m_keys_ptr = + (m_data_32 ? m_data_32->_keys_addr : m_data_64->_keys_addr); + lldb::addr_t m_values_ptr = + (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr); + + uint32_t num_children = CalculateNumChildren(); + + if (idx >= num_children) + return lldb::ValueObjectSP(); + + if (m_children.empty()) { + // do the scan phase + lldb::addr_t key_at_idx = 0, val_at_idx = 0; + + uint32_t tries = 0; + uint32_t test_idx = 0; + + while (tries < num_children) { + key_at_idx = m_keys_ptr + (test_idx * m_ptr_size); + val_at_idx = m_values_ptr + (test_idx * m_ptr_size); + ; + ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); + if (!process_sp) return lldb::ValueObjectSP(); - - if (m_children.empty()) - { - // do the scan phase - lldb::addr_t key_at_idx = 0, val_at_idx = 0; - - uint32_t tries = 0; - uint32_t test_idx = 0; - - while(tries < num_children) - { - key_at_idx = m_keys_ptr + (test_idx * m_ptr_size); - val_at_idx = m_values_ptr + (test_idx * m_ptr_size);; - ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); - if (!process_sp) - return lldb::ValueObjectSP(); - Error error; - key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - - test_idx++; - - if (!key_at_idx || !val_at_idx) - continue; - tries++; - - DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()}; - - m_children.push_back(descriptor); - } - } - - if (idx >= m_children.size()) // should never happen + Error error; + key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error); + if (error.Fail()) return lldb::ValueObjectSP(); - - DictionaryItemDescriptor &dict_item = m_children[idx]; - if (!dict_item.valobj_sp) - { - if (!m_pair_type.IsValid()) - { - TargetSP target_sp(m_backend.GetTargetSP()); - if (!target_sp) - return ValueObjectSP(); - m_pair_type = GetLLDBNSPairType(target_sp); - } - if (!m_pair_type.IsValid()) - return ValueObjectSP(); - - DataBufferSP buffer_sp(new DataBufferHeap(2*m_ptr_size,0)); - - if (m_ptr_size == 8) - { - uint64_t *data_ptr = (uint64_t *)buffer_sp->GetBytes(); - *data_ptr = dict_item.key_ptr; - *(data_ptr+1) = dict_item.val_ptr; - } - else - { - uint32_t *data_ptr = (uint32_t *)buffer_sp->GetBytes(); - *data_ptr = dict_item.key_ptr; - *(data_ptr+1) = dict_item.val_ptr; - } - - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - DataExtractor data(buffer_sp, m_order, m_ptr_size); - dict_item.valobj_sp = CreateValueObjectFromData(idx_name.GetData(), - data, - m_exe_ctx_ref, - m_pair_type); + val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error); + if (error.Fail()) + return lldb::ValueObjectSP(); + + test_idx++; + + if (!key_at_idx || !val_at_idx) + continue; + tries++; + + DictionaryItemDescriptor descriptor = {key_at_idx, val_at_idx, + lldb::ValueObjectSP()}; + + m_children.push_back(descriptor); + } + } + + if (idx >= m_children.size()) // should never happen + return lldb::ValueObjectSP(); + + DictionaryItemDescriptor &dict_item = m_children[idx]; + if (!dict_item.valobj_sp) { + if (!m_pair_type.IsValid()) { + TargetSP target_sp(m_backend.GetTargetSP()); + if (!target_sp) + return ValueObjectSP(); + m_pair_type = GetLLDBNSPairType(target_sp); } - return dict_item.valobj_sp; + if (!m_pair_type.IsValid()) + return ValueObjectSP(); + + DataBufferSP buffer_sp(new DataBufferHeap(2 * m_ptr_size, 0)); + + if (m_ptr_size == 8) { + uint64_t *data_ptr = (uint64_t *)buffer_sp->GetBytes(); + *data_ptr = dict_item.key_ptr; + *(data_ptr + 1) = dict_item.val_ptr; + } else { + uint32_t *data_ptr = (uint32_t *)buffer_sp->GetBytes(); + *data_ptr = dict_item.key_ptr; + *(data_ptr + 1) = dict_item.val_ptr; + } + + StreamString idx_name; + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); + DataExtractor data(buffer_sp, m_order, m_ptr_size); + dict_item.valobj_sp = CreateValueObjectFromData(idx_name.GetData(), data, + m_exe_ctx_ref, m_pair_type); + } + return dict_item.valobj_sp; } -template bool -lldb_private::formatters::NSDictionarySummaryProvider<true> (ValueObject&, Stream&, const TypeSummaryOptions&); +template bool lldb_private::formatters::NSDictionarySummaryProvider<true>( + ValueObject &, Stream &, const TypeSummaryOptions &); -template bool -lldb_private::formatters::NSDictionarySummaryProvider<false> (ValueObject&, Stream&, const TypeSummaryOptions&); +template bool lldb_private::formatters::NSDictionarySummaryProvider<false>( + ValueObject &, Stream &, const TypeSummaryOptions &); diff --git a/lldb/source/Plugins/Language/ObjC/NSDictionary.h b/lldb/source/Plugins/Language/ObjC/NSDictionary.h index e96c25a97b2..cbb484a661f 100644 --- a/lldb/source/Plugins/Language/ObjC/NSDictionary.h +++ b/lldb/source/Plugins/Language/ObjC/NSDictionary.h @@ -1,4 +1,5 @@ -//===-- NSDictionary.h ---------------------------------------------------*- C++ -*-===// +//===-- NSDictionary.h ---------------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -19,30 +20,32 @@ #include <map> namespace lldb_private { - namespace formatters - { - template<bool name_entries> - bool - NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - extern template bool - NSDictionarySummaryProvider<true> (ValueObject&, Stream&, const TypeSummaryOptions&) ; - - extern template bool - NSDictionarySummaryProvider<false> (ValueObject&, Stream&, const TypeSummaryOptions&) ; - - SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - class NSDictionary_Additionals - { - public: - static std::map<ConstString, CXXFunctionSummaryFormat::Callback>& - GetAdditionalSummaries (); - - static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>& - GetAdditionalSynthetics (); - }; - } // namespace formatters +namespace formatters { +template <bool name_entries> +bool NSDictionarySummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +extern template bool +NSDictionarySummaryProvider<true>(ValueObject &, Stream &, + const TypeSummaryOptions &); + +extern template bool +NSDictionarySummaryProvider<false>(ValueObject &, Stream &, + const TypeSummaryOptions &); + +SyntheticChildrenFrontEnd * +NSDictionarySyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +class NSDictionary_Additionals { +public: + static std::map<ConstString, CXXFunctionSummaryFormat::Callback> & + GetAdditionalSummaries(); + + static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> & + GetAdditionalSynthetics(); +}; +} // namespace formatters } // namespace lldb_private #endif // liblldb_NSDictionary_h_ diff --git a/lldb/source/Plugins/Language/ObjC/NSError.cpp b/lldb/source/Plugins/Language/ObjC/NSError.cpp index 4bfb024206d..bad22b13a00 100644 --- a/lldb/source/Plugins/Language/ObjC/NSError.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSError.cpp @@ -34,196 +34,187 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -static lldb::addr_t -DerefToNSErrorPointer (ValueObject& valobj) -{ - CompilerType valobj_type(valobj.GetCompilerType()); - Flags type_flags(valobj_type.GetTypeInfo()); - if (type_flags.AllClear(eTypeHasValue)) - { - if (valobj.IsBaseClass() && valobj.GetParent()) - return valobj.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS); - } - else - { - lldb::addr_t ptr_value = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); - if (type_flags.AllSet(eTypeIsPointer)) - { - CompilerType pointee_type(valobj_type.GetPointeeType()); - Flags pointee_flags(pointee_type.GetTypeInfo()); - if (pointee_flags.AllSet(eTypeIsPointer)) - { - if (ProcessSP process_sp = valobj.GetProcessSP()) - { - Error error; - ptr_value = process_sp->ReadPointerFromMemory(ptr_value, error); - } - } +static lldb::addr_t DerefToNSErrorPointer(ValueObject &valobj) { + CompilerType valobj_type(valobj.GetCompilerType()); + Flags type_flags(valobj_type.GetTypeInfo()); + if (type_flags.AllClear(eTypeHasValue)) { + if (valobj.IsBaseClass() && valobj.GetParent()) + return valobj.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS); + } else { + lldb::addr_t ptr_value = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); + if (type_flags.AllSet(eTypeIsPointer)) { + CompilerType pointee_type(valobj_type.GetPointeeType()); + Flags pointee_flags(pointee_type.GetTypeInfo()); + if (pointee_flags.AllSet(eTypeIsPointer)) { + if (ProcessSP process_sp = valobj.GetProcessSP()) { + Error error; + ptr_value = process_sp->ReadPointerFromMemory(ptr_value, error); } - return ptr_value; + } } - - return LLDB_INVALID_ADDRESS; + return ptr_value; + } + + return LLDB_INVALID_ADDRESS; +} + +bool lldb_private::formatters::NSError_SummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp(valobj.GetProcessSP()); + if (!process_sp) + return false; + + lldb::addr_t ptr_value = DerefToNSErrorPointer(valobj); + if (ptr_value == LLDB_INVALID_ADDRESS) + return false; + + size_t ptr_size = process_sp->GetAddressByteSize(); + lldb::addr_t code_location = ptr_value + 2 * ptr_size; + lldb::addr_t domain_location = ptr_value + 3 * ptr_size; + + Error error; + uint64_t code = process_sp->ReadUnsignedIntegerFromMemory(code_location, + ptr_size, 0, error); + if (error.Fail()) + return false; + + lldb::addr_t domain_str_value = + process_sp->ReadPointerFromMemory(domain_location, error); + if (error.Fail() || domain_str_value == LLDB_INVALID_ADDRESS) + return false; + + if (!domain_str_value) { + stream.Printf("domain: nil - code: %" PRIu64, code); + return true; + } + + InferiorSizedWord isw(domain_str_value, *process_sp); + + ValueObjectSP domain_str_sp = ValueObject::CreateValueObjectFromData( + "domain_str", isw.GetAsData(process_sp->GetByteOrder()), + valobj.GetExecutionContextRef(), process_sp->GetTarget() + .GetScratchClangASTContext() + ->GetBasicType(lldb::eBasicTypeVoid) + .GetPointerType()); + + if (!domain_str_sp) + return false; + + StreamString domain_str_summary; + if (NSStringSummaryProvider(*domain_str_sp, domain_str_summary, options) && + !domain_str_summary.Empty()) { + stream.Printf("domain: %s - code: %" PRIu64, domain_str_summary.GetData(), + code); + return true; + } else { + stream.Printf("domain: nil - code: %" PRIu64, code); + return true; + } } -bool -lldb_private::formatters::NSError_SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp(valobj.GetProcessSP()); +class NSErrorSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSErrorSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp) {} + + ~NSErrorSyntheticFrontEnd() override = default; + // no need to delete m_child_ptr - it's kept alive by the cluster manager on + // our behalf + + size_t CalculateNumChildren() override { + if (m_child_ptr) + return 1; + if (m_child_sp) + return 1; + return 0; + } + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override { + if (idx != 0) + return lldb::ValueObjectSP(); + + if (m_child_ptr) + return m_child_ptr->GetSP(); + return m_child_sp; + } + + bool Update() override { + m_child_ptr = nullptr; + m_child_sp.reset(); + + ProcessSP process_sp(m_backend.GetProcessSP()); if (!process_sp) - return false; - - lldb::addr_t ptr_value = DerefToNSErrorPointer(valobj); - if (ptr_value == LLDB_INVALID_ADDRESS) - return false; + return false; + + lldb::addr_t userinfo_location = DerefToNSErrorPointer(m_backend); + if (userinfo_location == LLDB_INVALID_ADDRESS) + return false; size_t ptr_size = process_sp->GetAddressByteSize(); - lldb::addr_t code_location = ptr_value + 2 * ptr_size; - lldb::addr_t domain_location = ptr_value + 3 * ptr_size; - + + userinfo_location += 4 * ptr_size; Error error; - uint64_t code = process_sp->ReadUnsignedIntegerFromMemory(code_location, ptr_size, 0, error); - if (error.Fail()) - return false; - - lldb::addr_t domain_str_value = process_sp->ReadPointerFromMemory(domain_location, error); - if (error.Fail() || domain_str_value == LLDB_INVALID_ADDRESS) - return false; - - if (!domain_str_value) - { - stream.Printf("domain: nil - code: %" PRIu64, code); - return true; - } - - InferiorSizedWord isw(domain_str_value, *process_sp); - - ValueObjectSP domain_str_sp = ValueObject::CreateValueObjectFromData("domain_str", isw.GetAsData(process_sp->GetByteOrder()), valobj.GetExecutionContextRef(), process_sp->GetTarget().GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeVoid).GetPointerType()); - - if (!domain_str_sp) - return false; - - StreamString domain_str_summary; - if (NSStringSummaryProvider(*domain_str_sp, domain_str_summary, options) && !domain_str_summary.Empty()) - { - stream.Printf("domain: %s - code: %" PRIu64, domain_str_summary.GetData(), code); - return true; - } - else - { - stream.Printf("domain: nil - code: %" PRIu64, code); - return true; - } -} + lldb::addr_t userinfo = + process_sp->ReadPointerFromMemory(userinfo_location, error); + if (userinfo == LLDB_INVALID_ADDRESS || error.Fail()) + return false; + InferiorSizedWord isw(userinfo, *process_sp); + m_child_sp = CreateValueObjectFromData( + "_userInfo", isw.GetAsData(process_sp->GetByteOrder()), + m_backend.GetExecutionContextRef(), + process_sp->GetTarget().GetScratchClangASTContext()->GetBasicType( + lldb::eBasicTypeObjCID)); + return false; + } -class NSErrorSyntheticFrontEnd : public SyntheticChildrenFrontEnd -{ -public: - NSErrorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp) - {} - - ~NSErrorSyntheticFrontEnd() override = default; - // no need to delete m_child_ptr - it's kept alive by the cluster manager on our behalf - - size_t - CalculateNumChildren() override - { - if (m_child_ptr) - return 1; - if (m_child_sp) - return 1; - return 0; - } - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override - { - if (idx != 0) - return lldb::ValueObjectSP(); - - if (m_child_ptr) - return m_child_ptr->GetSP(); - return m_child_sp; - } - - bool - Update() override - { - m_child_ptr = nullptr; - m_child_sp.reset(); - - ProcessSP process_sp(m_backend.GetProcessSP()); - if (!process_sp) - return false; - - lldb::addr_t userinfo_location = DerefToNSErrorPointer(m_backend); - if (userinfo_location == LLDB_INVALID_ADDRESS) - return false; - - size_t ptr_size = process_sp->GetAddressByteSize(); - - userinfo_location += 4 * ptr_size; - Error error; - lldb::addr_t userinfo = process_sp->ReadPointerFromMemory(userinfo_location, error); - if (userinfo == LLDB_INVALID_ADDRESS || error.Fail()) - return false; - InferiorSizedWord isw(userinfo,*process_sp); - m_child_sp = CreateValueObjectFromData("_userInfo", - isw.GetAsData(process_sp->GetByteOrder()), - m_backend.GetExecutionContextRef(), - process_sp->GetTarget().GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeObjCID)); - return false; - } - - bool - MightHaveChildren() override - { - return true; - } - - size_t - GetIndexOfChildWithName(const ConstString &name) override - { - static ConstString g___userInfo("_userInfo"); - if (name == g___userInfo) - return 0; - return UINT32_MAX; - } + bool MightHaveChildren() override { return true; } + + size_t GetIndexOfChildWithName(const ConstString &name) override { + static ConstString g___userInfo("_userInfo"); + if (name == g___userInfo) + return 0; + return UINT32_MAX; + } private: - // the child here can be "real" (i.e. an actual child of the root) or synthetized from raw memory - // if the former, I need to store a plain pointer to it - or else a loop of references will cause this entire hierarchy of values to leak - // if the latter, then I need to store a SharedPointer to it - so that it only goes away when everyone else in the cluster goes away - // oh joy! - ValueObject* m_child_ptr; - ValueObjectSP m_child_sp; + // the child here can be "real" (i.e. an actual child of the root) or + // synthetized from raw memory + // if the former, I need to store a plain pointer to it - or else a loop of + // references will cause this entire hierarchy of values to leak + // if the latter, then I need to store a SharedPointer to it - so that it only + // goes away when everyone else in the cluster goes away + // oh joy! + ValueObject *m_child_ptr; + ValueObjectSP m_child_sp; }; -SyntheticChildrenFrontEnd* -lldb_private::formatters::NSErrorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); - if (!process_sp) - return nullptr; - ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - if (!runtime) - return nullptr; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get())); - - if (!descriptor.get() || !descriptor->IsValid()) - return nullptr; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return nullptr; - - if (!strcmp(class_name,"NSError")) - return (new NSErrorSyntheticFrontEnd(valobj_sp)); - else if (!strcmp(class_name,"__NSCFError")) - return (new NSErrorSyntheticFrontEnd(valobj_sp)); - +SyntheticChildrenFrontEnd * +lldb_private::formatters::NSErrorSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) + return nullptr; + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + if (!runtime) + return nullptr; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(*valobj_sp.get())); + + if (!descriptor.get() || !descriptor->IsValid()) return nullptr; + + const char *class_name = descriptor->GetClassName().GetCString(); + + if (!class_name || !*class_name) + return nullptr; + + if (!strcmp(class_name, "NSError")) + return (new NSErrorSyntheticFrontEnd(valobj_sp)); + else if (!strcmp(class_name, "__NSCFError")) + return (new NSErrorSyntheticFrontEnd(valobj_sp)); + + return nullptr; } diff --git a/lldb/source/Plugins/Language/ObjC/NSException.cpp b/lldb/source/Plugins/Language/ObjC/NSException.cpp index f70e7c7356e..1609048d432 100644 --- a/lldb/source/Plugins/Language/ObjC/NSException.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSException.cpp @@ -34,186 +34,183 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -bool -lldb_private::formatters::NSException_SummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - ProcessSP process_sp(valobj.GetProcessSP()); +bool lldb_private::formatters::NSException_SummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + ProcessSP process_sp(valobj.GetProcessSP()); + if (!process_sp) + return false; + + lldb::addr_t ptr_value = LLDB_INVALID_ADDRESS; + + CompilerType valobj_type(valobj.GetCompilerType()); + Flags type_flags(valobj_type.GetTypeInfo()); + if (type_flags.AllClear(eTypeHasValue)) { + if (valobj.IsBaseClass() && valobj.GetParent()) + ptr_value = valobj.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS); + } else + ptr_value = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); + + if (ptr_value == LLDB_INVALID_ADDRESS) + return false; + size_t ptr_size = process_sp->GetAddressByteSize(); + lldb::addr_t name_location = ptr_value + 1 * ptr_size; + lldb::addr_t reason_location = ptr_value + 2 * ptr_size; + + Error error; + lldb::addr_t name = process_sp->ReadPointerFromMemory(name_location, error); + if (error.Fail() || name == LLDB_INVALID_ADDRESS) + return false; + + lldb::addr_t reason = + process_sp->ReadPointerFromMemory(reason_location, error); + if (error.Fail() || reason == LLDB_INVALID_ADDRESS) + return false; + + InferiorSizedWord name_isw(name, *process_sp); + InferiorSizedWord reason_isw(reason, *process_sp); + + CompilerType voidstar = process_sp->GetTarget() + .GetScratchClangASTContext() + ->GetBasicType(lldb::eBasicTypeVoid) + .GetPointerType(); + + ValueObjectSP name_sp = ValueObject::CreateValueObjectFromData( + "name_str", name_isw.GetAsData(process_sp->GetByteOrder()), + valobj.GetExecutionContextRef(), voidstar); + ValueObjectSP reason_sp = ValueObject::CreateValueObjectFromData( + "reason_str", reason_isw.GetAsData(process_sp->GetByteOrder()), + valobj.GetExecutionContextRef(), voidstar); + + if (!name_sp || !reason_sp) + return false; + + StreamString name_str_summary; + StreamString reason_str_summary; + if (NSStringSummaryProvider(*name_sp, name_str_summary, options) && + NSStringSummaryProvider(*reason_sp, reason_str_summary, options) && + !name_str_summary.Empty() && !reason_str_summary.Empty()) { + stream.Printf("name: %s - reason: %s", name_str_summary.GetData(), + reason_str_summary.GetData()); + return true; + } else + return false; +} + +class NSExceptionSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSExceptionSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp) {} + + ~NSExceptionSyntheticFrontEnd() override = default; + // no need to delete m_child_ptr - it's kept alive by the cluster manager on + // our behalf + + size_t CalculateNumChildren() override { + if (m_child_ptr) + return 1; + if (m_child_sp) + return 1; + return 0; + } + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override { + if (idx != 0) + return lldb::ValueObjectSP(); + + if (m_child_ptr) + return m_child_ptr->GetSP(); + return m_child_sp; + } + + bool Update() override { + m_child_ptr = nullptr; + m_child_sp.reset(); + + ProcessSP process_sp(m_backend.GetProcessSP()); if (!process_sp) - return false; - - lldb::addr_t ptr_value = LLDB_INVALID_ADDRESS; - - CompilerType valobj_type(valobj.GetCompilerType()); + return false; + + lldb::addr_t userinfo_location = LLDB_INVALID_ADDRESS; + + CompilerType valobj_type(m_backend.GetCompilerType()); Flags type_flags(valobj_type.GetTypeInfo()); - if (type_flags.AllClear(eTypeHasValue)) - { - if (valobj.IsBaseClass() && valobj.GetParent()) - ptr_value = valobj.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS); - } - else - ptr_value = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); - - if (ptr_value == LLDB_INVALID_ADDRESS) - return false; + if (type_flags.AllClear(eTypeHasValue)) { + if (m_backend.IsBaseClass() && m_backend.GetParent()) + userinfo_location = + m_backend.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS); + } else + userinfo_location = m_backend.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); + + if (userinfo_location == LLDB_INVALID_ADDRESS) + return false; + size_t ptr_size = process_sp->GetAddressByteSize(); - lldb::addr_t name_location = ptr_value + 1 * ptr_size; - lldb::addr_t reason_location = ptr_value + 2 * ptr_size; - + + userinfo_location += 3 * ptr_size; Error error; - lldb::addr_t name = process_sp->ReadPointerFromMemory(name_location, error); - if (error.Fail() || name == LLDB_INVALID_ADDRESS) - return false; - - lldb::addr_t reason = process_sp->ReadPointerFromMemory(reason_location, error); - if (error.Fail() || reason == LLDB_INVALID_ADDRESS) - return false; - - InferiorSizedWord name_isw(name, *process_sp); - InferiorSizedWord reason_isw(reason, *process_sp); - - CompilerType voidstar = process_sp->GetTarget().GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeVoid).GetPointerType(); - - ValueObjectSP name_sp = ValueObject::CreateValueObjectFromData("name_str", name_isw.GetAsData(process_sp->GetByteOrder()), valobj.GetExecutionContextRef(), voidstar); - ValueObjectSP reason_sp = ValueObject::CreateValueObjectFromData("reason_str", reason_isw.GetAsData(process_sp->GetByteOrder()), valobj.GetExecutionContextRef(), voidstar); - - if (!name_sp || !reason_sp) - return false; - - StreamString name_str_summary; - StreamString reason_str_summary; - if (NSStringSummaryProvider(*name_sp, name_str_summary, options) && - NSStringSummaryProvider(*reason_sp, reason_str_summary, options) && - !name_str_summary.Empty() && - !reason_str_summary.Empty()) - { - stream.Printf("name: %s - reason: %s", name_str_summary.GetData(), reason_str_summary.GetData()); - return true; - } - else - return false; -} + lldb::addr_t userinfo = + process_sp->ReadPointerFromMemory(userinfo_location, error); + if (userinfo == LLDB_INVALID_ADDRESS || error.Fail()) + return false; + InferiorSizedWord isw(userinfo, *process_sp); + m_child_sp = CreateValueObjectFromData( + "userInfo", isw.GetAsData(process_sp->GetByteOrder()), + m_backend.GetExecutionContextRef(), + process_sp->GetTarget().GetScratchClangASTContext()->GetBasicType( + lldb::eBasicTypeObjCID)); + return false; + } -class NSExceptionSyntheticFrontEnd : public SyntheticChildrenFrontEnd -{ -public: - NSExceptionSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp) - {} - - ~NSExceptionSyntheticFrontEnd() override = default; - // no need to delete m_child_ptr - it's kept alive by the cluster manager on our behalf - - size_t - CalculateNumChildren() override - { - if (m_child_ptr) - return 1; - if (m_child_sp) - return 1; - return 0; - } - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override - { - if (idx != 0) - return lldb::ValueObjectSP(); - - if (m_child_ptr) - return m_child_ptr->GetSP(); - return m_child_sp; - } - - bool - Update() override - { - m_child_ptr = nullptr; - m_child_sp.reset(); - - ProcessSP process_sp(m_backend.GetProcessSP()); - if (!process_sp) - return false; - - lldb::addr_t userinfo_location = LLDB_INVALID_ADDRESS; - - CompilerType valobj_type(m_backend.GetCompilerType()); - Flags type_flags(valobj_type.GetTypeInfo()); - if (type_flags.AllClear(eTypeHasValue)) - { - if (m_backend.IsBaseClass() && m_backend.GetParent()) - userinfo_location = m_backend.GetParent()->GetValueAsUnsigned(LLDB_INVALID_ADDRESS); - } - else - userinfo_location = m_backend.GetValueAsUnsigned(LLDB_INVALID_ADDRESS); - - if (userinfo_location == LLDB_INVALID_ADDRESS) - return false; - - size_t ptr_size = process_sp->GetAddressByteSize(); - - userinfo_location += 3 * ptr_size; - Error error; - lldb::addr_t userinfo = process_sp->ReadPointerFromMemory(userinfo_location, error); - if (userinfo == LLDB_INVALID_ADDRESS || error.Fail()) - return false; - InferiorSizedWord isw(userinfo,*process_sp); - m_child_sp = CreateValueObjectFromData("userInfo", - isw.GetAsData(process_sp->GetByteOrder()), - m_backend.GetExecutionContextRef(), - process_sp->GetTarget().GetScratchClangASTContext()->GetBasicType(lldb::eBasicTypeObjCID)); - return false; - } - - bool - MightHaveChildren() override - { - return true; - } - - size_t - GetIndexOfChildWithName(const ConstString &name) override - { - static ConstString g___userInfo("userInfo"); - if (name == g___userInfo) - return 0; - return UINT32_MAX; - } + bool MightHaveChildren() override { return true; } + + size_t GetIndexOfChildWithName(const ConstString &name) override { + static ConstString g___userInfo("userInfo"); + if (name == g___userInfo) + return 0; + return UINT32_MAX; + } private: - // the child here can be "real" (i.e. an actual child of the root) or synthetized from raw memory - // if the former, I need to store a plain pointer to it - or else a loop of references will cause this entire hierarchy of values to leak - // if the latter, then I need to store a SharedPointer to it - so that it only goes away when everyone else in the cluster goes away - // oh joy! - ValueObject* m_child_ptr; - ValueObjectSP m_child_sp; + // the child here can be "real" (i.e. an actual child of the root) or + // synthetized from raw memory + // if the former, I need to store a plain pointer to it - or else a loop of + // references will cause this entire hierarchy of values to leak + // if the latter, then I need to store a SharedPointer to it - so that it only + // goes away when everyone else in the cluster goes away + // oh joy! + ValueObject *m_child_ptr; + ValueObjectSP m_child_sp; }; -SyntheticChildrenFrontEnd* -lldb_private::formatters::NSExceptionSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); - if (!process_sp) - return nullptr; - ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - if (!runtime) - return nullptr; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get())); - - if (!descriptor.get() || !descriptor->IsValid()) - return nullptr; - - const char* class_name = descriptor->GetClassName().GetCString(); - - if (!class_name || !*class_name) - return nullptr; - - if (!strcmp(class_name,"NSException")) - return (new NSExceptionSyntheticFrontEnd(valobj_sp)); - else if (!strcmp(class_name,"NSCFException")) - return (new NSExceptionSyntheticFrontEnd(valobj_sp)); - else if (!strcmp(class_name,"__NSCFException")) - return (new NSExceptionSyntheticFrontEnd(valobj_sp)); - +SyntheticChildrenFrontEnd * +lldb_private::formatters::NSExceptionSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) return nullptr; + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + if (!runtime) + return nullptr; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(*valobj_sp.get())); + + if (!descriptor.get() || !descriptor->IsValid()) + return nullptr; + + const char *class_name = descriptor->GetClassName().GetCString(); + + if (!class_name || !*class_name) + return nullptr; + + if (!strcmp(class_name, "NSException")) + return (new NSExceptionSyntheticFrontEnd(valobj_sp)); + else if (!strcmp(class_name, "NSCFException")) + return (new NSExceptionSyntheticFrontEnd(valobj_sp)); + else if (!strcmp(class_name, "__NSCFException")) + return (new NSExceptionSyntheticFrontEnd(valobj_sp)); + + return nullptr; } diff --git a/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp b/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp index 0bebaca256b..d169334f537 100644 --- a/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp @@ -26,371 +26,299 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -static constexpr size_t -PACKED_INDEX_SHIFT_64(size_t i) -{ - return (60 - (13 * (4-i))); +static constexpr size_t PACKED_INDEX_SHIFT_64(size_t i) { + return (60 - (13 * (4 - i))); } -static constexpr size_t -PACKED_INDEX_SHIFT_32(size_t i) -{ - return (32 - (13 * (2-i))); +static constexpr size_t PACKED_INDEX_SHIFT_32(size_t i) { + return (32 - (13 * (2 - i))); } -class NSIndexPathSyntheticFrontEnd : public SyntheticChildrenFrontEnd -{ +class NSIndexPathSyntheticFrontEnd : public SyntheticChildrenFrontEnd { public: - NSIndexPathSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd (*valobj_sp.get()), - m_descriptor_sp(nullptr), - m_impl(), - m_ptr_size(0), - m_uint_star_type() - { - m_ptr_size = m_backend.GetTargetSP()->GetArchitecture().GetAddressByteSize(); - } + NSIndexPathSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp.get()), m_descriptor_sp(nullptr), + m_impl(), m_ptr_size(0), m_uint_star_type() { + m_ptr_size = + m_backend.GetTargetSP()->GetArchitecture().GetAddressByteSize(); + } - ~NSIndexPathSyntheticFrontEnd() override = default; + ~NSIndexPathSyntheticFrontEnd() override = default; - size_t - CalculateNumChildren() override - { - return m_impl.GetNumIndexes(); - } - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override - { - return m_impl.GetIndexAtIndex(idx, m_uint_star_type); - } - - bool - Update() override - { - m_impl.Clear(); - - TypeSystem* type_system = m_backend.GetCompilerType().GetTypeSystem(); - if (!type_system) - return false; - - ClangASTContext *ast = m_backend.GetExecutionContextRef().GetTargetSP()->GetScratchClangASTContext(); - if (!ast) - return false; - - m_uint_star_type = ast->GetPointerSizedIntType(false); - - static ConstString g__indexes("_indexes"); - static ConstString g__length("_length"); - - ProcessSP process_sp = m_backend.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(m_backend)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint64_t info_bits(0),value_bits(0),payload(0); - - if (descriptor->GetTaggedPointerInfo(&info_bits, &value_bits, &payload)) - { - m_impl.m_inlined.SetIndexes(payload, *process_sp); - m_impl.m_mode = Mode::Inlined; + size_t CalculateNumChildren() override { return m_impl.GetNumIndexes(); } + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override { + return m_impl.GetIndexAtIndex(idx, m_uint_star_type); + } + + bool Update() override { + m_impl.Clear(); + + TypeSystem *type_system = m_backend.GetCompilerType().GetTypeSystem(); + if (!type_system) + return false; + + ClangASTContext *ast = m_backend.GetExecutionContextRef() + .GetTargetSP() + ->GetScratchClangASTContext(); + if (!ast) + return false; + + m_uint_star_type = ast->GetPointerSizedIntType(false); + + static ConstString g__indexes("_indexes"); + static ConstString g__length("_length"); + + ProcessSP process_sp = m_backend.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(m_backend)); + + if (!descriptor.get() || !descriptor->IsValid()) + return false; + + uint64_t info_bits(0), value_bits(0), payload(0); + + if (descriptor->GetTaggedPointerInfo(&info_bits, &value_bits, &payload)) { + m_impl.m_inlined.SetIndexes(payload, *process_sp); + m_impl.m_mode = Mode::Inlined; + } else { + ObjCLanguageRuntime::ClassDescriptor::iVarDescriptor _indexes_id; + ObjCLanguageRuntime::ClassDescriptor::iVarDescriptor _length_id; + + bool has_indexes(false), has_length(false); + + for (size_t x = 0; x < descriptor->GetNumIVars(); x++) { + const auto &ivar = descriptor->GetIVarAtIndex(x); + if (ivar.m_name == g__indexes) { + _indexes_id = ivar; + has_indexes = true; + } else if (ivar.m_name == g__length) { + _length_id = ivar; + has_length = true; } - else - { - ObjCLanguageRuntime::ClassDescriptor::iVarDescriptor _indexes_id; - ObjCLanguageRuntime::ClassDescriptor::iVarDescriptor _length_id; - - bool has_indexes(false),has_length(false); - - for (size_t x = 0; - x < descriptor->GetNumIVars(); - x++) - { - const auto& ivar = descriptor->GetIVarAtIndex(x); - if (ivar.m_name == g__indexes) - { - _indexes_id = ivar; - has_indexes = true; - } - else if (ivar.m_name == g__length) - { - _length_id = ivar; - has_length = true; - } - - if (has_length && has_indexes) - break; - } - - if (has_length && has_indexes) - { - m_impl.m_outsourced.m_indexes = m_backend.GetSyntheticChildAtOffset(_indexes_id.m_offset, - m_uint_star_type.GetPointerType(), - true).get(); - ValueObjectSP length_sp(m_backend.GetSyntheticChildAtOffset(_length_id.m_offset, - m_uint_star_type, - true)); - if (length_sp) - { - m_impl.m_outsourced.m_count = length_sp->GetValueAsUnsigned(0); - if (m_impl.m_outsourced.m_indexes) - m_impl.m_mode = Mode::Outsourced; - } - } + + if (has_length && has_indexes) + break; + } + + if (has_length && has_indexes) { + m_impl.m_outsourced.m_indexes = + m_backend + .GetSyntheticChildAtOffset(_indexes_id.m_offset, + m_uint_star_type.GetPointerType(), + true) + .get(); + ValueObjectSP length_sp(m_backend.GetSyntheticChildAtOffset( + _length_id.m_offset, m_uint_star_type, true)); + if (length_sp) { + m_impl.m_outsourced.m_count = length_sp->GetValueAsUnsigned(0); + if (m_impl.m_outsourced.m_indexes) + m_impl.m_mode = Mode::Outsourced; } - return false; - } - - bool - MightHaveChildren() override - { - if (m_impl.m_mode == Mode::Invalid) - return false; - return true; + } } - - size_t - GetIndexOfChildWithName(const ConstString &name) override - { - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; + return false; + } + + bool MightHaveChildren() override { + if (m_impl.m_mode == Mode::Invalid) + return false; + return true; + } + + size_t GetIndexOfChildWithName(const ConstString &name) override { + const char *item_name = name.GetCString(); + uint32_t idx = ExtractIndexFromString(item_name); + if (idx < UINT32_MAX && idx >= CalculateNumChildren()) + return UINT32_MAX; + return idx; + } + + lldb::ValueObjectSP GetSyntheticValue() override { return nullptr; } + +protected: + ObjCLanguageRuntime::ClassDescriptorSP m_descriptor_sp; + + enum class Mode { Inlined, Outsourced, Invalid }; + + struct Impl { + size_t GetNumIndexes() { + switch (m_mode) { + case Mode::Inlined: + return m_inlined.GetNumIndexes(); + case Mode::Outsourced: + return m_outsourced.m_count; + default: + return 0; + } } - - lldb::ValueObjectSP - GetSyntheticValue() override - { + + lldb::ValueObjectSP GetIndexAtIndex(size_t idx, + const CompilerType &desired_type) { + if (idx >= GetNumIndexes()) return nullptr; + switch (m_mode) { + default: + return nullptr; + case Mode::Inlined: + return m_inlined.GetIndexAtIndex(idx, desired_type); + case Mode::Outsourced: + return m_outsourced.GetIndexAtIndex(idx); + } } -protected: - ObjCLanguageRuntime::ClassDescriptorSP m_descriptor_sp; - - enum class Mode { - Inlined, - Outsourced, - Invalid - }; - - struct Impl - { - size_t - GetNumIndexes () - { - switch (m_mode) - { - case Mode::Inlined: - return m_inlined.GetNumIndexes(); - case Mode::Outsourced: - return m_outsourced.m_count; - default: - return 0; - } - } - - lldb::ValueObjectSP - GetIndexAtIndex (size_t idx, const CompilerType& desired_type) - { - if (idx >= GetNumIndexes()) - return nullptr; - switch (m_mode) - { - default: return nullptr; - case Mode::Inlined: - return m_inlined.GetIndexAtIndex (idx, desired_type); - case Mode::Outsourced: - return m_outsourced.GetIndexAtIndex (idx); - } + struct InlinedIndexes { + public: + void SetIndexes(uint64_t value, Process &p) { + m_indexes = value; + _lengthForInlinePayload(p.GetAddressByteSize()); + m_process = &p; + } + + size_t GetNumIndexes() { return m_count; } + + lldb::ValueObjectSP GetIndexAtIndex(size_t idx, + const CompilerType &desired_type) { + if (!m_process) + return nullptr; + + std::pair<uint64_t, bool> value(_indexAtPositionForInlinePayload(idx)); + if (!value.second) + return nullptr; + + Value v; + if (m_ptr_size == 8) { + Scalar scalar((unsigned long long)value.first); + v = Value(scalar); + } else { + Scalar scalar((unsigned int)value.first); + v = Value(scalar); } - - struct InlinedIndexes - { - public: - void SetIndexes(uint64_t value, Process& p) - { - m_indexes = value; - _lengthForInlinePayload(p.GetAddressByteSize()); - m_process = &p; - } - - size_t - GetNumIndexes () - { - return m_count; - } - - lldb::ValueObjectSP - GetIndexAtIndex (size_t idx, const CompilerType& desired_type) - { - if (!m_process) - return nullptr; - - std::pair<uint64_t, bool> value(_indexAtPositionForInlinePayload(idx)); - if (!value.second) - return nullptr; - - Value v; - if (m_ptr_size == 8) - { - Scalar scalar( (unsigned long long)value.first ); - v = Value(scalar); - } - else - { - Scalar scalar( (unsigned int)value.first ); - v = Value(scalar); - } - - v.SetCompilerType(desired_type); - - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - - return ValueObjectConstResult::Create(m_process, v, ConstString(idx_name.GetData())); - } - - void - Clear () - { - m_indexes = 0; - m_count = 0; - m_ptr_size = 0; - m_process = nullptr; - } - - InlinedIndexes () : - m_indexes(0), - m_count(0), - m_ptr_size(0), - m_process(nullptr) - { - } - - private: - uint64_t m_indexes; - size_t m_count; - uint32_t m_ptr_size; - Process *m_process; - - // cfr. Foundation for the details of this code - size_t _lengthForInlinePayload(uint32_t ptr_size) { - m_ptr_size = ptr_size; - if (m_ptr_size == 8) - m_count = ((m_indexes >> 3) & 0x7); - else - m_count = ((m_indexes >> 3) & 0x3); - return m_count; - } - - std::pair<uint64_t, bool> - _indexAtPositionForInlinePayload(size_t pos) - { - static const uint64_t PACKED_INDEX_MASK = ((1 << 13) - 1); - if (m_ptr_size == 8) - { - switch (pos) - { - case 3: - case 2: - case 1: - case 0: - return {(m_indexes >> PACKED_INDEX_SHIFT_64(pos)) & PACKED_INDEX_MASK,true}; - default: - return {0,false}; - } - } - else - { - switch (pos) - { - case 0: - case 1: - return {(m_indexes >> PACKED_INDEX_SHIFT_32(pos)) & PACKED_INDEX_MASK,true}; - default: - return {0,false}; - } - } - return {0,false}; - } - - }; - - struct OutsourcedIndexes - { - lldb::ValueObjectSP - GetIndexAtIndex (size_t idx) - { - if (m_indexes) - { - ValueObjectSP index_sp(m_indexes->GetSyntheticArrayMember(idx, true)); - return index_sp; - } - return nullptr; - } - - void - Clear () - { - m_indexes = nullptr; - m_count = 0; - } - - OutsourcedIndexes () : - m_indexes(nullptr), - m_count(0) - { - } - - ValueObject *m_indexes; - size_t m_count; - }; - - union - { - struct InlinedIndexes m_inlined; - struct OutsourcedIndexes m_outsourced; - }; - - void - Clear () - { - m_mode = Mode::Invalid; - m_inlined.Clear(); - m_outsourced.Clear(); + + v.SetCompilerType(desired_type); + + StreamString idx_name; + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); + + return ValueObjectConstResult::Create(m_process, v, + ConstString(idx_name.GetData())); + } + + void Clear() { + m_indexes = 0; + m_count = 0; + m_ptr_size = 0; + m_process = nullptr; + } + + InlinedIndexes() + : m_indexes(0), m_count(0), m_ptr_size(0), m_process(nullptr) {} + + private: + uint64_t m_indexes; + size_t m_count; + uint32_t m_ptr_size; + Process *m_process; + + // cfr. Foundation for the details of this code + size_t _lengthForInlinePayload(uint32_t ptr_size) { + m_ptr_size = ptr_size; + if (m_ptr_size == 8) + m_count = ((m_indexes >> 3) & 0x7); + else + m_count = ((m_indexes >> 3) & 0x3); + return m_count; + } + + std::pair<uint64_t, bool> _indexAtPositionForInlinePayload(size_t pos) { + static const uint64_t PACKED_INDEX_MASK = ((1 << 13) - 1); + if (m_ptr_size == 8) { + switch (pos) { + case 3: + case 2: + case 1: + case 0: + return {(m_indexes >> PACKED_INDEX_SHIFT_64(pos)) & + PACKED_INDEX_MASK, + true}; + default: + return {0, false}; + } + } else { + switch (pos) { + case 0: + case 1: + return {(m_indexes >> PACKED_INDEX_SHIFT_32(pos)) & + PACKED_INDEX_MASK, + true}; + default: + return {0, false}; + } } - - Impl() : - m_mode(Mode::Invalid) - { + return {0, false}; + } + }; + + struct OutsourcedIndexes { + lldb::ValueObjectSP GetIndexAtIndex(size_t idx) { + if (m_indexes) { + ValueObjectSP index_sp(m_indexes->GetSyntheticArrayMember(idx, true)); + return index_sp; } - - Mode m_mode; - } m_impl; - - uint32_t m_ptr_size; - CompilerType m_uint_star_type; + return nullptr; + } + + void Clear() { + m_indexes = nullptr; + m_count = 0; + } + + OutsourcedIndexes() : m_indexes(nullptr), m_count(0) {} + + ValueObject *m_indexes; + size_t m_count; + }; + + union { + struct InlinedIndexes m_inlined; + struct OutsourcedIndexes m_outsourced; + }; + + void Clear() { + m_mode = Mode::Invalid; + m_inlined.Clear(); + m_outsourced.Clear(); + } + + Impl() : m_mode(Mode::Invalid) {} + + Mode m_mode; + } m_impl; + + uint32_t m_ptr_size; + CompilerType m_uint_star_type; }; namespace lldb_private { - namespace formatters { - - SyntheticChildrenFrontEnd* NSIndexPathSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) - { - if (valobj_sp) - return new NSIndexPathSyntheticFrontEnd(valobj_sp); - return nullptr; - } +namespace formatters { + +SyntheticChildrenFrontEnd * +NSIndexPathSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP valobj_sp) { + if (valobj_sp) + return new NSIndexPathSyntheticFrontEnd(valobj_sp); + return nullptr; +} - } // namespace formatters +} // namespace formatters } // namespace lldb_private diff --git a/lldb/source/Plugins/Language/ObjC/NSSet.cpp b/lldb/source/Plugins/Language/ObjC/NSSet.cpp index 315771045ba..a9ca98c7f85 100644 --- a/lldb/source/Plugins/Language/ObjC/NSSet.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSSet.cpp @@ -29,636 +29,572 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -std::map<ConstString, CXXFunctionSummaryFormat::Callback>& -NSSet_Additionals::GetAdditionalSummaries () -{ - static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map; - return g_map; +std::map<ConstString, CXXFunctionSummaryFormat::Callback> & +NSSet_Additionals::GetAdditionalSummaries() { + static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map; + return g_map; } -std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>& -NSSet_Additionals::GetAdditionalSynthetics () -{ - static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> g_map; - return g_map; +std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> & +NSSet_Additionals::GetAdditionalSynthetics() { + static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> + g_map; + return g_map; } namespace lldb_private { - namespace formatters { - class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSSetISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~NSSetISyntheticFrontEnd() override; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - private: - struct DataDescriptor_32 - { - uint32_t _used : 26; - uint32_t _szidx : 6; - }; - - struct DataDescriptor_64 - { - uint64_t _used : 58; - uint32_t _szidx : 6; - }; - - struct SetItemDescriptor - { - lldb::addr_t item_ptr; - lldb::ValueObjectSP valobj_sp; - }; - - ExecutionContextRef m_exe_ctx_ref; - uint8_t m_ptr_size; - DataDescriptor_32 *m_data_32; - DataDescriptor_64 *m_data_64; - lldb::addr_t m_data_ptr; - std::vector<SetItemDescriptor> m_children; - }; - - class NSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSSetMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~NSSetMSyntheticFrontEnd() override; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - private: - struct DataDescriptor_32 - { - uint32_t _used : 26; - uint32_t _size; - uint32_t _mutations; - uint32_t _objs_addr; - }; - - struct DataDescriptor_64 - { - uint64_t _used : 58; - uint64_t _size; - uint64_t _mutations; - uint64_t _objs_addr; - }; - - struct SetItemDescriptor - { - lldb::addr_t item_ptr; - lldb::ValueObjectSP valobj_sp; - }; - - ExecutionContextRef m_exe_ctx_ref; - uint8_t m_ptr_size; - DataDescriptor_32 *m_data_32; - DataDescriptor_64 *m_data_64; - std::vector<SetItemDescriptor> m_children; - }; - - class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - NSSetCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp); - - ~NSSetCodeRunningSyntheticFrontEnd() override; - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - }; - } // namespace formatters +namespace formatters { +class NSSetISyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSSetISyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~NSSetISyntheticFrontEnd() override; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +private: + struct DataDescriptor_32 { + uint32_t _used : 26; + uint32_t _szidx : 6; + }; + + struct DataDescriptor_64 { + uint64_t _used : 58; + uint32_t _szidx : 6; + }; + + struct SetItemDescriptor { + lldb::addr_t item_ptr; + lldb::ValueObjectSP valobj_sp; + }; + + ExecutionContextRef m_exe_ctx_ref; + uint8_t m_ptr_size; + DataDescriptor_32 *m_data_32; + DataDescriptor_64 *m_data_64; + lldb::addr_t m_data_ptr; + std::vector<SetItemDescriptor> m_children; +}; + +class NSSetMSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSSetMSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~NSSetMSyntheticFrontEnd() override; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; + +private: + struct DataDescriptor_32 { + uint32_t _used : 26; + uint32_t _size; + uint32_t _mutations; + uint32_t _objs_addr; + }; + + struct DataDescriptor_64 { + uint64_t _used : 58; + uint64_t _size; + uint64_t _mutations; + uint64_t _objs_addr; + }; + + struct SetItemDescriptor { + lldb::addr_t item_ptr; + lldb::ValueObjectSP valobj_sp; + }; + + ExecutionContextRef m_exe_ctx_ref; + uint8_t m_ptr_size; + DataDescriptor_32 *m_data_32; + DataDescriptor_64 *m_data_64; + std::vector<SetItemDescriptor> m_children; +}; + +class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + NSSetCodeRunningSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); + + ~NSSetCodeRunningSyntheticFrontEnd() override; + + size_t CalculateNumChildren() override; + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override; + + bool Update() override; + + bool MightHaveChildren() override; + + size_t GetIndexOfChildWithName(const ConstString &name) override; +}; +} // namespace formatters } // namespace lldb_private -template<bool cf_style> -bool -lldb_private::formatters::NSSetSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - static ConstString g_TypeHint("NSSet"); - - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - bool is_64bit = (ptr_size == 8); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - uint64_t value = 0; - - ConstString class_name_cs = descriptor->GetClassName(); - const char* class_name = class_name_cs.GetCString(); - - if (!class_name || !*class_name) - return false; - - if (!strcmp(class_name,"__NSSetI")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); - } - else if (!strcmp(class_name,"__NSSetM")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); - } - /*else if (!strcmp(class_name,"__NSCFSet")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? 20 : 12), 4, 0, error); - if (error.Fail()) - return false; - if (is_64bit) - value &= ~0x1fff000000000000UL; - } - else if (!strcmp(class_name,"NSCountedSet")) - { - Error error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error); - if (error.Fail()) - return false; - value = process_sp->ReadUnsignedIntegerFromMemory(value + (is_64bit ? 20 : 12), 4, 0, error); - if (error.Fail()) - return false; - if (is_64bit) - value &= ~0x1fff000000000000UL; - }*/ +template <bool cf_style> +bool lldb_private::formatters::NSSetSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + static ConstString g_TypeHint("NSSet"); + + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + bool is_64bit = (ptr_size == 8); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + uint64_t value = 0; + + ConstString class_name_cs = descriptor->GetClassName(); + const char *class_name = class_name_cs.GetCString(); + + if (!class_name || !*class_name) + return false; + + if (!strcmp(class_name, "__NSSetI")) { + Error error; + value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, + ptr_size, 0, error); + if (error.Fail()) + return false; + value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); + } else if (!strcmp(class_name, "__NSSetM")) { + Error error; + value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, + ptr_size, 0, error); + if (error.Fail()) + return false; + value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); + } + /*else if (!strcmp(class_name,"__NSCFSet")) + { + Error error; + value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? + 20 : 12), 4, 0, error); + if (error.Fail()) + return false; + if (is_64bit) + value &= ~0x1fff000000000000UL; + } + else if (!strcmp(class_name,"NSCountedSet")) + { + Error error; + value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, + ptr_size, 0, error); + if (error.Fail()) + return false; + value = process_sp->ReadUnsignedIntegerFromMemory(value + (is_64bit ? 20 : + 12), 4, 0, error); + if (error.Fail()) + return false; + if (is_64bit) + value &= ~0x1fff000000000000UL; + }*/ + else { + auto &map(NSSet_Additionals::GetAdditionalSummaries()); + auto iter = map.find(class_name_cs), end = map.end(); + if (iter != end) + return iter->second(valobj, stream, options); else - { - auto& map(NSSet_Additionals::GetAdditionalSummaries()); - auto iter = map.find(class_name_cs), end = map.end(); - if (iter != end) - return iter->second(valobj, stream, options); - else - return false; + return false; + } + + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(options.GetLanguage())) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(options.GetLanguage())) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } - } - - stream.Printf("%s%" PRIu64 " %s%s%s", - prefix.c_str(), - value, - "element", - value == 1 ? "" : "s", - suffix.c_str()); - return true; + } + + stream.Printf("%s%" PRIu64 " %s%s%s", prefix.c_str(), value, "element", + value == 1 ? "" : "s", suffix.c_str()); + return true; } -SyntheticChildrenFrontEnd* lldb_private::formatters::NSSetSyntheticFrontEndCreator (CXXSyntheticChildren* synth, lldb::ValueObjectSP valobj_sp) -{ - lldb::ProcessSP process_sp (valobj_sp->GetProcessSP()); - if (!process_sp) - return nullptr; - ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - if (!runtime) - return nullptr; - - CompilerType valobj_type(valobj_sp->GetCompilerType()); - Flags flags(valobj_type.GetTypeInfo()); - - if (flags.IsClear(eTypeIsPointer)) - { - Error error; - valobj_sp = valobj_sp->AddressOf(error); - if (error.Fail() || !valobj_sp) - return nullptr; - } - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp)); - - if (!descriptor || !descriptor->IsValid()) - return nullptr; - - ConstString class_name_cs = descriptor->GetClassName(); - const char* class_name = class_name_cs.GetCString(); - - if (!class_name || !*class_name) - return nullptr; - - if (!strcmp(class_name,"__NSSetI")) - { - return (new NSSetISyntheticFrontEnd(valobj_sp)); - } - else if (!strcmp(class_name,"__NSSetM")) - { - return (new NSSetMSyntheticFrontEnd(valobj_sp)); - } - else - { - auto& map(NSSet_Additionals::GetAdditionalSynthetics()); - auto iter = map.find(class_name_cs), end = map.end(); - if (iter != end) - return iter->second(synth, valobj_sp); - return nullptr; - } +SyntheticChildrenFrontEnd * +lldb_private::formatters::NSSetSyntheticFrontEndCreator( + CXXSyntheticChildren *synth, lldb::ValueObjectSP valobj_sp) { + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) + return nullptr; + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + if (!runtime) + return nullptr; + + CompilerType valobj_type(valobj_sp->GetCompilerType()); + Flags flags(valobj_type.GetTypeInfo()); + + if (flags.IsClear(eTypeIsPointer)) { + Error error; + valobj_sp = valobj_sp->AddressOf(error); + if (error.Fail() || !valobj_sp) + return nullptr; + } + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(*valobj_sp)); + + if (!descriptor || !descriptor->IsValid()) + return nullptr; + + ConstString class_name_cs = descriptor->GetClassName(); + const char *class_name = class_name_cs.GetCString(); + + if (!class_name || !*class_name) + return nullptr; + + if (!strcmp(class_name, "__NSSetI")) { + return (new NSSetISyntheticFrontEnd(valobj_sp)); + } else if (!strcmp(class_name, "__NSSetM")) { + return (new NSSetMSyntheticFrontEnd(valobj_sp)); + } else { + auto &map(NSSet_Additionals::GetAdditionalSynthetics()); + auto iter = map.find(class_name_cs), end = map.end(); + if (iter != end) + return iter->second(synth, valobj_sp); + return nullptr; + } } -lldb_private::formatters::NSSetISyntheticFrontEnd::NSSetISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_exe_ctx_ref(), - m_ptr_size(8), - m_data_32(nullptr), - m_data_64(nullptr) -{ - if (valobj_sp) - Update(); +lldb_private::formatters::NSSetISyntheticFrontEnd::NSSetISyntheticFrontEnd( + lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_ptr_size(8), + m_data_32(nullptr), m_data_64(nullptr) { + if (valobj_sp) + Update(); } -lldb_private::formatters::NSSetISyntheticFrontEnd::~NSSetISyntheticFrontEnd () -{ - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; +lldb_private::formatters::NSSetISyntheticFrontEnd::~NSSetISyntheticFrontEnd() { + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; } size_t -lldb_private::formatters::NSSetISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; +lldb_private::formatters::NSSetISyntheticFrontEnd::GetIndexOfChildWithName( + const ConstString &name) { + const char *item_name = name.GetCString(); + uint32_t idx = ExtractIndexFromString(item_name); + if (idx < UINT32_MAX && idx >= CalculateNumChildren()) + return UINT32_MAX; + return idx; } size_t -lldb_private::formatters::NSSetISyntheticFrontEnd::CalculateNumChildren () -{ - if (!m_data_32 && !m_data_64) - return 0; - return (m_data_32 ? m_data_32->_used : m_data_64->_used); +lldb_private::formatters::NSSetISyntheticFrontEnd::CalculateNumChildren() { + if (!m_data_32 && !m_data_64) + return 0; + return (m_data_32 ? m_data_32->_used : m_data_64->_used); } -bool -lldb_private::formatters::NSSetISyntheticFrontEnd::Update() -{ - m_children.clear(); - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; - m_ptr_size = 0; - ValueObjectSP valobj_sp = m_backend.GetSP(); - if (!valobj_sp) - return false; - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - Error error; - if (valobj_sp->IsPointerType()) - { - valobj_sp = valobj_sp->Dereference(error); - if (error.Fail() || !valobj_sp) - return false; - } - error.Clear(); - lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); - if (!process_sp) - return false; - m_ptr_size = process_sp->GetAddressByteSize(); - uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; - if (m_ptr_size == 4) - { - m_data_32 = new DataDescriptor_32(); - process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); - } - else - { - m_data_64 = new DataDescriptor_64(); - process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); - } - if (error.Fail()) - return false; - m_data_ptr = data_location + m_ptr_size; +bool lldb_private::formatters::NSSetISyntheticFrontEnd::Update() { + m_children.clear(); + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; + m_ptr_size = 0; + ValueObjectSP valobj_sp = m_backend.GetSP(); + if (!valobj_sp) + return false; + if (!valobj_sp) + return false; + m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + Error error; + if (valobj_sp->IsPointerType()) { + valobj_sp = valobj_sp->Dereference(error); + if (error.Fail() || !valobj_sp) + return false; + } + error.Clear(); + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) + return false; + m_ptr_size = process_sp->GetAddressByteSize(); + uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; + if (m_ptr_size == 4) { + m_data_32 = new DataDescriptor_32(); + process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32), + error); + } else { + m_data_64 = new DataDescriptor_64(); + process_sp->ReadMemory(data_location, m_data_64, sizeof(DataDescriptor_64), + error); + } + if (error.Fail()) return false; + m_data_ptr = data_location + m_ptr_size; + return false; } -bool -lldb_private::formatters::NSSetISyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::NSSetISyntheticFrontEnd::MightHaveChildren() { + return true; } lldb::ValueObjectSP -lldb_private::formatters::NSSetISyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - uint32_t num_children = CalculateNumChildren(); - - if (idx >= num_children) +lldb_private::formatters::NSSetISyntheticFrontEnd::GetChildAtIndex(size_t idx) { + uint32_t num_children = CalculateNumChildren(); + + if (idx >= num_children) + return lldb::ValueObjectSP(); + + ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); + if (!process_sp) + return lldb::ValueObjectSP(); + + if (m_children.empty()) { + // do the scan phase + lldb::addr_t obj_at_idx = 0; + + uint32_t tries = 0; + uint32_t test_idx = 0; + + while (tries < num_children) { + obj_at_idx = m_data_ptr + (test_idx * m_ptr_size); + if (!process_sp) return lldb::ValueObjectSP(); - - ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); - if (!process_sp) + Error error; + obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error); + if (error.Fail()) return lldb::ValueObjectSP(); - - if (m_children.empty()) - { - // do the scan phase - lldb::addr_t obj_at_idx = 0; - - uint32_t tries = 0; - uint32_t test_idx = 0; - - while(tries < num_children) - { - obj_at_idx = m_data_ptr + (test_idx * m_ptr_size); - if (!process_sp) - return lldb::ValueObjectSP(); - Error error; - obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - - test_idx++; - - if (!obj_at_idx) - continue; - tries++; - - SetItemDescriptor descriptor = {obj_at_idx,lldb::ValueObjectSP()}; - - m_children.push_back(descriptor); - } + + test_idx++; + + if (!obj_at_idx) + continue; + tries++; + + SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()}; + + m_children.push_back(descriptor); } - - if (idx >= m_children.size()) // should never happen - return lldb::ValueObjectSP(); - - SetItemDescriptor &set_item = m_children[idx]; - if (!set_item.valobj_sp) - { - auto ptr_size = process_sp->GetAddressByteSize(); - DataBufferHeap buffer(ptr_size,0); - switch (ptr_size) - { - case 0: // architecture has no clue?? - fail - return lldb::ValueObjectSP(); - case 4: - *((uint32_t*)buffer.GetBytes()) = (uint32_t)set_item.item_ptr; - break; - case 8: - *((uint64_t*)buffer.GetBytes()) = (uint64_t)set_item.item_ptr; - break; - default: - assert(false && "pointer size is not 4 nor 8 - get out of here ASAP"); - } - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - - DataExtractor data(buffer.GetBytes(), - buffer.GetByteSize(), - process_sp->GetByteOrder(), - process_sp->GetAddressByteSize()); - - set_item.valobj_sp = - CreateValueObjectFromData(idx_name.GetData(), - data, - m_exe_ctx_ref, - m_backend.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeObjCID)); + } + + if (idx >= m_children.size()) // should never happen + return lldb::ValueObjectSP(); + + SetItemDescriptor &set_item = m_children[idx]; + if (!set_item.valobj_sp) { + auto ptr_size = process_sp->GetAddressByteSize(); + DataBufferHeap buffer(ptr_size, 0); + switch (ptr_size) { + case 0: // architecture has no clue?? - fail + return lldb::ValueObjectSP(); + case 4: + *((uint32_t *)buffer.GetBytes()) = (uint32_t)set_item.item_ptr; + break; + case 8: + *((uint64_t *)buffer.GetBytes()) = (uint64_t)set_item.item_ptr; + break; + default: + assert(false && "pointer size is not 4 nor 8 - get out of here ASAP"); } - return set_item.valobj_sp; + StreamString idx_name; + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); + + DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(), + process_sp->GetByteOrder(), + process_sp->GetAddressByteSize()); + + set_item.valobj_sp = CreateValueObjectFromData( + idx_name.GetData(), data, m_exe_ctx_ref, + m_backend.GetCompilerType().GetBasicTypeFromAST( + lldb::eBasicTypeObjCID)); + } + return set_item.valobj_sp; } -lldb_private::formatters::NSSetMSyntheticFrontEnd::NSSetMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_exe_ctx_ref(), - m_ptr_size(8), - m_data_32(nullptr), - m_data_64(nullptr) -{ - if (valobj_sp) - Update (); +lldb_private::formatters::NSSetMSyntheticFrontEnd::NSSetMSyntheticFrontEnd( + lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_ptr_size(8), + m_data_32(nullptr), m_data_64(nullptr) { + if (valobj_sp) + Update(); } -lldb_private::formatters::NSSetMSyntheticFrontEnd::~NSSetMSyntheticFrontEnd () -{ - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; +lldb_private::formatters::NSSetMSyntheticFrontEnd::~NSSetMSyntheticFrontEnd() { + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; } size_t -lldb_private::formatters::NSSetMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) -{ - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; +lldb_private::formatters::NSSetMSyntheticFrontEnd::GetIndexOfChildWithName( + const ConstString &name) { + const char *item_name = name.GetCString(); + uint32_t idx = ExtractIndexFromString(item_name); + if (idx < UINT32_MAX && idx >= CalculateNumChildren()) + return UINT32_MAX; + return idx; } size_t -lldb_private::formatters::NSSetMSyntheticFrontEnd::CalculateNumChildren () -{ - if (!m_data_32 && !m_data_64) - return 0; - return (m_data_32 ? m_data_32->_used : m_data_64->_used); +lldb_private::formatters::NSSetMSyntheticFrontEnd::CalculateNumChildren() { + if (!m_data_32 && !m_data_64) + return 0; + return (m_data_32 ? m_data_32->_used : m_data_64->_used); } -bool -lldb_private::formatters::NSSetMSyntheticFrontEnd::Update() -{ - m_children.clear(); - ValueObjectSP valobj_sp = m_backend.GetSP(); - m_ptr_size = 0; - delete m_data_32; - m_data_32 = nullptr; - delete m_data_64; - m_data_64 = nullptr; - if (!valobj_sp) - return false; - if (!valobj_sp) - return false; - m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); - Error error; - if (valobj_sp->IsPointerType()) - { - valobj_sp = valobj_sp->Dereference(error); - if (error.Fail() || !valobj_sp) - return false; - } - error.Clear(); - lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); - if (!process_sp) - return false; - m_ptr_size = process_sp->GetAddressByteSize(); - uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; - if (m_ptr_size == 4) - { - m_data_32 = new DataDescriptor_32(); - process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error); - } - else - { - m_data_64 = new DataDescriptor_64(); - process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error); - } - if (error.Fail()) - return false; +bool lldb_private::formatters::NSSetMSyntheticFrontEnd::Update() { + m_children.clear(); + ValueObjectSP valobj_sp = m_backend.GetSP(); + m_ptr_size = 0; + delete m_data_32; + m_data_32 = nullptr; + delete m_data_64; + m_data_64 = nullptr; + if (!valobj_sp) + return false; + if (!valobj_sp) + return false; + m_exe_ctx_ref = valobj_sp->GetExecutionContextRef(); + Error error; + if (valobj_sp->IsPointerType()) { + valobj_sp = valobj_sp->Dereference(error); + if (error.Fail() || !valobj_sp) + return false; + } + error.Clear(); + lldb::ProcessSP process_sp(valobj_sp->GetProcessSP()); + if (!process_sp) return false; + m_ptr_size = process_sp->GetAddressByteSize(); + uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size; + if (m_ptr_size == 4) { + m_data_32 = new DataDescriptor_32(); + process_sp->ReadMemory(data_location, m_data_32, sizeof(DataDescriptor_32), + error); + } else { + m_data_64 = new DataDescriptor_64(); + process_sp->ReadMemory(data_location, m_data_64, sizeof(DataDescriptor_64), + error); + } + if (error.Fail()) + return false; + return false; } -bool -lldb_private::formatters::NSSetMSyntheticFrontEnd::MightHaveChildren () -{ - return true; +bool lldb_private::formatters::NSSetMSyntheticFrontEnd::MightHaveChildren() { + return true; } lldb::ValueObjectSP -lldb_private::formatters::NSSetMSyntheticFrontEnd::GetChildAtIndex (size_t idx) -{ - lldb::addr_t m_objs_addr = (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr); - - uint32_t num_children = CalculateNumChildren(); - - if (idx >= num_children) +lldb_private::formatters::NSSetMSyntheticFrontEnd::GetChildAtIndex(size_t idx) { + lldb::addr_t m_objs_addr = + (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr); + + uint32_t num_children = CalculateNumChildren(); + + if (idx >= num_children) + return lldb::ValueObjectSP(); + + ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); + if (!process_sp) + return lldb::ValueObjectSP(); + + if (m_children.empty()) { + // do the scan phase + lldb::addr_t obj_at_idx = 0; + + uint32_t tries = 0; + uint32_t test_idx = 0; + + while (tries < num_children) { + obj_at_idx = m_objs_addr + (test_idx * m_ptr_size); + if (!process_sp) return lldb::ValueObjectSP(); - - ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP(); - if (!process_sp) + Error error; + obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error); + if (error.Fail()) return lldb::ValueObjectSP(); - - if (m_children.empty()) - { - // do the scan phase - lldb::addr_t obj_at_idx = 0; - - uint32_t tries = 0; - uint32_t test_idx = 0; - - while(tries < num_children) - { - obj_at_idx = m_objs_addr + (test_idx * m_ptr_size); - if (!process_sp) - return lldb::ValueObjectSP(); - Error error; - obj_at_idx = process_sp->ReadPointerFromMemory(obj_at_idx, error); - if (error.Fail()) - return lldb::ValueObjectSP(); - - test_idx++; - - if (!obj_at_idx) - continue; - tries++; - - SetItemDescriptor descriptor = {obj_at_idx,lldb::ValueObjectSP()}; - - m_children.push_back(descriptor); - } + + test_idx++; + + if (!obj_at_idx) + continue; + tries++; + + SetItemDescriptor descriptor = {obj_at_idx, lldb::ValueObjectSP()}; + + m_children.push_back(descriptor); } - - if (idx >= m_children.size()) // should never happen - return lldb::ValueObjectSP(); - - SetItemDescriptor &set_item = m_children[idx]; - if (!set_item.valobj_sp) - { - auto ptr_size = process_sp->GetAddressByteSize(); - DataBufferHeap buffer(ptr_size,0); - switch (ptr_size) - { - case 0: // architecture has no clue?? - fail - return lldb::ValueObjectSP(); - case 4: - *((uint32_t*)buffer.GetBytes()) = (uint32_t)set_item.item_ptr; - break; - case 8: - *((uint64_t*)buffer.GetBytes()) = (uint64_t)set_item.item_ptr; - break; - default: - assert(false && "pointer size is not 4 nor 8 - get out of here ASAP"); - } - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - - DataExtractor data(buffer.GetBytes(), - buffer.GetByteSize(), - process_sp->GetByteOrder(), - process_sp->GetAddressByteSize()); - - set_item.valobj_sp = - CreateValueObjectFromData(idx_name.GetData(), - data, - m_exe_ctx_ref, - m_backend.GetCompilerType().GetBasicTypeFromAST(lldb::eBasicTypeObjCID)); + } + + if (idx >= m_children.size()) // should never happen + return lldb::ValueObjectSP(); + + SetItemDescriptor &set_item = m_children[idx]; + if (!set_item.valobj_sp) { + auto ptr_size = process_sp->GetAddressByteSize(); + DataBufferHeap buffer(ptr_size, 0); + switch (ptr_size) { + case 0: // architecture has no clue?? - fail + return lldb::ValueObjectSP(); + case 4: + *((uint32_t *)buffer.GetBytes()) = (uint32_t)set_item.item_ptr; + break; + case 8: + *((uint64_t *)buffer.GetBytes()) = (uint64_t)set_item.item_ptr; + break; + default: + assert(false && "pointer size is not 4 nor 8 - get out of here ASAP"); } - return set_item.valobj_sp; + StreamString idx_name; + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); + + DataExtractor data(buffer.GetBytes(), buffer.GetByteSize(), + process_sp->GetByteOrder(), + process_sp->GetAddressByteSize()); + + set_item.valobj_sp = CreateValueObjectFromData( + idx_name.GetData(), data, m_exe_ctx_ref, + m_backend.GetCompilerType().GetBasicTypeFromAST( + lldb::eBasicTypeObjCID)); + } + return set_item.valobj_sp; } -template bool -lldb_private::formatters::NSSetSummaryProvider<true> (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); +template bool lldb_private::formatters::NSSetSummaryProvider<true>( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); -template bool -lldb_private::formatters::NSSetSummaryProvider<false> (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); +template bool lldb_private::formatters::NSSetSummaryProvider<false>( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); diff --git a/lldb/source/Plugins/Language/ObjC/NSSet.h b/lldb/source/Plugins/Language/ObjC/NSSet.h index c8622706e86..dbc5dfa7e65 100644 --- a/lldb/source/Plugins/Language/ObjC/NSSet.h +++ b/lldb/source/Plugins/Language/ObjC/NSSet.h @@ -1,4 +1,5 @@ -//===-- NSSet.h ---------------------------------------------------*- C++ -*-===// +//===-- NSSet.h ---------------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -17,24 +18,23 @@ #include "lldb/DataFormatters/TypeSynthetic.h" namespace lldb_private { - namespace formatters - { - template<bool cf_style> - bool - NSSetSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - SyntheticChildrenFrontEnd* NSSetSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - class NSSet_Additionals - { - public: - static std::map<ConstString, CXXFunctionSummaryFormat::Callback>& - GetAdditionalSummaries (); - - static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback>& - GetAdditionalSynthetics (); - }; - } // namespace formatters +namespace formatters { +template <bool cf_style> +bool NSSetSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +SyntheticChildrenFrontEnd *NSSetSyntheticFrontEndCreator(CXXSyntheticChildren *, + lldb::ValueObjectSP); + +class NSSet_Additionals { +public: + static std::map<ConstString, CXXFunctionSummaryFormat::Callback> & + GetAdditionalSummaries(); + + static std::map<ConstString, CXXSyntheticChildren::CreateFrontEndCallback> & + GetAdditionalSynthetics(); +}; +} // namespace formatters } // namespace lldb_private #endif // liblldb_NSSet_h_ diff --git a/lldb/source/Plugins/Language/ObjC/NSString.cpp b/lldb/source/Plugins/Language/ObjC/NSString.cpp index 80896631baf..0f2a0595da8 100644 --- a/lldb/source/Plugins/Language/ObjC/NSString.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSString.cpp @@ -1,4 +1,5 @@ -//===-- NSString.cpp ----------------------------------------------*- C++ -*-===// +//===-- NSString.cpp ----------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -26,380 +27,380 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -std::map<ConstString, CXXFunctionSummaryFormat::Callback>& -NSString_Additionals::GetAdditionalSummaries () -{ - static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map; - return g_map; +std::map<ConstString, CXXFunctionSummaryFormat::Callback> & +NSString_Additionals::GetAdditionalSummaries() { + static std::map<ConstString, CXXFunctionSummaryFormat::Callback> g_map; + return g_map; } -static CompilerType -GetNSPathStore2Type (Target &target) -{ - static ConstString g_type_name("__lldb_autogen_nspathstore2"); - - ClangASTContext *ast_ctx = target.GetScratchClangASTContext(); - - if (!ast_ctx) - return CompilerType(); - - CompilerType voidstar = ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType(); - CompilerType uint32 = ast_ctx->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 32); - - return ast_ctx->GetOrCreateStructForIdentifier(g_type_name, { - {"isa",voidstar}, - {"lengthAndRef",uint32}, - {"buffer",voidstar} - }); +static CompilerType GetNSPathStore2Type(Target &target) { + static ConstString g_type_name("__lldb_autogen_nspathstore2"); + + ClangASTContext *ast_ctx = target.GetScratchClangASTContext(); + + if (!ast_ctx) + return CompilerType(); + + CompilerType voidstar = + ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType(); + CompilerType uint32 = + ast_ctx->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 32); + + return ast_ctx->GetOrCreateStructForIdentifier( + g_type_name, + {{"isa", voidstar}, {"lengthAndRef", uint32}, {"buffer", voidstar}}); } -bool -lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& summary_options) -{ - static ConstString g_TypeHint("NSString"); - - ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - return false; - - ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); - - if (!runtime) - return false; - - ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj)); - - if (!descriptor.get() || !descriptor->IsValid()) - return false; - - uint32_t ptr_size = process_sp->GetAddressByteSize(); - - lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); - - if (!valobj_addr) - return false; - - ConstString class_name_cs = descriptor->GetClassName(); - const char* class_name = class_name_cs.GetCString(); - - if (!class_name || !*class_name) - return false; - - bool is_tagged_ptr = (0 == strcmp(class_name,"NSTaggedPointerString")) && descriptor->GetTaggedPointerInfo(); - // for a tagged pointer, the descriptor has everything we need - if (is_tagged_ptr) - return NSTaggedString_SummaryProvider(valobj, descriptor, stream, summary_options); - - auto& additionals_map(NSString_Additionals::GetAdditionalSummaries()); - auto iter = additionals_map.find(class_name_cs), end = additionals_map.end(); - if (iter != end) - return iter->second(valobj, stream, summary_options); - - // if not a tagged pointer that we know about, try the normal route - uint64_t info_bits_location = valobj_addr + ptr_size; - if (process_sp->GetByteOrder() != lldb::eByteOrderLittle) - info_bits_location += 3; - - Error error; - - uint8_t info_bits = process_sp->ReadUnsignedIntegerFromMemory(info_bits_location, 1, 0, error); - if (error.Fail()) - return false; - - bool is_mutable = (info_bits & 1) == 1; - bool is_inline = (info_bits & 0x60) == 0; - bool has_explicit_length = (info_bits & (1 | 4)) != 4; - bool is_unicode = (info_bits & 0x10) == 0x10; - bool is_path_store = strcmp(class_name,"NSPathStore2") == 0; - bool has_null = (info_bits & 8) == 8; - - size_t explicit_length = 0; - if (!has_null && has_explicit_length && !is_path_store) - { - lldb::addr_t explicit_length_offset = 2*ptr_size; - if (is_mutable && !is_inline) - explicit_length_offset = explicit_length_offset + ptr_size; // notInlineMutable.length; - else if (is_inline) - explicit_length = explicit_length + 0; // inline1.length; - else if (!is_inline && !is_mutable) - explicit_length_offset = explicit_length_offset + ptr_size; // notInlineImmutable1.length; - else - explicit_length_offset = 0; - - if (explicit_length_offset) - { - explicit_length_offset = valobj_addr + explicit_length_offset; - explicit_length = process_sp->ReadUnsignedIntegerFromMemory(explicit_length_offset, 4, 0, error); - } - } - - if (strcmp(class_name,"NSString") && - strcmp(class_name,"CFStringRef") && - strcmp(class_name,"CFMutableStringRef") && - strcmp(class_name,"__NSCFConstantString") && - strcmp(class_name,"__NSCFString") && - strcmp(class_name,"NSCFConstantString") && - strcmp(class_name,"NSCFString") && - strcmp(class_name,"NSPathStore2")) - { - // not one of us - but tell me class name - stream.Printf("class name = %s",class_name); - return true; - } - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(summary_options.GetLanguage())) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } - } - - StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); - options.SetPrefixToken(prefix); - options.SetSuffixToken(suffix); - - if (is_mutable) - { - uint64_t location = 2 * ptr_size + valobj_addr; - location = process_sp->ReadPointerFromMemory(location, error); - if (error.Fail()) - return false; - if (has_explicit_length && is_unicode) - { - options.SetLocation(location); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetQuote('"'); - options.SetSourceSize(explicit_length); - options.SetNeedsZeroTermination(false); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - options.SetBinaryZeroIsTerminator(false); - options.SetLanguage(summary_options.GetLanguage()); - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF16>(options); - } - else - { - options.SetLocation(location+1); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetSourceSize(explicit_length); - options.SetNeedsZeroTermination(false); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - options.SetBinaryZeroIsTerminator(false); - options.SetLanguage(summary_options.GetLanguage()); - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::ASCII>(options); - } +bool lldb_private::formatters::NSStringSummaryProvider( + ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &summary_options) { + static ConstString g_TypeHint("NSString"); + + ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + return false; + + ObjCLanguageRuntime *runtime = + (ObjCLanguageRuntime *)process_sp->GetLanguageRuntime( + lldb::eLanguageTypeObjC); + + if (!runtime) + return false; + + ObjCLanguageRuntime::ClassDescriptorSP descriptor( + runtime->GetClassDescriptor(valobj)); + + if (!descriptor.get() || !descriptor->IsValid()) + return false; + + uint32_t ptr_size = process_sp->GetAddressByteSize(); + + lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0); + + if (!valobj_addr) + return false; + + ConstString class_name_cs = descriptor->GetClassName(); + const char *class_name = class_name_cs.GetCString(); + + if (!class_name || !*class_name) + return false; + + bool is_tagged_ptr = (0 == strcmp(class_name, "NSTaggedPointerString")) && + descriptor->GetTaggedPointerInfo(); + // for a tagged pointer, the descriptor has everything we need + if (is_tagged_ptr) + return NSTaggedString_SummaryProvider(valobj, descriptor, stream, + summary_options); + + auto &additionals_map(NSString_Additionals::GetAdditionalSummaries()); + auto iter = additionals_map.find(class_name_cs), end = additionals_map.end(); + if (iter != end) + return iter->second(valobj, stream, summary_options); + + // if not a tagged pointer that we know about, try the normal route + uint64_t info_bits_location = valobj_addr + ptr_size; + if (process_sp->GetByteOrder() != lldb::eByteOrderLittle) + info_bits_location += 3; + + Error error; + + uint8_t info_bits = process_sp->ReadUnsignedIntegerFromMemory( + info_bits_location, 1, 0, error); + if (error.Fail()) + return false; + + bool is_mutable = (info_bits & 1) == 1; + bool is_inline = (info_bits & 0x60) == 0; + bool has_explicit_length = (info_bits & (1 | 4)) != 4; + bool is_unicode = (info_bits & 0x10) == 0x10; + bool is_path_store = strcmp(class_name, "NSPathStore2") == 0; + bool has_null = (info_bits & 8) == 8; + + size_t explicit_length = 0; + if (!has_null && has_explicit_length && !is_path_store) { + lldb::addr_t explicit_length_offset = 2 * ptr_size; + if (is_mutable && !is_inline) + explicit_length_offset = + explicit_length_offset + ptr_size; // notInlineMutable.length; + else if (is_inline) + explicit_length = explicit_length + 0; // inline1.length; + else if (!is_inline && !is_mutable) + explicit_length_offset = + explicit_length_offset + ptr_size; // notInlineImmutable1.length; + else + explicit_length_offset = 0; + + if (explicit_length_offset) { + explicit_length_offset = valobj_addr + explicit_length_offset; + explicit_length = process_sp->ReadUnsignedIntegerFromMemory( + explicit_length_offset, 4, 0, error); } - else if (is_inline && has_explicit_length && !is_unicode && !is_path_store && !is_mutable) - { - uint64_t location = 3 * ptr_size + valobj_addr; - - options.SetLocation(location); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetQuote('"'); - options.SetSourceSize(explicit_length); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - options.SetLanguage(summary_options.GetLanguage()); - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::ASCII> (options); + } + + if (strcmp(class_name, "NSString") && strcmp(class_name, "CFStringRef") && + strcmp(class_name, "CFMutableStringRef") && + strcmp(class_name, "__NSCFConstantString") && + strcmp(class_name, "__NSCFString") && + strcmp(class_name, "NSCFConstantString") && + strcmp(class_name, "NSCFString") && strcmp(class_name, "NSPathStore2")) { + // not one of us - but tell me class name + stream.Printf("class name = %s", class_name); + return true; + } + + std::string prefix, suffix; + if (Language *language = + Language::FindPlugin(summary_options.GetLanguage())) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } - else if (is_unicode) - { - uint64_t location = valobj_addr + 2*ptr_size; - if (is_inline) - { - if (!has_explicit_length) - { - stream.Printf("found new combo"); - return true; - } - else - location += ptr_size; - } - else - { - location = process_sp->ReadPointerFromMemory(location, error); - if (error.Fail()) - return false; - } - options.SetLocation(location); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetQuote('"'); - options.SetSourceSize(explicit_length); - options.SetNeedsZeroTermination(has_explicit_length == false); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - options.SetBinaryZeroIsTerminator(has_explicit_length == false); - options.SetLanguage(summary_options.GetLanguage()); - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF16> (options); + } + + StringPrinter::ReadStringAndDumpToStreamOptions options(valobj); + options.SetPrefixToken(prefix); + options.SetSuffixToken(suffix); + + if (is_mutable) { + uint64_t location = 2 * ptr_size + valobj_addr; + location = process_sp->ReadPointerFromMemory(location, error); + if (error.Fail()) + return false; + if (has_explicit_length && is_unicode) { + options.SetLocation(location); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetQuote('"'); + options.SetSourceSize(explicit_length); + options.SetNeedsZeroTermination(false); + options.SetIgnoreMaxLength(summary_options.GetCapping() == + TypeSummaryCapping::eTypeSummaryUncapped); + options.SetBinaryZeroIsTerminator(false); + options.SetLanguage(summary_options.GetLanguage()); + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF16>(options); + } else { + options.SetLocation(location + 1); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetSourceSize(explicit_length); + options.SetNeedsZeroTermination(false); + options.SetIgnoreMaxLength(summary_options.GetCapping() == + TypeSummaryCapping::eTypeSummaryUncapped); + options.SetBinaryZeroIsTerminator(false); + options.SetLanguage(summary_options.GetLanguage()); + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::ASCII>(options); } - else if (is_path_store) - { - ProcessStructReader reader(valobj.GetProcessSP().get(), valobj.GetValueAsUnsigned(0), GetNSPathStore2Type(*valobj.GetTargetSP())); - explicit_length = reader.GetField<uint32_t>(ConstString("lengthAndRef")) >> 20; - lldb::addr_t location = valobj.GetValueAsUnsigned(0) + ptr_size + 4; - - options.SetLocation(location); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetQuote('"'); - options.SetSourceSize(explicit_length); - options.SetNeedsZeroTermination(has_explicit_length == false); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - options.SetBinaryZeroIsTerminator(has_explicit_length == false); - options.SetLanguage(summary_options.GetLanguage()); - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF16> (options); + } else if (is_inline && has_explicit_length && !is_unicode && + !is_path_store && !is_mutable) { + uint64_t location = 3 * ptr_size + valobj_addr; + + options.SetLocation(location); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetQuote('"'); + options.SetSourceSize(explicit_length); + options.SetIgnoreMaxLength(summary_options.GetCapping() == + TypeSummaryCapping::eTypeSummaryUncapped); + options.SetLanguage(summary_options.GetLanguage()); + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::ASCII>(options); + } else if (is_unicode) { + uint64_t location = valobj_addr + 2 * ptr_size; + if (is_inline) { + if (!has_explicit_length) { + stream.Printf("found new combo"); + return true; + } else + location += ptr_size; + } else { + location = process_sp->ReadPointerFromMemory(location, error); + if (error.Fail()) + return false; } - else if (is_inline) - { - uint64_t location = valobj_addr + 2*ptr_size; - if (!has_explicit_length) - { - // in this kind of string, the byte before the string content is a length byte - // so let's try and use it to handle the embedded NUL case - Error error; - explicit_length = process_sp->ReadUnsignedIntegerFromMemory(location, 1, 0, error); - if (error.Fail() || explicit_length == 0) - has_explicit_length = false; - else - has_explicit_length = true; - location++; - } - options.SetLocation(location); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetSourceSize(explicit_length); - options.SetNeedsZeroTermination(!has_explicit_length); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - options.SetBinaryZeroIsTerminator(!has_explicit_length); - options.SetLanguage(summary_options.GetLanguage()); - if (has_explicit_length) - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::UTF8>(options); - else - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::ASCII>(options); + options.SetLocation(location); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetQuote('"'); + options.SetSourceSize(explicit_length); + options.SetNeedsZeroTermination(has_explicit_length == false); + options.SetIgnoreMaxLength(summary_options.GetCapping() == + TypeSummaryCapping::eTypeSummaryUncapped); + options.SetBinaryZeroIsTerminator(has_explicit_length == false); + options.SetLanguage(summary_options.GetLanguage()); + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF16>(options); + } else if (is_path_store) { + ProcessStructReader reader(valobj.GetProcessSP().get(), + valobj.GetValueAsUnsigned(0), + GetNSPathStore2Type(*valobj.GetTargetSP())); + explicit_length = + reader.GetField<uint32_t>(ConstString("lengthAndRef")) >> 20; + lldb::addr_t location = valobj.GetValueAsUnsigned(0) + ptr_size + 4; + + options.SetLocation(location); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetQuote('"'); + options.SetSourceSize(explicit_length); + options.SetNeedsZeroTermination(has_explicit_length == false); + options.SetIgnoreMaxLength(summary_options.GetCapping() == + TypeSummaryCapping::eTypeSummaryUncapped); + options.SetBinaryZeroIsTerminator(has_explicit_length == false); + options.SetLanguage(summary_options.GetLanguage()); + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF16>(options); + } else if (is_inline) { + uint64_t location = valobj_addr + 2 * ptr_size; + if (!has_explicit_length) { + // in this kind of string, the byte before the string content is a length + // byte + // so let's try and use it to handle the embedded NUL case + Error error; + explicit_length = + process_sp->ReadUnsignedIntegerFromMemory(location, 1, 0, error); + if (error.Fail() || explicit_length == 0) + has_explicit_length = false; + else + has_explicit_length = true; + location++; } + options.SetLocation(location); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetSourceSize(explicit_length); + options.SetNeedsZeroTermination(!has_explicit_length); + options.SetIgnoreMaxLength(summary_options.GetCapping() == + TypeSummaryCapping::eTypeSummaryUncapped); + options.SetBinaryZeroIsTerminator(!has_explicit_length); + options.SetLanguage(summary_options.GetLanguage()); + if (has_explicit_length) + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::UTF8>(options); else - { - uint64_t location = valobj_addr + 2*ptr_size; - location = process_sp->ReadPointerFromMemory(location, error); - if (error.Fail()) - return false; - if (has_explicit_length && !has_null) - explicit_length++; // account for the fact that there is no NULL and we need to have one added - options.SetLocation(location); - options.SetProcessSP(process_sp); - options.SetStream(&stream); - options.SetSourceSize(explicit_length); - options.SetIgnoreMaxLength(summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryUncapped); - options.SetLanguage(summary_options.GetLanguage()); - return StringPrinter::ReadStringAndDumpToStream<StringPrinter::StringElementType::ASCII>(options); - } + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::ASCII>(options); + } else { + uint64_t location = valobj_addr + 2 * ptr_size; + location = process_sp->ReadPointerFromMemory(location, error); + if (error.Fail()) + return false; + if (has_explicit_length && !has_null) + explicit_length++; // account for the fact that there is no NULL and we + // need to have one added + options.SetLocation(location); + options.SetProcessSP(process_sp); + options.SetStream(&stream); + options.SetSourceSize(explicit_length); + options.SetIgnoreMaxLength(summary_options.GetCapping() == + TypeSummaryCapping::eTypeSummaryUncapped); + options.SetLanguage(summary_options.GetLanguage()); + return StringPrinter::ReadStringAndDumpToStream< + StringPrinter::StringElementType::ASCII>(options); + } } -bool -lldb_private::formatters::NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - TargetSP target_sp(valobj.GetTargetSP()); - if (!target_sp) - return false; - uint32_t addr_size = target_sp->GetArchitecture().GetAddressByteSize(); - uint64_t pointer_value = valobj.GetValueAsUnsigned(0); - if (!pointer_value) - return false; - pointer_value += addr_size; - CompilerType type(valobj.GetCompilerType()); - ExecutionContext exe_ctx(target_sp,false); - ValueObjectSP child_ptr_sp(valobj.CreateValueObjectFromAddress("string_ptr", pointer_value, exe_ctx, type)); - if (!child_ptr_sp) - return false; - DataExtractor data; - Error error; - child_ptr_sp->GetData(data, error); - if (error.Fail()) - return false; - ValueObjectSP child_sp(child_ptr_sp->CreateValueObjectFromData("string_data", data, exe_ctx, type)); - child_sp->GetValueAsUnsigned(0); - if (child_sp) - return NSStringSummaryProvider(*child_sp, stream, options); +bool lldb_private::formatters::NSAttributedStringSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + TargetSP target_sp(valobj.GetTargetSP()); + if (!target_sp) + return false; + uint32_t addr_size = target_sp->GetArchitecture().GetAddressByteSize(); + uint64_t pointer_value = valobj.GetValueAsUnsigned(0); + if (!pointer_value) + return false; + pointer_value += addr_size; + CompilerType type(valobj.GetCompilerType()); + ExecutionContext exe_ctx(target_sp, false); + ValueObjectSP child_ptr_sp(valobj.CreateValueObjectFromAddress( + "string_ptr", pointer_value, exe_ctx, type)); + if (!child_ptr_sp) return false; + DataExtractor data; + Error error; + child_ptr_sp->GetData(data, error); + if (error.Fail()) + return false; + ValueObjectSP child_sp(child_ptr_sp->CreateValueObjectFromData( + "string_data", data, exe_ctx, type)); + child_sp->GetValueAsUnsigned(0); + if (child_sp) + return NSStringSummaryProvider(*child_sp, stream, options); + return false; } -bool -lldb_private::formatters::NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - return NSAttributedStringSummaryProvider(valobj, stream, options); +bool lldb_private::formatters::NSMutableAttributedStringSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { + return NSAttributedStringSummaryProvider(valobj, stream, options); } -bool -lldb_private::formatters::NSTaggedString_SummaryProvider (ValueObject& valobj, ObjCLanguageRuntime::ClassDescriptorSP descriptor, Stream& stream, const TypeSummaryOptions& summary_options) -{ - static ConstString g_TypeHint("NSString"); - - if (!descriptor) - return false; - uint64_t len_bits = 0, data_bits = 0; - if (!descriptor->GetTaggedPointerInfo(&len_bits,&data_bits,nullptr)) - return false; - - static const int g_MaxNonBitmaskedLen = 7; //TAGGED_STRING_UNPACKED_MAXLEN - static const int g_SixbitMaxLen = 9; - static const int g_fiveBitMaxLen = 11; - - static const char *sixBitToCharLookup = "eilotrm.apdnsIc ufkMShjTRxgC4013" "bDNvwyUL2O856P-B79AFKEWV_zGJ/HYX"; - - if (len_bits > g_fiveBitMaxLen) - return false; - - std::string prefix,suffix; - if (Language* language = Language::FindPlugin(summary_options.GetLanguage())) - { - if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, suffix)) - { - prefix.clear(); - suffix.clear(); - } - } - - // this is a fairly ugly trick - pretend that the numeric value is actually a char* - // this works under a few assumptions: - // little endian architecture - // sizeof(uint64_t) > g_MaxNonBitmaskedLen - if (len_bits <= g_MaxNonBitmaskedLen) - { - stream.Printf("%s",prefix.c_str()); - stream.Printf("\"%s\"",(const char*)&data_bits); - stream.Printf("%s",suffix.c_str()); - return true; - } - - // if the data is bitmasked, we need to actually process the bytes - uint8_t bitmask = 0; - uint8_t shift_offset = 0; - - if (len_bits <= g_SixbitMaxLen) - { - bitmask = 0x03f; - shift_offset = 6; - } - else - { - bitmask = 0x01f; - shift_offset = 5; - } - - std::vector<uint8_t> bytes; - bytes.resize(len_bits); - for (; len_bits > 0; data_bits >>= shift_offset, --len_bits) - { - uint8_t packed = data_bits & bitmask; - bytes.insert(bytes.begin(), sixBitToCharLookup[packed]); +bool lldb_private::formatters::NSTaggedString_SummaryProvider( + ValueObject &valobj, ObjCLanguageRuntime::ClassDescriptorSP descriptor, + Stream &stream, const TypeSummaryOptions &summary_options) { + static ConstString g_TypeHint("NSString"); + + if (!descriptor) + return false; + uint64_t len_bits = 0, data_bits = 0; + if (!descriptor->GetTaggedPointerInfo(&len_bits, &data_bits, nullptr)) + return false; + + static const int g_MaxNonBitmaskedLen = 7; // TAGGED_STRING_UNPACKED_MAXLEN + static const int g_SixbitMaxLen = 9; + static const int g_fiveBitMaxLen = 11; + + static const char *sixBitToCharLookup = "eilotrm.apdnsIc ufkMShjTRxgC4013" + "bDNvwyUL2O856P-B79AFKEWV_zGJ/HYX"; + + if (len_bits > g_fiveBitMaxLen) + return false; + + std::string prefix, suffix; + if (Language *language = + Language::FindPlugin(summary_options.GetLanguage())) { + if (!language->GetFormatterPrefixSuffix(valobj, g_TypeHint, prefix, + suffix)) { + prefix.clear(); + suffix.clear(); } - - stream.Printf("%s",prefix.c_str()); - stream.Printf("\"%s\"",&bytes[0]); - stream.Printf("%s",suffix.c_str()); + } + + // this is a fairly ugly trick - pretend that the numeric value is actually a + // char* + // this works under a few assumptions: + // little endian architecture + // sizeof(uint64_t) > g_MaxNonBitmaskedLen + if (len_bits <= g_MaxNonBitmaskedLen) { + stream.Printf("%s", prefix.c_str()); + stream.Printf("\"%s\"", (const char *)&data_bits); + stream.Printf("%s", suffix.c_str()); return true; + } + + // if the data is bitmasked, we need to actually process the bytes + uint8_t bitmask = 0; + uint8_t shift_offset = 0; + + if (len_bits <= g_SixbitMaxLen) { + bitmask = 0x03f; + shift_offset = 6; + } else { + bitmask = 0x01f; + shift_offset = 5; + } + + std::vector<uint8_t> bytes; + bytes.resize(len_bits); + for (; len_bits > 0; data_bits >>= shift_offset, --len_bits) { + uint8_t packed = data_bits & bitmask; + bytes.insert(bytes.begin(), sixBitToCharLookup[packed]); + } + + stream.Printf("%s", prefix.c_str()); + stream.Printf("\"%s\"", &bytes[0]); + stream.Printf("%s", suffix.c_str()); + return true; } diff --git a/lldb/source/Plugins/Language/ObjC/NSString.h b/lldb/source/Plugins/Language/ObjC/NSString.h index 6a767a55e00..df8480ad6cd 100644 --- a/lldb/source/Plugins/Language/ObjC/NSString.h +++ b/lldb/source/Plugins/Language/ObjC/NSString.h @@ -1,4 +1,5 @@ -//===-- NSString.h ---------------------------------------------------*- C++ -*-===// +//===-- NSString.h ---------------------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -16,27 +17,26 @@ #include "lldb/Target/ObjCLanguageRuntime.h" namespace lldb_private { - namespace formatters - { - bool - NSStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSTaggedString_SummaryProvider (ValueObject& valobj, ObjCLanguageRuntime::ClassDescriptorSP descriptor, Stream& stream, const TypeSummaryOptions& summary_options); - - bool - NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - class NSString_Additionals - { - public: - static std::map<ConstString, CXXFunctionSummaryFormat::Callback>& - GetAdditionalSummaries (); - }; - } // namespace formatters +namespace formatters { +bool NSStringSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool NSTaggedString_SummaryProvider( + ValueObject &valobj, ObjCLanguageRuntime::ClassDescriptorSP descriptor, + Stream &stream, const TypeSummaryOptions &summary_options); + +bool NSAttributedStringSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + +bool NSMutableAttributedStringSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options); + +class NSString_Additionals { +public: + static std::map<ConstString, CXXFunctionSummaryFormat::Callback> & + GetAdditionalSummaries(); +}; +} // namespace formatters } // namespace lldb_private #endif // liblldb_CF_h_ diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp index 0ecbfd35b1a..8955baaebf3 100644 --- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp @@ -21,10 +21,10 @@ #include "lldb/Core/ValueObject.h" #include "lldb/DataFormatters/DataVisualization.h" #include "lldb/DataFormatters/FormattersHelpers.h" +#include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/CompilerType.h" -#include "lldb/Target/Target.h" #include "lldb/Target/ObjCLanguageRuntime.h" -#include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Target/Target.h" #include "CF.h" #include "Cocoa.h" @@ -37,841 +37,1035 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -void -ObjCLanguage::Initialize() -{ - PluginManager::RegisterPlugin (GetPluginNameStatic(), - "Objective-C Language", - CreateInstance); +void ObjCLanguage::Initialize() { + PluginManager::RegisterPlugin(GetPluginNameStatic(), "Objective-C Language", + CreateInstance); } -void -ObjCLanguage::Terminate() -{ - PluginManager::UnregisterPlugin (CreateInstance); +void ObjCLanguage::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); } -lldb_private::ConstString -ObjCLanguage::GetPluginNameStatic() -{ - static ConstString g_name("objc"); - return g_name; +lldb_private::ConstString ObjCLanguage::GetPluginNameStatic() { + static ConstString g_name("objc"); + return g_name; } //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ -lldb_private::ConstString -ObjCLanguage::GetPluginName() -{ - return GetPluginNameStatic(); +lldb_private::ConstString ObjCLanguage::GetPluginName() { + return GetPluginNameStatic(); } -uint32_t -ObjCLanguage::GetPluginVersion() -{ - return 1; -} +uint32_t ObjCLanguage::GetPluginVersion() { return 1; } //------------------------------------------------------------------ // Static Functions //------------------------------------------------------------------ -Language * -ObjCLanguage::CreateInstance (lldb::LanguageType language) -{ - switch (language) - { - case lldb::eLanguageTypeObjC: - return new ObjCLanguage(); - default: - return nullptr; - } +Language *ObjCLanguage::CreateInstance(lldb::LanguageType language) { + switch (language) { + case lldb::eLanguageTypeObjC: + return new ObjCLanguage(); + default: + return nullptr; + } } -void -ObjCLanguage::MethodName::Clear() -{ - m_full.Clear(); - m_class.Clear(); - m_category.Clear(); - m_selector.Clear(); - m_type = eTypeUnspecified; - m_category_is_valid = false; +void ObjCLanguage::MethodName::Clear() { + m_full.Clear(); + m_class.Clear(); + m_category.Clear(); + m_selector.Clear(); + m_type = eTypeUnspecified; + m_category_is_valid = false; } -bool -ObjCLanguage::MethodName::SetName (const char *name, bool strict) -{ - Clear(); - if (name && name[0]) - { - // If "strict" is true. then the method must be specified with a - // '+' or '-' at the beginning. If "strict" is false, then the '+' - // or '-' can be omitted - bool valid_prefix = false; - - if (name[0] == '+' || name[0] == '-') - { - valid_prefix = name[1] == '['; - if (name[0] == '+') - m_type = eTypeClassMethod; - else - m_type = eTypeInstanceMethod; - } - else if (!strict) - { - // "strict" is false, the name just needs to start with '[' - valid_prefix = name[0] == '['; - } - - if (valid_prefix) - { - int name_len = strlen (name); - // Objective C methods must have at least: - // "-[" or "+[" prefix - // One character for a class name - // One character for the space between the class name - // One character for the method name - // "]" suffix - if (name_len >= (5 + (strict ? 1 : 0)) && name[name_len - 1] == ']') - { - m_full.SetCStringWithLength(name, name_len); - } - } +bool ObjCLanguage::MethodName::SetName(const char *name, bool strict) { + Clear(); + if (name && name[0]) { + // If "strict" is true. then the method must be specified with a + // '+' or '-' at the beginning. If "strict" is false, then the '+' + // or '-' can be omitted + bool valid_prefix = false; + + if (name[0] == '+' || name[0] == '-') { + valid_prefix = name[1] == '['; + if (name[0] == '+') + m_type = eTypeClassMethod; + else + m_type = eTypeInstanceMethod; + } else if (!strict) { + // "strict" is false, the name just needs to start with '[' + valid_prefix = name[0] == '['; + } + + if (valid_prefix) { + int name_len = strlen(name); + // Objective C methods must have at least: + // "-[" or "+[" prefix + // One character for a class name + // One character for the space between the class name + // One character for the method name + // "]" suffix + if (name_len >= (5 + (strict ? 1 : 0)) && name[name_len - 1] == ']') { + m_full.SetCStringWithLength(name, name_len); + } } - return IsValid(strict); + } + return IsValid(strict); } -const ConstString & -ObjCLanguage::MethodName::GetClassName () -{ - if (!m_class) - { - if (IsValid(false)) - { - const char *full = m_full.GetCString(); - const char *class_start = (full[0] == '[' ? full + 1 : full + 2); - const char *paren_pos = strchr (class_start, '('); - if (paren_pos) - { - m_class.SetCStringWithLength (class_start, paren_pos - class_start); - } - else - { - // No '(' was found in the full name, we can definitively say - // that our category was valid (and empty). - m_category_is_valid = true; - const char *space_pos = strchr (full, ' '); - if (space_pos) - { - m_class.SetCStringWithLength (class_start, space_pos - class_start); - if (!m_class_category) - { - // No category in name, so we can also fill in the m_class_category - m_class_category = m_class; - } - } - } +const ConstString &ObjCLanguage::MethodName::GetClassName() { + if (!m_class) { + if (IsValid(false)) { + const char *full = m_full.GetCString(); + const char *class_start = (full[0] == '[' ? full + 1 : full + 2); + const char *paren_pos = strchr(class_start, '('); + if (paren_pos) { + m_class.SetCStringWithLength(class_start, paren_pos - class_start); + } else { + // No '(' was found in the full name, we can definitively say + // that our category was valid (and empty). + m_category_is_valid = true; + const char *space_pos = strchr(full, ' '); + if (space_pos) { + m_class.SetCStringWithLength(class_start, space_pos - class_start); + if (!m_class_category) { + // No category in name, so we can also fill in the m_class_category + m_class_category = m_class; + } } + } } - return m_class; + } + return m_class; } -const ConstString & -ObjCLanguage::MethodName::GetClassNameWithCategory () -{ - if (!m_class_category) - { - if (IsValid(false)) - { - const char *full = m_full.GetCString(); - const char *class_start = (full[0] == '[' ? full + 1 : full + 2); - const char *space_pos = strchr (full, ' '); - if (space_pos) - { - m_class_category.SetCStringWithLength (class_start, space_pos - class_start); - // If m_class hasn't been filled in and the class with category doesn't - // contain a '(', then we can also fill in the m_class - if (!m_class && strchr(m_class_category.GetCString(), '(') == nullptr) - { - m_class = m_class_category; - // No '(' was found in the full name, we can definitively say - // that our category was valid (and empty). - m_category_is_valid = true; - - } - } +const ConstString &ObjCLanguage::MethodName::GetClassNameWithCategory() { + if (!m_class_category) { + if (IsValid(false)) { + const char *full = m_full.GetCString(); + const char *class_start = (full[0] == '[' ? full + 1 : full + 2); + const char *space_pos = strchr(full, ' '); + if (space_pos) { + m_class_category.SetCStringWithLength(class_start, + space_pos - class_start); + // If m_class hasn't been filled in and the class with category doesn't + // contain a '(', then we can also fill in the m_class + if (!m_class && strchr(m_class_category.GetCString(), '(') == nullptr) { + m_class = m_class_category; + // No '(' was found in the full name, we can definitively say + // that our category was valid (and empty). + m_category_is_valid = true; } + } } - return m_class_category; + } + return m_class_category; } -const ConstString & -ObjCLanguage::MethodName::GetSelector () -{ - if (!m_selector) - { - if (IsValid(false)) - { - const char *full = m_full.GetCString(); - const char *space_pos = strchr (full, ' '); - if (space_pos) - { - ++space_pos; // skip the space - m_selector.SetCStringWithLength (space_pos, m_full.GetLength() - (space_pos - full) - 1); - } - } +const ConstString &ObjCLanguage::MethodName::GetSelector() { + if (!m_selector) { + if (IsValid(false)) { + const char *full = m_full.GetCString(); + const char *space_pos = strchr(full, ' '); + if (space_pos) { + ++space_pos; // skip the space + m_selector.SetCStringWithLength(space_pos, m_full.GetLength() - + (space_pos - full) - 1); + } } - return m_selector; + } + return m_selector; } -const ConstString & -ObjCLanguage::MethodName::GetCategory () -{ - if (!m_category_is_valid && !m_category) - { - if (IsValid(false)) - { - m_category_is_valid = true; - const char *full = m_full.GetCString(); - const char *class_start = (full[0] == '[' ? full + 1 : full + 2); - const char *open_paren_pos = strchr (class_start, '('); - if (open_paren_pos) - { - ++open_paren_pos; // Skip the open paren - const char *close_paren_pos = strchr (open_paren_pos, ')'); - if (close_paren_pos) - m_category.SetCStringWithLength (open_paren_pos, close_paren_pos - open_paren_pos); - } - } +const ConstString &ObjCLanguage::MethodName::GetCategory() { + if (!m_category_is_valid && !m_category) { + if (IsValid(false)) { + m_category_is_valid = true; + const char *full = m_full.GetCString(); + const char *class_start = (full[0] == '[' ? full + 1 : full + 2); + const char *open_paren_pos = strchr(class_start, '('); + if (open_paren_pos) { + ++open_paren_pos; // Skip the open paren + const char *close_paren_pos = strchr(open_paren_pos, ')'); + if (close_paren_pos) + m_category.SetCStringWithLength(open_paren_pos, + close_paren_pos - open_paren_pos); + } } - return m_category; + } + return m_category; } -ConstString -ObjCLanguage::MethodName::GetFullNameWithoutCategory (bool empty_if_no_category) -{ - if (IsValid(false)) - { - if (HasCategory()) - { - StreamString strm; - if (m_type == eTypeClassMethod) - strm.PutChar('+'); - else if (m_type == eTypeInstanceMethod) - strm.PutChar('-'); - strm.Printf("[%s %s]", GetClassName().GetCString(), GetSelector().GetCString()); - return ConstString(strm.GetString().c_str()); - } - - if (!empty_if_no_category) - { - // Just return the full name since it doesn't have a category - return GetFullName(); - } +ConstString ObjCLanguage::MethodName::GetFullNameWithoutCategory( + bool empty_if_no_category) { + if (IsValid(false)) { + if (HasCategory()) { + StreamString strm; + if (m_type == eTypeClassMethod) + strm.PutChar('+'); + else if (m_type == eTypeInstanceMethod) + strm.PutChar('-'); + strm.Printf("[%s %s]", GetClassName().GetCString(), + GetSelector().GetCString()); + return ConstString(strm.GetString().c_str()); } - return ConstString(); + + if (!empty_if_no_category) { + // Just return the full name since it doesn't have a category + return GetFullName(); + } + } + return ConstString(); } -size_t -ObjCLanguage::MethodName::GetFullNames (std::vector<ConstString> &names, bool append) -{ - if (!append) - names.clear(); - if (IsValid(false)) - { - StreamString strm; - const bool is_class_method = m_type == eTypeClassMethod; - const bool is_instance_method = m_type == eTypeInstanceMethod; - const ConstString &category = GetCategory(); - if (is_class_method || is_instance_method) - { - names.push_back (m_full); - if (category) - { - strm.Printf("%c[%s %s]", - is_class_method ? '+' : '-', - GetClassName().GetCString(), - GetSelector().GetCString()); - names.push_back(ConstString(strm.GetString().c_str())); - } - } - else - { - const ConstString &class_name = GetClassName(); - const ConstString &selector = GetSelector(); - strm.Printf("+[%s %s]", class_name.GetCString(), selector.GetCString()); - names.push_back(ConstString(strm.GetString().c_str())); - strm.Clear(); - strm.Printf("-[%s %s]", class_name.GetCString(), selector.GetCString()); - names.push_back(ConstString(strm.GetString().c_str())); - strm.Clear(); - if (category) - { - strm.Printf("+[%s(%s) %s]", class_name.GetCString(), category.GetCString(), selector.GetCString()); - names.push_back(ConstString(strm.GetString().c_str())); - strm.Clear(); - strm.Printf("-[%s(%s) %s]", class_name.GetCString(), category.GetCString(), selector.GetCString()); - names.push_back(ConstString(strm.GetString().c_str())); - } - } +size_t ObjCLanguage::MethodName::GetFullNames(std::vector<ConstString> &names, + bool append) { + if (!append) + names.clear(); + if (IsValid(false)) { + StreamString strm; + const bool is_class_method = m_type == eTypeClassMethod; + const bool is_instance_method = m_type == eTypeInstanceMethod; + const ConstString &category = GetCategory(); + if (is_class_method || is_instance_method) { + names.push_back(m_full); + if (category) { + strm.Printf("%c[%s %s]", is_class_method ? '+' : '-', + GetClassName().GetCString(), GetSelector().GetCString()); + names.push_back(ConstString(strm.GetString().c_str())); + } + } else { + const ConstString &class_name = GetClassName(); + const ConstString &selector = GetSelector(); + strm.Printf("+[%s %s]", class_name.GetCString(), selector.GetCString()); + names.push_back(ConstString(strm.GetString().c_str())); + strm.Clear(); + strm.Printf("-[%s %s]", class_name.GetCString(), selector.GetCString()); + names.push_back(ConstString(strm.GetString().c_str())); + strm.Clear(); + if (category) { + strm.Printf("+[%s(%s) %s]", class_name.GetCString(), + category.GetCString(), selector.GetCString()); + names.push_back(ConstString(strm.GetString().c_str())); + strm.Clear(); + strm.Printf("-[%s(%s) %s]", class_name.GetCString(), + category.GetCString(), selector.GetCString()); + names.push_back(ConstString(strm.GetString().c_str())); + } } - return names.size(); + } + return names.size(); } -static void -LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) -{ - if (!objc_category_sp) - return; - - TypeSummaryImpl::Flags objc_flags; - objc_flags.SetCascades(false) - .SetSkipPointers(true) - .SetSkipReferences(true) - .SetDontShowChildren(true) - .SetDontShowValue(true) - .SetShowMembersOneLiner(false) - .SetHideItemNames(false); - - lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider,"")); - objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL"), - ObjC_BOOL_summary); - objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL &"), - ObjC_BOOL_summary); - objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL *"), - ObjC_BOOL_summary); - +static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) { + if (!objc_category_sp) + return; + + TypeSummaryImpl::Flags objc_flags; + objc_flags.SetCascades(false) + .SetSkipPointers(true) + .SetSkipReferences(true) + .SetDontShowChildren(true) + .SetDontShowValue(true) + .SetShowMembersOneLiner(false) + .SetHideItemNames(false); + + lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat( + objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider, "")); + objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL"), + ObjC_BOOL_summary); + objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL &"), + ObjC_BOOL_summary); + objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL *"), + ObjC_BOOL_summary); + #ifndef LLDB_DISABLE_PYTHON - // we need to skip pointers here since we are special casing a SEL* when retrieving its value - objc_flags.SetSkipPointers(true); - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("SEL"), objc_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("struct objc_selector"), objc_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("objc_selector"), objc_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("objc_selector *"), objc_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("SEL *"), objc_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCClassSummaryProvider, "Class summary provider", ConstString("Class"), objc_flags); - - SyntheticChildren::Flags class_synth_flags; - class_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false); - - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::ObjCClassSyntheticFrontEndCreator, "Class synthetic children", ConstString("Class"), class_synth_flags); + // we need to skip pointers here since we are special casing a SEL* when + // retrieving its value + objc_flags.SetSkipPointers(true); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::ObjCSELSummaryProvider<false>, + "SEL summary provider", ConstString("SEL"), objc_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, + "SEL summary provider", ConstString("struct objc_selector"), objc_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, + "SEL summary provider", ConstString("objc_selector"), objc_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, + "SEL summary provider", ConstString("objc_selector *"), objc_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::ObjCSELSummaryProvider<true>, + "SEL summary provider", ConstString("SEL *"), objc_flags); + + AddCXXSummary(objc_category_sp, + lldb_private::formatters::ObjCClassSummaryProvider, + "Class summary provider", ConstString("Class"), objc_flags); + + SyntheticChildren::Flags class_synth_flags; + class_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences( + false); + + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::ObjCClassSyntheticFrontEndCreator, + "Class synthetic children", ConstString("Class"), + class_synth_flags); #endif // LLDB_DISABLE_PYTHON - - objc_flags.SetSkipPointers(false); - objc_flags.SetCascades(true); - objc_flags.SetSkipReferences(false); - - AddStringSummary (objc_category_sp, - "${var.__FuncPtr%A}", - ConstString("__block_literal_generic"), - objc_flags); - - AddStringSummary(objc_category_sp, - "${var.years} years, ${var.months} months, ${var.days} days, ${var.hours} hours, ${var.minutes} minutes ${var.seconds} seconds", - ConstString("CFGregorianUnits"), - objc_flags); - AddStringSummary(objc_category_sp, - "location=${var.location} length=${var.length}", - ConstString("CFRange"), - objc_flags); - - AddStringSummary(objc_category_sp, - "location=${var.location}, length=${var.length}", - ConstString("NSRange"), - objc_flags); - AddStringSummary(objc_category_sp, - "(${var.origin}, ${var.size}), ...", - ConstString("NSRectArray"), - objc_flags); - - AddOneLineSummary (objc_category_sp, - ConstString("NSPoint"), - objc_flags); - AddOneLineSummary (objc_category_sp, - ConstString("NSSize"), - objc_flags); - AddOneLineSummary (objc_category_sp, - ConstString("NSRect"), - objc_flags); - - AddOneLineSummary (objc_category_sp, - ConstString("CGSize"), - objc_flags); - AddOneLineSummary (objc_category_sp, - ConstString("CGPoint"), - objc_flags); - AddOneLineSummary (objc_category_sp, - ConstString("CGRect"), - objc_flags); - - AddStringSummary(objc_category_sp, - "red=${var.red} green=${var.green} blue=${var.blue}", - ConstString("RGBColor"), - objc_flags); - AddStringSummary(objc_category_sp, - "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})", - ConstString("Rect"), - objc_flags); - AddStringSummary(objc_category_sp, - "{(v=${var.v}, h=${var.h})}", - ConstString("Point"), - objc_flags); - AddStringSummary(objc_category_sp, - "${var.month}/${var.day}/${var.year} ${var.hour} :${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}", - ConstString("DateTimeRect *"), - objc_flags); - AddStringSummary(objc_category_sp, - "${var.ld.month}/${var.ld.day}/${var.ld.year} ${var.ld.hour} :${var.ld.minute} :${var.ld.second} dayOfWeek:${var.ld.dayOfWeek}", - ConstString("LongDateRect"), - objc_flags); - AddStringSummary(objc_category_sp, - "(x=${var.x}, y=${var.y})", - ConstString("HIPoint"), - objc_flags); - AddStringSummary(objc_category_sp, - "origin=${var.origin} size=${var.size}", - ConstString("HIRect"), - objc_flags); - - TypeSummaryImpl::Flags appkit_flags; - appkit_flags.SetCascades(true) - .SetSkipPointers(false) - .SetSkipReferences(false) - .SetDontShowChildren(true) - .SetDontShowValue(false) - .SetShowMembersOneLiner(false) - .SetHideItemNames(false); - - appkit_flags.SetDontShowChildren(false); - + + objc_flags.SetSkipPointers(false); + objc_flags.SetCascades(true); + objc_flags.SetSkipReferences(false); + + AddStringSummary(objc_category_sp, "${var.__FuncPtr%A}", + ConstString("__block_literal_generic"), objc_flags); + + AddStringSummary(objc_category_sp, "${var.years} years, ${var.months} " + "months, ${var.days} days, ${var.hours} " + "hours, ${var.minutes} minutes " + "${var.seconds} seconds", + ConstString("CFGregorianUnits"), objc_flags); + AddStringSummary(objc_category_sp, + "location=${var.location} length=${var.length}", + ConstString("CFRange"), objc_flags); + + AddStringSummary(objc_category_sp, + "location=${var.location}, length=${var.length}", + ConstString("NSRange"), objc_flags); + AddStringSummary(objc_category_sp, "(${var.origin}, ${var.size}), ...", + ConstString("NSRectArray"), objc_flags); + + AddOneLineSummary(objc_category_sp, ConstString("NSPoint"), objc_flags); + AddOneLineSummary(objc_category_sp, ConstString("NSSize"), objc_flags); + AddOneLineSummary(objc_category_sp, ConstString("NSRect"), objc_flags); + + AddOneLineSummary(objc_category_sp, ConstString("CGSize"), objc_flags); + AddOneLineSummary(objc_category_sp, ConstString("CGPoint"), objc_flags); + AddOneLineSummary(objc_category_sp, ConstString("CGRect"), objc_flags); + + AddStringSummary(objc_category_sp, + "red=${var.red} green=${var.green} blue=${var.blue}", + ConstString("RGBColor"), objc_flags); + AddStringSummary( + objc_category_sp, + "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})", + ConstString("Rect"), objc_flags); + AddStringSummary(objc_category_sp, "{(v=${var.v}, h=${var.h})}", + ConstString("Point"), objc_flags); + AddStringSummary(objc_category_sp, + "${var.month}/${var.day}/${var.year} ${var.hour} " + ":${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}", + ConstString("DateTimeRect *"), objc_flags); + AddStringSummary(objc_category_sp, "${var.ld.month}/${var.ld.day}/" + "${var.ld.year} ${var.ld.hour} " + ":${var.ld.minute} :${var.ld.second} " + "dayOfWeek:${var.ld.dayOfWeek}", + ConstString("LongDateRect"), objc_flags); + AddStringSummary(objc_category_sp, "(x=${var.x}, y=${var.y})", + ConstString("HIPoint"), objc_flags); + AddStringSummary(objc_category_sp, "origin=${var.origin} size=${var.size}", + ConstString("HIRect"), objc_flags); + + TypeSummaryImpl::Flags appkit_flags; + appkit_flags.SetCascades(true) + .SetSkipPointers(false) + .SetSkipReferences(false) + .SetDontShowChildren(true) + .SetDontShowValue(false) + .SetShowMembersOneLiner(false) + .SetHideItemNames(false); + + appkit_flags.SetDontShowChildren(false); + #ifndef LLDB_DISABLE_PYTHON - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSArray"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArray0"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSSingleObjectArrayI"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFMutableArrayRef"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSDictionary"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSMutableDictionary"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSCFDictionary"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryI"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSSingleEntryDictionaryI"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryM"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFDictionaryRef"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFMutableDictionaryRef"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSSet summary", ConstString("NSSet"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFSetRef summary", ConstString("CFSetRef"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFMutableSetRef summary", ConstString("CFMutableSetRef"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSCFSet summary", ConstString("__NSCFSet"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetI summary", ConstString("__NSSetI"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetM summary", ConstString("__NSSetM"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSCountedSet summary", ConstString("NSCountedSet"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSOrderedSet summary", ConstString("NSOrderedSet"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetI summary", ConstString("__NSOrderedSetI"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetM summary", ConstString("__NSOrderedSetM"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSError_SummaryProvider, "NSError summary provider", ConstString("NSError"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSException_SummaryProvider, "NSException summary provider", ConstString("NSException"), appkit_flags); - - // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}", ConstString("$_lldb_typegen_nspair"), appkit_flags); - - appkit_flags.SetDontShowChildren(true); - - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArray0"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSSingleObjectArrayI"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFMutableArrayRef"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFArrayRef"), ScriptedSyntheticChildren::Flags()); - - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSSingleEntryDictionaryI"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSCFDictionary"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFDictionaryRef"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), ScriptedSyntheticChildren::Flags()); - - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSErrorSyntheticFrontEndCreator, "NSError synthetic children", ConstString("NSError"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSExceptionSyntheticFrontEndCreator, "NSException synthetic children", ConstString("NSException"), ScriptedSyntheticChildren::Flags()); - - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSSet synthetic children", ConstString("NSSet"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetI synthetic children", ConstString("__NSSetI"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetM synthetic children", ConstString("__NSSetM"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSMutableSet synthetic children", ConstString("NSMutableSet"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSOrderedSet synthetic children", ConstString("NSOrderedSet"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetI synthetic children", ConstString("__NSOrderedSetI"), ScriptedSyntheticChildren::Flags()); - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetM synthetic children", ConstString("__NSOrderedSetM"), ScriptedSyntheticChildren::Flags()); - - AddCXXSynthetic(objc_category_sp, lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator, "NSIndexPath synthetic children", ConstString("NSIndexPath"), ScriptedSyntheticChildren::Flags()); - - AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFBagRef"), appkit_flags); - AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("__CFBag"), appkit_flags); - AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("const struct __CFBag"), appkit_flags); - AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFMutableBagRef"), appkit_flags); - - AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("CFBinaryHeapRef"), appkit_flags); - AddCXXSummary(objc_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("__CFBinaryHeap"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSString"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFStringRef"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__CFString"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFMutableStringRef"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSMutableString"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFConstantString"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFString"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFConstantString"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFString"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSPathStore2"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSTaggedPointerString"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSAttributedStringSummaryProvider, "NSAttributedString summary provider", ConstString("NSAttributedString"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSMutableAttributedString"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSConcreteMutableAttributedString"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSBundleSummaryProvider, "NSBundle summary provider", ConstString("NSBundle"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSData"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("_NSInlineData"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteData"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteMutableData"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSMutableData"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("__NSCFData"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFDataRef"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSMachPortSummaryProvider, "NSMachPort summary provider", ConstString("NSMachPort"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSNotification"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSConcreteNotification"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSNumber"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("NSURL"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("CFURLRef"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSDate"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSDate"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSTaggedDate"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSCalendarDate"), appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("NSTimeZone"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("CFTimeZoneRef"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("__NSTimeZone"), appkit_flags); - - // CFAbsoluteTime is actually a double rather than a pointer to an object - // we do not care about the numeric value, since it is probably meaningless to users - appkit_flags.SetDontShowValue(true); - AddCXXSummary(objc_category_sp, lldb_private::formatters::CFAbsoluteTimeSummaryProvider, "CFAbsoluteTime summary provider", ConstString("CFAbsoluteTime"), appkit_flags); - appkit_flags.SetDontShowValue(false); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSIndexSet"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSMutableIndexSet"), appkit_flags); - - AddStringSummary(objc_category_sp, - "@\"${var.month%d}/${var.day%d}/${var.year%d} ${var.hour%d}:${var.minute%d}:${var.second}\"", - ConstString("CFGregorianDate"), - appkit_flags); - - AddCXXSummary(objc_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFBitVectorRef"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFMutableBitVectorRef"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFBitVector"), appkit_flags); - AddCXXSummary(objc_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFMutableBitVector"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, + "NSArray summary provider", ConstString("NSArray"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, + "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, + "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, + "NSArray summary provider", ConstString("__NSArray0"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSArraySummaryProvider, + "NSArray summary provider", + ConstString("__NSSingleObjectArrayI"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, + "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, + "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSArraySummaryProvider, + "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSArraySummaryProvider, + "NSArray summary provider", ConstString("CFMutableArrayRef"), + appkit_flags); + + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSDictionarySummaryProvider<false>, + "NSDictionary summary provider", ConstString("NSDictionary"), + appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSDictionarySummaryProvider<false>, + "NSDictionary summary provider", + ConstString("NSMutableDictionary"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSDictionarySummaryProvider<false>, + "NSDictionary summary provider", + ConstString("__NSCFDictionary"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSDictionarySummaryProvider<false>, + "NSDictionary summary provider", ConstString("__NSDictionaryI"), + appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSDictionarySummaryProvider<false>, + "NSDictionary summary provider", + ConstString("__NSSingleEntryDictionaryI"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSDictionarySummaryProvider<false>, + "NSDictionary summary provider", ConstString("__NSDictionaryM"), + appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSDictionarySummaryProvider<true>, + "NSDictionary summary provider", ConstString("CFDictionaryRef"), + appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSDictionarySummaryProvider<true>, + "NSDictionary summary provider", + ConstString("CFMutableDictionaryRef"), appkit_flags); + + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSSetSummaryProvider<false>, + "NSSet summary", ConstString("NSSet"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, + "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSSetSummaryProvider<true>, + "CFSetRef summary", ConstString("CFSetRef"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, + "CFMutableSetRef summary", ConstString("CFMutableSetRef"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSSetSummaryProvider<false>, + "__NSCFSet summary", ConstString("__NSCFSet"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSSetSummaryProvider<false>, + "__NSSetI summary", ConstString("__NSSetI"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSSetSummaryProvider<false>, + "__NSSetM summary", ConstString("__NSSetM"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, + "NSCountedSet summary", ConstString("NSCountedSet"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, + "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, + "NSOrderedSet summary", ConstString("NSOrderedSet"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, + "__NSOrderedSetI summary", ConstString("__NSOrderedSetI"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, + "__NSOrderedSetM summary", ConstString("__NSOrderedSetM"), appkit_flags); + + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSError_SummaryProvider, + "NSError summary provider", ConstString("NSError"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSException_SummaryProvider, + "NSException summary provider", ConstString("NSException"), appkit_flags); + + // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}", + // ConstString("$_lldb_typegen_nspair"), appkit_flags); + + appkit_flags.SetDontShowChildren(true); + + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSArraySyntheticFrontEndCreator, + "NSArray synthetic children", ConstString("__NSArrayM"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSArraySyntheticFrontEndCreator, + "NSArray synthetic children", ConstString("__NSArrayI"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSArraySyntheticFrontEndCreator, + "NSArray synthetic children", ConstString("__NSArray0"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSArraySyntheticFrontEndCreator, + "NSArray synthetic children", + ConstString("__NSSingleObjectArrayI"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSArraySyntheticFrontEndCreator, + "NSArray synthetic children", ConstString("NSArray"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSArraySyntheticFrontEndCreator, + "NSArray synthetic children", ConstString("NSMutableArray"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSArraySyntheticFrontEndCreator, + "NSArray synthetic children", ConstString("__NSCFArray"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSArraySyntheticFrontEndCreator, + "NSArray synthetic children", + ConstString("CFMutableArrayRef"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSArraySyntheticFrontEndCreator, + "NSArray synthetic children", ConstString("CFArrayRef"), + ScriptedSyntheticChildren::Flags()); + + AddCXXSynthetic( + objc_category_sp, + lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, + "NSDictionary synthetic children", ConstString("__NSDictionaryM"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic( + objc_category_sp, + lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, + "NSDictionary synthetic children", ConstString("__NSDictionaryI"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic( + objc_category_sp, + lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, + "NSDictionary synthetic children", + ConstString("__NSSingleEntryDictionaryI"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic( + objc_category_sp, + lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, + "NSDictionary synthetic children", ConstString("__NSCFDictionary"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic( + objc_category_sp, + lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, + "NSDictionary synthetic children", ConstString("NSDictionary"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic( + objc_category_sp, + lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, + "NSDictionary synthetic children", ConstString("NSMutableDictionary"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic( + objc_category_sp, + lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, + "NSDictionary synthetic children", ConstString("CFDictionaryRef"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic( + objc_category_sp, + lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, + "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), + ScriptedSyntheticChildren::Flags()); + + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSErrorSyntheticFrontEndCreator, + "NSError synthetic children", ConstString("NSError"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSExceptionSyntheticFrontEndCreator, + "NSException synthetic children", ConstString("NSException"), + ScriptedSyntheticChildren::Flags()); + + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSSetSyntheticFrontEndCreator, + "NSSet synthetic children", ConstString("NSSet"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSSetSyntheticFrontEndCreator, + "__NSSetI synthetic children", ConstString("__NSSetI"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSSetSyntheticFrontEndCreator, + "__NSSetM synthetic children", ConstString("__NSSetM"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic( + objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, + "NSMutableSet synthetic children", ConstString("NSMutableSet"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic( + objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, + "NSOrderedSet synthetic children", ConstString("NSOrderedSet"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic( + objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, + "__NSOrderedSetI synthetic children", ConstString("__NSOrderedSetI"), + ScriptedSyntheticChildren::Flags()); + AddCXXSynthetic( + objc_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, + "__NSOrderedSetM synthetic children", ConstString("__NSOrderedSetM"), + ScriptedSyntheticChildren::Flags()); + + AddCXXSynthetic(objc_category_sp, + lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator, + "NSIndexPath synthetic children", ConstString("NSIndexPath"), + ScriptedSyntheticChildren::Flags()); + + AddCXXSummary( + objc_category_sp, lldb_private::formatters::CFBagSummaryProvider, + "CFBag summary provider", ConstString("CFBagRef"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::CFBagSummaryProvider, + "CFBag summary provider", ConstString("__CFBag"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::CFBagSummaryProvider, + "CFBag summary provider", ConstString("const struct __CFBag"), + appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::CFBagSummaryProvider, + "CFBag summary provider", ConstString("CFMutableBagRef"), appkit_flags); + + AddCXXSummary(objc_category_sp, + lldb_private::formatters::CFBinaryHeapSummaryProvider, + "CFBinaryHeap summary provider", ConstString("CFBinaryHeapRef"), + appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::CFBinaryHeapSummaryProvider, + "CFBinaryHeap summary provider", ConstString("__CFBinaryHeap"), + appkit_flags); + + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", ConstString("NSString"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", ConstString("CFStringRef"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", ConstString("__CFString"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", ConstString("CFMutableStringRef"), + appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", ConstString("NSMutableString"), + appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", + ConstString("__NSCFConstantString"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", ConstString("__NSCFString"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", ConstString("NSCFConstantString"), + appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", ConstString("NSCFString"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", ConstString("NSPathStore2"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSStringSummaryProvider, + "NSString summary provider", + ConstString("NSTaggedPointerString"), appkit_flags); + + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSAttributedStringSummaryProvider, + "NSAttributedString summary provider", + ConstString("NSAttributedString"), appkit_flags); + AddCXXSummary( + objc_category_sp, + lldb_private::formatters::NSMutableAttributedStringSummaryProvider, + "NSMutableAttributedString summary provider", + ConstString("NSMutableAttributedString"), appkit_flags); + AddCXXSummary( + objc_category_sp, + lldb_private::formatters::NSMutableAttributedStringSummaryProvider, + "NSMutableAttributedString summary provider", + ConstString("NSConcreteMutableAttributedString"), appkit_flags); + + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSBundleSummaryProvider, + "NSBundle summary provider", ConstString("NSBundle"), appkit_flags); + + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSDataSummaryProvider<false>, + "NSData summary provider", ConstString("NSData"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, + "NSData summary provider", ConstString("_NSInlineData"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, + "NSData summary provider", ConstString("NSConcreteData"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSDataSummaryProvider<false>, + "NSData summary provider", ConstString("NSConcreteMutableData"), + appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, + "NSData summary provider", ConstString("NSMutableData"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, + "NSData summary provider", ConstString("__NSCFData"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, + "NSData summary provider", ConstString("CFDataRef"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, + "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags); + + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSMachPortSummaryProvider, + "NSMachPort summary provider", ConstString("NSMachPort"), appkit_flags); + + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSNotificationSummaryProvider, + "NSNotification summary provider", + ConstString("NSNotification"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSNotificationSummaryProvider, + "NSNotification summary provider", + ConstString("NSConcreteNotification"), appkit_flags); + + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, + "NSNumber summary provider", ConstString("NSNumber"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, + "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, + "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, + "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, + "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSNumberSummaryProvider, + "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags); + + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSURLSummaryProvider, + "NSURL summary provider", ConstString("NSURL"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSURLSummaryProvider, + "NSURL summary provider", ConstString("CFURLRef"), appkit_flags); + + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSDateSummaryProvider, + "NSDate summary provider", ConstString("NSDate"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSDateSummaryProvider, + "NSDate summary provider", ConstString("__NSDate"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSDateSummaryProvider, + "NSDate summary provider", ConstString("__NSTaggedDate"), appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSDateSummaryProvider, + "NSDate summary provider", ConstString("NSCalendarDate"), appkit_flags); + + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, + "NSTimeZone summary provider", ConstString("NSTimeZone"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSTimeZoneSummaryProvider, + "NSTimeZone summary provider", ConstString("CFTimeZoneRef"), + appkit_flags); + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, + "NSTimeZone summary provider", ConstString("__NSTimeZone"), appkit_flags); + + // CFAbsoluteTime is actually a double rather than a pointer to an object + // we do not care about the numeric value, since it is probably meaningless to + // users + appkit_flags.SetDontShowValue(true); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::CFAbsoluteTimeSummaryProvider, + "CFAbsoluteTime summary provider", + ConstString("CFAbsoluteTime"), appkit_flags); + appkit_flags.SetDontShowValue(false); + + AddCXXSummary( + objc_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, + "NSIndexSet summary provider", ConstString("NSIndexSet"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::NSIndexSetSummaryProvider, + "NSIndexSet summary provider", ConstString("NSMutableIndexSet"), + appkit_flags); + + AddStringSummary(objc_category_sp, + "@\"${var.month%d}/${var.day%d}/${var.year%d} " + "${var.hour%d}:${var.minute%d}:${var.second}\"", + ConstString("CFGregorianDate"), appkit_flags); + + AddCXXSummary(objc_category_sp, + lldb_private::formatters::CFBitVectorSummaryProvider, + "CFBitVector summary provider", ConstString("CFBitVectorRef"), + appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::CFBitVectorSummaryProvider, + "CFBitVector summary provider", + ConstString("CFMutableBitVectorRef"), appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::CFBitVectorSummaryProvider, + "CFBitVector summary provider", ConstString("__CFBitVector"), + appkit_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::CFBitVectorSummaryProvider, + "CFBitVector summary provider", + ConstString("__CFMutableBitVector"), appkit_flags); #endif // LLDB_DISABLE_PYTHON } -static void -LoadCoreMediaFormatters(TypeCategoryImplSP objc_category_sp) -{ - if (!objc_category_sp) - return; - - TypeSummaryImpl::Flags cm_flags; - cm_flags.SetCascades(true) - .SetDontShowChildren(false) - .SetDontShowValue(false) - .SetHideItemNames(false) - .SetShowMembersOneLiner(false) - .SetSkipPointers(false) - .SetSkipReferences(false); - +static void LoadCoreMediaFormatters(TypeCategoryImplSP objc_category_sp) { + if (!objc_category_sp) + return; + + TypeSummaryImpl::Flags cm_flags; + cm_flags.SetCascades(true) + .SetDontShowChildren(false) + .SetDontShowValue(false) + .SetHideItemNames(false) + .SetShowMembersOneLiner(false) + .SetSkipPointers(false) + .SetSkipReferences(false); + #ifndef LLDB_DISABLE_PYTHON - AddCXXSummary(objc_category_sp, lldb_private::formatters::CMTimeSummaryProvider, "CMTime summary provider", ConstString("CMTime"), cm_flags); + AddCXXSummary(objc_category_sp, + lldb_private::formatters::CMTimeSummaryProvider, + "CMTime summary provider", ConstString("CMTime"), cm_flags); #endif // LLDB_DISABLE_PYTHON } -lldb::TypeCategoryImplSP -ObjCLanguage::GetFormatters () -{ - static std::once_flag g_initialize; - static TypeCategoryImplSP g_category; - - std::call_once(g_initialize, [this] () -> void { - DataVisualization::Categories::GetCategory(GetPluginName(), g_category); - if (g_category) - { - LoadCoreMediaFormatters(g_category); - LoadObjCFormatters(g_category); - } - }); - return g_category; +lldb::TypeCategoryImplSP ObjCLanguage::GetFormatters() { + static std::once_flag g_initialize; + static TypeCategoryImplSP g_category; + + std::call_once(g_initialize, [this]() -> void { + DataVisualization::Categories::GetCategory(GetPluginName(), g_category); + if (g_category) { + LoadCoreMediaFormatters(g_category); + LoadObjCFormatters(g_category); + } + }); + return g_category; } std::vector<ConstString> -ObjCLanguage::GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic) -{ - std::vector<ConstString> result; - - if (use_dynamic == lldb::eNoDynamicValues) - return result; - - CompilerType compiler_type(valobj.GetCompilerType()); - - const bool check_cpp = false; - const bool check_objc = true; - bool canBeObjCDynamic = compiler_type.IsPossibleDynamicType(nullptr, check_cpp, check_objc); - - if (canBeObjCDynamic) - { - do { - lldb::ProcessSP process_sp = valobj.GetProcessSP(); - if (!process_sp) - break; - ObjCLanguageRuntime* runtime = process_sp->GetObjCLanguageRuntime(); - if (runtime == nullptr) - break; - ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp (runtime->GetClassDescriptor(valobj)); - if (!objc_class_sp) - break; - if (ConstString name = objc_class_sp->GetClassName()) - result.push_back(name); - } while (false); - } - +ObjCLanguage::GetPossibleFormattersMatches(ValueObject &valobj, + lldb::DynamicValueType use_dynamic) { + std::vector<ConstString> result; + + if (use_dynamic == lldb::eNoDynamicValues) return result; + + CompilerType compiler_type(valobj.GetCompilerType()); + + const bool check_cpp = false; + const bool check_objc = true; + bool canBeObjCDynamic = + compiler_type.IsPossibleDynamicType(nullptr, check_cpp, check_objc); + + if (canBeObjCDynamic) { + do { + lldb::ProcessSP process_sp = valobj.GetProcessSP(); + if (!process_sp) + break; + ObjCLanguageRuntime *runtime = process_sp->GetObjCLanguageRuntime(); + if (runtime == nullptr) + break; + ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp( + runtime->GetClassDescriptor(valobj)); + if (!objc_class_sp) + break; + if (ConstString name = objc_class_sp->GetClassName()) + result.push_back(name); + } while (false); + } + + return result; } -std::unique_ptr<Language::TypeScavenger> -ObjCLanguage::GetTypeScavenger () -{ - class ObjCTypeScavenger : public Language::TypeScavenger - { +std::unique_ptr<Language::TypeScavenger> ObjCLanguage::GetTypeScavenger() { + class ObjCTypeScavenger : public Language::TypeScavenger { + private: + class ObjCScavengerResult : public Language::TypeScavenger::Result { + public: + ObjCScavengerResult(CompilerType type) + : Language::TypeScavenger::Result(), m_compiler_type(type) {} + + bool IsValid() override { return m_compiler_type.IsValid(); } + + bool DumpToStream(Stream &stream, bool print_help_if_available) override { + if (IsValid()) { + m_compiler_type.DumpTypeDescription(&stream); + stream.EOL(); + return true; + } + return false; + } + + ~ObjCScavengerResult() override = default; + private: - class ObjCScavengerResult : public Language::TypeScavenger::Result - { - public: - ObjCScavengerResult (CompilerType type) : - Language::TypeScavenger::Result(), - m_compiler_type(type) - { - } - - bool - IsValid () override - { - return m_compiler_type.IsValid(); - } - - bool - DumpToStream (Stream& stream, - bool print_help_if_available) override - { - if (IsValid()) - { - m_compiler_type.DumpTypeDescription(&stream); - stream.EOL(); - return true; - } - return false; - } + CompilerType m_compiler_type; + }; - ~ObjCScavengerResult() override = default; - - private: - CompilerType m_compiler_type; - }; - - protected: - ObjCTypeScavenger() = default; - - ~ObjCTypeScavenger() override = default; - - bool - Find_Impl (ExecutionContextScope *exe_scope, - const char *key, - ResultSet &results) override - { - bool result = false; - - Target* target = exe_scope->CalculateTarget().get(); - if (target) - { - if (auto clang_modules_decl_vendor = target->GetClangModulesDeclVendor()) - { - std::vector <clang::NamedDecl*> decls; - ConstString key_cs(key); - - if (clang_modules_decl_vendor->FindDecls(key_cs, false, UINT32_MAX, decls) > 0 && - !decls.empty()) - { - CompilerType module_type = ClangASTContext::GetTypeForDecl(decls.front()); - result = true; - std::unique_ptr<Language::TypeScavenger::Result> result(new ObjCScavengerResult(module_type)); - results.insert(std::move(result)); - } - } - } - - if (!result) - { - Process* process = exe_scope->CalculateProcess().get(); - if (process) - { - const bool create_on_demand = false; - auto objc_runtime = process->GetObjCLanguageRuntime(create_on_demand); - if (objc_runtime) - { - auto decl_vendor = objc_runtime->GetDeclVendor(); - if (decl_vendor) - { - std::vector<clang::NamedDecl *> decls; - ConstString name(key); - decl_vendor->FindDecls(name, true, UINT32_MAX, decls); - for (auto decl : decls) - { - if (decl) - { - if (CompilerType candidate = ClangASTContext::GetTypeForDecl(decl)) - { - result = true; - std::unique_ptr<Language::TypeScavenger::Result> result(new ObjCScavengerResult(candidate)); - results.insert(std::move(result)); - } - } - } - } - } + protected: + ObjCTypeScavenger() = default; + + ~ObjCTypeScavenger() override = default; + + bool Find_Impl(ExecutionContextScope *exe_scope, const char *key, + ResultSet &results) override { + bool result = false; + + Target *target = exe_scope->CalculateTarget().get(); + if (target) { + if (auto clang_modules_decl_vendor = + target->GetClangModulesDeclVendor()) { + std::vector<clang::NamedDecl *> decls; + ConstString key_cs(key); + + if (clang_modules_decl_vendor->FindDecls(key_cs, false, UINT32_MAX, + decls) > 0 && + !decls.empty()) { + CompilerType module_type = + ClangASTContext::GetTypeForDecl(decls.front()); + result = true; + std::unique_ptr<Language::TypeScavenger::Result> result( + new ObjCScavengerResult(module_type)); + results.insert(std::move(result)); + } + } + } + + if (!result) { + Process *process = exe_scope->CalculateProcess().get(); + if (process) { + const bool create_on_demand = false; + auto objc_runtime = process->GetObjCLanguageRuntime(create_on_demand); + if (objc_runtime) { + auto decl_vendor = objc_runtime->GetDeclVendor(); + if (decl_vendor) { + std::vector<clang::NamedDecl *> decls; + ConstString name(key); + decl_vendor->FindDecls(name, true, UINT32_MAX, decls); + for (auto decl : decls) { + if (decl) { + if (CompilerType candidate = + ClangASTContext::GetTypeForDecl(decl)) { + result = true; + std::unique_ptr<Language::TypeScavenger::Result> result( + new ObjCScavengerResult(candidate)); + results.insert(std::move(result)); + } } + } } - - return result; + } } + } - friend class lldb_private::ObjCLanguage; - }; - - return std::unique_ptr<TypeScavenger>(new ObjCTypeScavenger()); + return result; + } + + friend class lldb_private::ObjCLanguage; + }; + + return std::unique_ptr<TypeScavenger>(new ObjCTypeScavenger()); } -bool -ObjCLanguage::GetFormatterPrefixSuffix (ValueObject& valobj, ConstString type_hint, - std::string& prefix, std::string& suffix) -{ - static ConstString g_CFBag("CFBag"); - static ConstString g_CFBinaryHeap("CFBinaryHeap"); - - static ConstString g_NSNumberChar("NSNumber:char"); - static ConstString g_NSNumberShort("NSNumber:short"); - static ConstString g_NSNumberInt("NSNumber:int"); - static ConstString g_NSNumberLong("NSNumber:long"); - static ConstString g_NSNumberFloat("NSNumber:float"); - static ConstString g_NSNumberDouble("NSNumber:double"); - - static ConstString g_NSData("NSData"); - static ConstString g_NSArray("NSArray"); - static ConstString g_NSString("NSString"); - static ConstString g_NSStringStar("NSString*"); - - if (type_hint.IsEmpty()) - return false; - - prefix.clear(); - suffix.clear(); - - if (type_hint == g_CFBag || - type_hint == g_CFBinaryHeap) - { - prefix = "@"; - return true; - } - - if (type_hint == g_NSNumberChar) - { - prefix = "(char)"; - return true; - } - if (type_hint == g_NSNumberShort) - { - prefix = "(short)"; - return true; - } - if (type_hint == g_NSNumberInt) - { - prefix = "(int)"; - return true; - } - if (type_hint == g_NSNumberLong) - { - prefix = "(long)"; - return true; - } - if (type_hint == g_NSNumberFloat) - { - prefix = "(float)"; - return true; - } - if (type_hint == g_NSNumberDouble) - { - prefix = "(double)"; - return true; - } - - if (type_hint == g_NSData || - type_hint == g_NSArray) - { - prefix = "@\""; - suffix = "\""; - return true; - } - - if (type_hint == g_NSString || - type_hint == g_NSStringStar) - { - prefix = "@"; - return true; - } - +bool ObjCLanguage::GetFormatterPrefixSuffix(ValueObject &valobj, + ConstString type_hint, + std::string &prefix, + std::string &suffix) { + static ConstString g_CFBag("CFBag"); + static ConstString g_CFBinaryHeap("CFBinaryHeap"); + + static ConstString g_NSNumberChar("NSNumber:char"); + static ConstString g_NSNumberShort("NSNumber:short"); + static ConstString g_NSNumberInt("NSNumber:int"); + static ConstString g_NSNumberLong("NSNumber:long"); + static ConstString g_NSNumberFloat("NSNumber:float"); + static ConstString g_NSNumberDouble("NSNumber:double"); + + static ConstString g_NSData("NSData"); + static ConstString g_NSArray("NSArray"); + static ConstString g_NSString("NSString"); + static ConstString g_NSStringStar("NSString*"); + + if (type_hint.IsEmpty()) return false; + + prefix.clear(); + suffix.clear(); + + if (type_hint == g_CFBag || type_hint == g_CFBinaryHeap) { + prefix = "@"; + return true; + } + + if (type_hint == g_NSNumberChar) { + prefix = "(char)"; + return true; + } + if (type_hint == g_NSNumberShort) { + prefix = "(short)"; + return true; + } + if (type_hint == g_NSNumberInt) { + prefix = "(int)"; + return true; + } + if (type_hint == g_NSNumberLong) { + prefix = "(long)"; + return true; + } + if (type_hint == g_NSNumberFloat) { + prefix = "(float)"; + return true; + } + if (type_hint == g_NSNumberDouble) { + prefix = "(double)"; + return true; + } + + if (type_hint == g_NSData || type_hint == g_NSArray) { + prefix = "@\""; + suffix = "\""; + return true; + } + + if (type_hint == g_NSString || type_hint == g_NSStringStar) { + prefix = "@"; + return true; + } + + return false; } -bool -ObjCLanguage::IsNilReference (ValueObject& valobj) -{ - const uint32_t mask = eTypeIsObjC | eTypeIsPointer; - bool isObjCpointer = (((valobj.GetCompilerType().GetTypeInfo(nullptr)) & mask) == mask); - if (!isObjCpointer) - return false; - bool canReadValue = true; - bool isZero = valobj.GetValueAsUnsigned(0,&canReadValue) == 0; - return canReadValue && isZero; +bool ObjCLanguage::IsNilReference(ValueObject &valobj) { + const uint32_t mask = eTypeIsObjC | eTypeIsPointer; + bool isObjCpointer = + (((valobj.GetCompilerType().GetTypeInfo(nullptr)) & mask) == mask); + if (!isObjCpointer) + return false; + bool canReadValue = true; + bool isZero = valobj.GetValueAsUnsigned(0, &canReadValue) == 0; + return canReadValue && isZero; } diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h index b1435d26429..c5010b67526 100644 --- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h @@ -17,195 +17,143 @@ // Other libraries and framework includes // Project includes -#include "lldb/lldb-private.h" #include "lldb/Core/ConstString.h" #include "lldb/Target/Language.h" +#include "lldb/lldb-private.h" namespace lldb_private { - -class ObjCLanguage : - public Language -{ + +class ObjCLanguage : public Language { public: - class MethodName - { - public: - enum Type - { - eTypeUnspecified, - eTypeClassMethod, - eTypeInstanceMethod - }; - - MethodName () : - m_full(), - m_class(), - m_category(), - m_selector(), - m_type (eTypeUnspecified), - m_category_is_valid (false) - { - } - - MethodName (const char *name, bool strict) : - m_full(), - m_class(), - m_category(), - m_selector(), - m_type (eTypeUnspecified), - m_category_is_valid (false) - { - SetName (name, strict); - } - - void - Clear(); - - bool - IsValid (bool strict) const - { - // If "strict" is true, the name must have everything specified including - // the leading "+" or "-" on the method name - if (strict && m_type == eTypeUnspecified) - return false; - // Other than that, m_full will only be filled in if the objective C - // name is valid. - return (bool)m_full; - } - - bool - HasCategory() - { - return !GetCategory().IsEmpty(); - } - - Type - GetType () const - { - return m_type; - } - - const ConstString & - GetFullName () const - { - return m_full; - } - - ConstString - GetFullNameWithoutCategory (bool empty_if_no_category); - - bool - SetName (const char *name, bool strict); - - const ConstString & - GetClassName (); - - const ConstString & - GetClassNameWithCategory (); - - const ConstString & - GetCategory (); - - const ConstString & - GetSelector (); - - // Get all possible names for a method. Examples: - // If name is "+[NSString(my_additions) myStringWithCString:]" - // names[0] => "+[NSString(my_additions) myStringWithCString:]" - // names[1] => "+[NSString myStringWithCString:]" - // If name is specified without the leading '+' or '-' like "[NSString(my_additions) myStringWithCString:]" - // names[0] => "+[NSString(my_additions) myStringWithCString:]" - // names[1] => "-[NSString(my_additions) myStringWithCString:]" - // names[2] => "+[NSString myStringWithCString:]" - // names[3] => "-[NSString myStringWithCString:]" - size_t - GetFullNames (std::vector<ConstString> &names, bool append); - - protected: - ConstString m_full; // Full name: "+[NSString(my_additions) myStringWithCString:]" - ConstString m_class; // Class name: "NSString" - ConstString m_class_category; // Class with category: "NSString(my_additions)" - ConstString m_category; // Category: "my_additions" - ConstString m_selector; // Selector: "myStringWithCString:" - Type m_type; - bool m_category_is_valid; - }; - - ObjCLanguage() = default; - - ~ObjCLanguage() override = default; - - lldb::LanguageType - GetLanguageType () const override - { - return lldb::eLanguageTypeObjC; + class MethodName { + public: + enum Type { eTypeUnspecified, eTypeClassMethod, eTypeInstanceMethod }; + + MethodName() + : m_full(), m_class(), m_category(), m_selector(), + m_type(eTypeUnspecified), m_category_is_valid(false) {} + + MethodName(const char *name, bool strict) + : m_full(), m_class(), m_category(), m_selector(), + m_type(eTypeUnspecified), m_category_is_valid(false) { + SetName(name, strict); } - - lldb::TypeCategoryImplSP - GetFormatters () override; - - std::vector<ConstString> - GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic) override; - - std::unique_ptr<TypeScavenger> - GetTypeScavenger () override; - - bool - GetFormatterPrefixSuffix (ValueObject& valobj, ConstString type_hint, - std::string& prefix, std::string& suffix) override; - - bool - IsNilReference (ValueObject& valobj) override; - - //------------------------------------------------------------------ - // Static Functions - //------------------------------------------------------------------ - static void - Initialize(); - - static void - Terminate(); - - static lldb_private::Language * - CreateInstance (lldb::LanguageType language); - - static lldb_private::ConstString - GetPluginNameStatic(); - - static bool - IsPossibleObjCMethodName (const char *name) - { - if (!name) - return false; - bool starts_right = (name[0] == '+' || name[0] == '-') && name[1] == '['; - bool ends_right = (name[strlen(name) - 1] == ']'); - return (starts_right && ends_right); - } - - static bool - IsPossibleObjCSelector (const char *name) - { - if (!name) - return false; - - if (strchr(name, ':') == nullptr) - return true; - else if (name[strlen(name) - 1] == ':') - return true; - else - return false; + + void Clear(); + + bool IsValid(bool strict) const { + // If "strict" is true, the name must have everything specified including + // the leading "+" or "-" on the method name + if (strict && m_type == eTypeUnspecified) + return false; + // Other than that, m_full will only be filled in if the objective C + // name is valid. + return (bool)m_full; } - - //------------------------------------------------------------------ - // PluginInterface protocol - //------------------------------------------------------------------ + + bool HasCategory() { return !GetCategory().IsEmpty(); } + + Type GetType() const { return m_type; } + + const ConstString &GetFullName() const { return m_full; } + + ConstString GetFullNameWithoutCategory(bool empty_if_no_category); + + bool SetName(const char *name, bool strict); + + const ConstString &GetClassName(); + + const ConstString &GetClassNameWithCategory(); + + const ConstString &GetCategory(); + + const ConstString &GetSelector(); + + // Get all possible names for a method. Examples: + // If name is "+[NSString(my_additions) myStringWithCString:]" + // names[0] => "+[NSString(my_additions) myStringWithCString:]" + // names[1] => "+[NSString myStringWithCString:]" + // If name is specified without the leading '+' or '-' like + // "[NSString(my_additions) myStringWithCString:]" + // names[0] => "+[NSString(my_additions) myStringWithCString:]" + // names[1] => "-[NSString(my_additions) myStringWithCString:]" + // names[2] => "+[NSString myStringWithCString:]" + // names[3] => "-[NSString myStringWithCString:]" + size_t GetFullNames(std::vector<ConstString> &names, bool append); + + protected: + ConstString + m_full; // Full name: "+[NSString(my_additions) myStringWithCString:]" + ConstString m_class; // Class name: "NSString" ConstString - GetPluginName() override; - - uint32_t - GetPluginVersion() override; + m_class_category; // Class with category: "NSString(my_additions)" + ConstString m_category; // Category: "my_additions" + ConstString m_selector; // Selector: "myStringWithCString:" + Type m_type; + bool m_category_is_valid; + }; + + ObjCLanguage() = default; + + ~ObjCLanguage() override = default; + + lldb::LanguageType GetLanguageType() const override { + return lldb::eLanguageTypeObjC; + } + + lldb::TypeCategoryImplSP GetFormatters() override; + + std::vector<ConstString> + GetPossibleFormattersMatches(ValueObject &valobj, + lldb::DynamicValueType use_dynamic) override; + + std::unique_ptr<TypeScavenger> GetTypeScavenger() override; + + bool GetFormatterPrefixSuffix(ValueObject &valobj, ConstString type_hint, + std::string &prefix, + std::string &suffix) override; + + bool IsNilReference(ValueObject &valobj) override; + + //------------------------------------------------------------------ + // Static Functions + //------------------------------------------------------------------ + static void Initialize(); + + static void Terminate(); + + static lldb_private::Language *CreateInstance(lldb::LanguageType language); + + static lldb_private::ConstString GetPluginNameStatic(); + + static bool IsPossibleObjCMethodName(const char *name) { + if (!name) + return false; + bool starts_right = (name[0] == '+' || name[0] == '-') && name[1] == '['; + bool ends_right = (name[strlen(name) - 1] == ']'); + return (starts_right && ends_right); + } + + static bool IsPossibleObjCSelector(const char *name) { + if (!name) + return false; + + if (strchr(name, ':') == nullptr) + return true; + else if (name[strlen(name) - 1] == ':') + return true; + else + return false; + } + + //------------------------------------------------------------------ + // PluginInterface protocol + //------------------------------------------------------------------ + ConstString GetPluginName() override; + + uint32_t GetPluginVersion() override; }; - + } // namespace lldb_private #endif // liblldb_ObjCLanguage_h_ diff --git a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp index 62ddafefad9..cb73eef5468 100644 --- a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.cpp @@ -1,4 +1,5 @@ -//===-- ObjCPlusPlusLanguage.cpp --------------------------------------*- C++ -*-===// +//===-- ObjCPlusPlusLanguage.cpp --------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // @@ -15,54 +16,37 @@ using namespace lldb; using namespace lldb_private; -void -ObjCPlusPlusLanguage::Initialize() -{ - PluginManager::RegisterPlugin (GetPluginNameStatic(), - "Objective-C++ Language", - CreateInstance); +void ObjCPlusPlusLanguage::Initialize() { + PluginManager::RegisterPlugin(GetPluginNameStatic(), "Objective-C++ Language", + CreateInstance); } -void -ObjCPlusPlusLanguage::Terminate() -{ - PluginManager::UnregisterPlugin (CreateInstance); +void ObjCPlusPlusLanguage::Terminate() { + PluginManager::UnregisterPlugin(CreateInstance); } -lldb_private::ConstString -ObjCPlusPlusLanguage::GetPluginNameStatic() -{ - static ConstString g_name("objcplusplus"); - return g_name; +lldb_private::ConstString ObjCPlusPlusLanguage::GetPluginNameStatic() { + static ConstString g_name("objcplusplus"); + return g_name; } - //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ -lldb_private::ConstString -ObjCPlusPlusLanguage::GetPluginName() -{ - return GetPluginNameStatic(); +lldb_private::ConstString ObjCPlusPlusLanguage::GetPluginName() { + return GetPluginNameStatic(); } -uint32_t -ObjCPlusPlusLanguage::GetPluginVersion() -{ - return 1; -} +uint32_t ObjCPlusPlusLanguage::GetPluginVersion() { return 1; } //------------------------------------------------------------------ // Static Functions //------------------------------------------------------------------ -Language * -ObjCPlusPlusLanguage::CreateInstance (lldb::LanguageType language) -{ - switch (language) - { - case lldb::eLanguageTypeObjC_plus_plus: - return new ObjCPlusPlusLanguage(); - default: - return nullptr; - } +Language *ObjCPlusPlusLanguage::CreateInstance(lldb::LanguageType language) { + switch (language) { + case lldb::eLanguageTypeObjC_plus_plus: + return new ObjCPlusPlusLanguage(); + default: + return nullptr; + } } diff --git a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h index 0e1db66b089..588b52215c1 100644 --- a/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h +++ b/lldb/source/Plugins/Language/ObjCPlusPlus/ObjCPlusPlusLanguage.h @@ -14,50 +14,40 @@ // C++ Includes // Other libraries and framework includes // Project includes -#include "lldb/lldb-private.h" #include "lldb/Target/Language.h" +#include "lldb/lldb-private.h" namespace lldb_private { - -class ObjCPlusPlusLanguage : - public Language -{ + +class ObjCPlusPlusLanguage : public Language { public: - ObjCPlusPlusLanguage() = default; - - ~ObjCPlusPlusLanguage() override = default; - - lldb::LanguageType - GetLanguageType() const override - { - return lldb::eLanguageTypeObjC_plus_plus; - } - - //------------------------------------------------------------------ - // Static Functions - //------------------------------------------------------------------ - static void - Initialize(); - - static void - Terminate(); - - static lldb_private::Language * - CreateInstance (lldb::LanguageType language); - - static lldb_private::ConstString - GetPluginNameStatic(); - - //------------------------------------------------------------------ - // PluginInterface protocol - //------------------------------------------------------------------ - ConstString - GetPluginName() override; - - uint32_t - GetPluginVersion() override; + ObjCPlusPlusLanguage() = default; + + ~ObjCPlusPlusLanguage() override = default; + + lldb::LanguageType GetLanguageType() const override { + return lldb::eLanguageTypeObjC_plus_plus; + } + + //------------------------------------------------------------------ + // Static Functions + //------------------------------------------------------------------ + static void Initialize(); + + static void Terminate(); + + static lldb_private::Language *CreateInstance(lldb::LanguageType language); + + static lldb_private::ConstString GetPluginNameStatic(); + + //------------------------------------------------------------------ + // PluginInterface protocol + //------------------------------------------------------------------ + ConstString GetPluginName() override; + + uint32_t GetPluginVersion() override; }; - + } // namespace lldb_private #endif // liblldb_CPlusPlusLanguage_h_ |