From 419d79189f56a4d819f7e958a7ea695efaef9875 Mon Sep 17 00:00:00 2001 From: Enrico Granata Date: Fri, 4 Sep 2015 00:33:51 +0000 Subject: [PATCH] Nuke CXXFormatterFunctions.cpp - split the contents of it across different files, so that things are better organized along the C++/ObjC line This is preparatory work for moving these formatters into language categories llvm-svn: 246827 --- lldb/include/lldb/DataFormatters/CF.h | 34 ++ .../DataFormatters/CXXFormatterFunctions.h | 375 ------------------ .../lldb/DataFormatters/CXXFunctionPointer.h | 25 ++ lldb/include/lldb/DataFormatters/Cocoa.h | 115 ++++++ lldb/include/lldb/DataFormatters/CoreMedia.h | 26 ++ .../lldb/DataFormatters/CxxStringTypes.h | 41 ++ .../lldb/DataFormatters/FormattersHelpers.h | 34 +- lldb/include/lldb/DataFormatters/LibCxx.h | 141 +++++++ lldb/include/lldb/DataFormatters/LibStdcpp.h | 27 ++ .../lldb/DataFormatters/VectorIterator.h | 52 +++ lldb/lldb.xcodeproj/project.pbxproj | 26 +- lldb/source/DataFormatters/CF.cpp | 3 +- lldb/source/DataFormatters/CMakeLists.txt | 2 +- .../DataFormatters/CXXFormatterFunctions.cpp | 266 ------------- .../DataFormatters/CXXFunctionPointer.cpp | 63 +++ lldb/source/DataFormatters/Cocoa.cpp | 16 +- lldb/source/DataFormatters/CoreMedia.cpp | 2 +- lldb/source/DataFormatters/CxxStringTypes.cpp | 7 +- lldb/source/DataFormatters/FormatManager.cpp | 11 +- .../DataFormatters/FormattersHelpers.cpp | 177 +++++++++ lldb/source/DataFormatters/LibCxx.cpp | 8 +- .../DataFormatters/LibCxxInitializerList.cpp | 3 +- lldb/source/DataFormatters/LibCxxList.cpp | 3 +- lldb/source/DataFormatters/LibCxxMap.cpp | 3 +- .../DataFormatters/LibCxxUnorderedMap.cpp | 3 +- lldb/source/DataFormatters/LibCxxVector.cpp | 3 +- lldb/source/DataFormatters/LibStdcpp.cpp | 47 ++- lldb/source/DataFormatters/NSArray.cpp | 3 +- lldb/source/DataFormatters/NSDictionary.cpp | 3 +- lldb/source/DataFormatters/NSIndexPath.cpp | 3 +- lldb/source/DataFormatters/NSSet.cpp | 3 +- lldb/source/DataFormatters/VectorType.cpp | 2 +- 32 files changed, 845 insertions(+), 682 deletions(-) create mode 100644 lldb/include/lldb/DataFormatters/CF.h delete mode 100644 lldb/include/lldb/DataFormatters/CXXFormatterFunctions.h create mode 100644 lldb/include/lldb/DataFormatters/CXXFunctionPointer.h create mode 100644 lldb/include/lldb/DataFormatters/Cocoa.h create mode 100644 lldb/include/lldb/DataFormatters/CoreMedia.h create mode 100644 lldb/include/lldb/DataFormatters/CxxStringTypes.h create mode 100644 lldb/include/lldb/DataFormatters/LibCxx.h create mode 100644 lldb/include/lldb/DataFormatters/LibStdcpp.h create mode 100644 lldb/include/lldb/DataFormatters/VectorIterator.h delete mode 100644 lldb/source/DataFormatters/CXXFormatterFunctions.cpp create mode 100644 lldb/source/DataFormatters/CXXFunctionPointer.cpp diff --git a/lldb/include/lldb/DataFormatters/CF.h b/lldb/include/lldb/DataFormatters/CF.h new file mode 100644 index 000000000000..4044f09f585e --- /dev/null +++ b/lldb/include/lldb/DataFormatters/CF.h @@ -0,0 +1,34 @@ +//===-- CF.h ---------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_CF_h_ +#define liblldb_CF_h_ + +#include "lldb/Core/Stream.h" +#include "lldb/Core/ValueObject.h" +#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 lldb_private + +#endif // liblldb_CF_h_ diff --git a/lldb/include/lldb/DataFormatters/CXXFormatterFunctions.h b/lldb/include/lldb/DataFormatters/CXXFormatterFunctions.h deleted file mode 100644 index 3077f56b1d66..000000000000 --- a/lldb/include/lldb/DataFormatters/CXXFormatterFunctions.h +++ /dev/null @@ -1,375 +0,0 @@ -//===-- CXXFormatterFunctions.h------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef liblldb_CXXFormatterFunctions_h_ -#define liblldb_CXXFormatterFunctions_h_ - -#include -#include - -#include "lldb/lldb-forward.h" - -#include "lldb/Core/ConstString.h" -#include "lldb/DataFormatters/FormatClasses.h" -#include "lldb/DataFormatters/TypeSynthetic.h" -#include "lldb/DataFormatters/VectorType.h" -#include "lldb/Target/ExecutionContext.h" -#include "lldb/Target/ObjCLanguageRuntime.h" -#include "lldb/Target/Target.h" - -#include "clang/AST/ASTContext.h" - -namespace lldb_private { - namespace formatters - { - StackFrame* - GetViableFrame (ExecutionContext exe_ctx); - - bool - ExtractValueFromObjCExpression (ValueObject &valobj, - const char* target_type, - const char* selector, - uint64_t &value); - - bool - ExtractSummaryFromObjCExpression (ValueObject &valobj, - const char* target_type, - const char* selector, - Stream &stream); - - lldb::ValueObjectSP - CallSelectorOnObject (ValueObject &valobj, - const char* return_type, - const char* selector, - uint64_t index); - - lldb::ValueObjectSP - CallSelectorOnObject (ValueObject &valobj, - const char* return_type, - const char* selector, - const char* key); - - size_t - ExtractIndexFromString (const char* item_name); - - time_t - GetOSXEpoch (); - - bool - FunctionPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); // C++ function pointer - - 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 - - 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<> - - bool - ObjCClassSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - SyntheticChildrenFrontEnd* ObjCClassSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - template - bool - NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSIndexSetSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSArraySummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - template - bool - NSSetSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - template - 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 - 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 - NSDateSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - CFAbsoluteTimeSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSBundleSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSTaggedString_SummaryProvider (ObjCLanguageRuntime::ClassDescriptorSP descriptor, Stream& stream); - - bool - NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - NSURLSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - template - bool - ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - bool - RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - extern template bool - NSDictionarySummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&) ; - - extern template bool - NSDictionarySummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&) ; - - extern template bool - NSDataSummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&) ; - - extern template bool - NSDataSummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&) ; - - extern template bool - ObjCSELSummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&); - - extern template bool - ObjCSELSummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&); - - bool - CMTimeSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* NSSetSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* NSIndexPathSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - 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 m_children; - }; - - SyntheticChildrenFrontEnd* LibcxxVectorBoolSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - bool - LibcxxContainerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); - - class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - 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; - - ~LibstdcppMapIteratorSyntheticFrontEnd() override; - - private: - ExecutionContextRef m_exe_ctx_ref; - lldb::addr_t m_pair_address; - CompilerType m_pair_type; - EvaluateExpressionOptions m_options; - lldb::ValueObjectSP m_pair_sp; - }; - - SyntheticChildrenFrontEnd* LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - 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); - - class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp, - ConstString item_name); - - size_t - CalculateNumChildren() override; - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override; - - bool - Update() override; - - bool - MightHaveChildren() override; - - size_t - GetIndexOfChildWithName(const ConstString &name) override; - - ~VectorIteratorSyntheticFrontEnd() override; - - private: - ExecutionContextRef m_exe_ctx_ref; - ConstString m_item_name; - lldb::ValueObjectSP m_item_sp; - }; - - SyntheticChildrenFrontEnd* LibCxxVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - - SyntheticChildrenFrontEnd* LibStdcppVectorIteratorSyntheticFrontEndCreator (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* VectorTypeSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); - } // namespace formatters -} // namespace lldb_private - -#endif // liblldb_CXXFormatterFunctions_h_ diff --git a/lldb/include/lldb/DataFormatters/CXXFunctionPointer.h b/lldb/include/lldb/DataFormatters/CXXFunctionPointer.h new file mode 100644 index 000000000000..54d13e01bfc2 --- /dev/null +++ b/lldb/include/lldb/DataFormatters/CXXFunctionPointer.h @@ -0,0 +1,25 @@ +//===-- CXXFunctionPointer.h ------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_CXXFunctionPointer_h_ +#define liblldb_CXXFunctionPointer_h_ + +#include "lldb/Core/Stream.h" +#include "lldb/Core/ValueObject.h" +#include "lldb/DataFormatters/TypeSummary.h" + +namespace lldb_private { + namespace formatters + { + bool + CXXFunctionPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + } // namespace formatters +} // namespace lldb_private + +#endif // liblldb_CXXFunctionPointer_h_ diff --git a/lldb/include/lldb/DataFormatters/Cocoa.h b/lldb/include/lldb/DataFormatters/Cocoa.h new file mode 100644 index 000000000000..f29e7d1752f0 --- /dev/null +++ b/lldb/include/lldb/DataFormatters/Cocoa.h @@ -0,0 +1,115 @@ +//===-- Cocoa.h ---------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_Cocoa_h_ +#define liblldb_Cocoa_h_ + +#include "lldb/Core/Stream.h" +#include "lldb/Core/ValueObject.h" +#include "lldb/DataFormatters/TypeSummary.h" +#include "lldb/Target/ObjCLanguageRuntime.h" + +namespace lldb_private { + namespace formatters + { + template + bool + NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + + bool + NSIndexSetSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + + bool + NSArraySummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + + template + bool + NSSetSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + + template + 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 + NSStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + + bool + NSTaggedString_SummaryProvider (ObjCLanguageRuntime::ClassDescriptorSP descriptor, Stream& stream); + + bool + NSAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + + bool + NSMutableAttributedStringSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + + bool + NSURLSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + + extern template bool + NSDictionarySummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&) ; + + extern template bool + NSDictionarySummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&) ; + + extern template bool + NSDataSummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&) ; + + extern template bool + NSDataSummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&) ; + + SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); + + SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); + + SyntheticChildrenFrontEnd* NSSetSyntheticFrontEndCreator (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); + + template + bool + ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + + extern template bool + ObjCSELSummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&); + + extern template bool + ObjCSELSummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&); + + bool + RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + } // namespace formatters +} // namespace lldb_private + +#endif // liblldb_Cocoa_h_ diff --git a/lldb/include/lldb/DataFormatters/CoreMedia.h b/lldb/include/lldb/DataFormatters/CoreMedia.h new file mode 100644 index 000000000000..2ffabaadccf5 --- /dev/null +++ b/lldb/include/lldb/DataFormatters/CoreMedia.h @@ -0,0 +1,26 @@ +//===-- CoreMedia.h -----------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_CoreMedia_h_ +#define liblldb_CoreMedia_h_ + +#include "lldb/Core/Stream.h" +#include "lldb/Core/ValueObject.h" +#include "lldb/DataFormatters/TypeSummary.h" + +namespace lldb_private { + namespace formatters + { + + bool + CMTimeSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options); + } // namespace formatters +} // namespace lldb_private + +#endif // liblldb_CF_h_ diff --git a/lldb/include/lldb/DataFormatters/CxxStringTypes.h b/lldb/include/lldb/DataFormatters/CxxStringTypes.h new file mode 100644 index 000000000000..bfb03bda7ee0 --- /dev/null +++ b/lldb/include/lldb/DataFormatters/CxxStringTypes.h @@ -0,0 +1,41 @@ +//===-- CxxStringTypes.h ----------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_CxxStringTypes_h_ +#define liblldb_CxxStringTypes_h_ + +#include "lldb/Core/Stream.h" +#include "lldb/Core/ValueObject.h" +#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 lldb_private + +#endif // liblldb_CxxStringTypes_h_ diff --git a/lldb/include/lldb/DataFormatters/FormattersHelpers.h b/lldb/include/lldb/DataFormatters/FormattersHelpers.h index 742a06fbe662..291cd074d60d 100644 --- a/lldb/include/lldb/DataFormatters/FormattersHelpers.h +++ b/lldb/include/lldb/DataFormatters/FormattersHelpers.h @@ -69,7 +69,39 @@ namespace lldb_private { ScriptedSyntheticChildren::Flags flags, bool regex = false); #endif - + + StackFrame* + GetViableFrame (ExecutionContext exe_ctx); + + bool + ExtractValueFromObjCExpression (ValueObject &valobj, + const char* target_type, + const char* selector, + uint64_t &value); + + bool + ExtractSummaryFromObjCExpression (ValueObject &valobj, + const char* target_type, + const char* selector, + Stream &stream); + + lldb::ValueObjectSP + CallSelectorOnObject (ValueObject &valobj, + const char* return_type, + const char* selector, + uint64_t index); + + lldb::ValueObjectSP + CallSelectorOnObject (ValueObject &valobj, + const char* return_type, + const char* selector, + const char* key); + + size_t + ExtractIndexFromString (const char* item_name); + + time_t + GetOSXEpoch (); } // namespace formatters } // namespace lldb_private diff --git a/lldb/include/lldb/DataFormatters/LibCxx.h b/lldb/include/lldb/DataFormatters/LibCxx.h new file mode 100644 index 000000000000..ae00bc0ade34 --- /dev/null +++ b/lldb/include/lldb/DataFormatters/LibCxx.h @@ -0,0 +1,141 @@ +//===-- LibCxx.h ---------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_LibCxx_h_ +#define liblldb_LibCxx_h_ + +#include "lldb/Core/Stream.h" +#include "lldb/Core/ValueObject.h" +#include "lldb/DataFormatters/TypeSummary.h" +#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 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); + + } // namespace formatters +} // namespace lldb_private + +#endif // liblldb_LibCxx_h_ diff --git a/lldb/include/lldb/DataFormatters/LibStdcpp.h b/lldb/include/lldb/DataFormatters/LibStdcpp.h new file mode 100644 index 000000000000..21b2ea44fc80 --- /dev/null +++ b/lldb/include/lldb/DataFormatters/LibStdcpp.h @@ -0,0 +1,27 @@ +//===-- LibStdCpp.h ---------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_LibStdCpp_h_ +#define liblldb_LibStdCpp_h_ + +#include "lldb/Core/Stream.h" +#include "lldb/Core/ValueObject.h" +#include "lldb/DataFormatters/TypeSummary.h" +#include "lldb/DataFormatters/TypeSynthetic.h" + +namespace lldb_private { + namespace formatters + { + SyntheticChildrenFrontEnd* LibstdcppMapIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); + + SyntheticChildrenFrontEnd* LibStdcppVectorIteratorSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP); + } // namespace formatters +} // namespace lldb_private + +#endif // liblldb_LibStdCpp_h_ diff --git a/lldb/include/lldb/DataFormatters/VectorIterator.h b/lldb/include/lldb/DataFormatters/VectorIterator.h new file mode 100644 index 000000000000..f41d4af3f631 --- /dev/null +++ b/lldb/include/lldb/DataFormatters/VectorIterator.h @@ -0,0 +1,52 @@ +//===-- VectorIterator.h ----------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef liblldb_VectorIterator_h_ +#define liblldb_VectorIterator_h_ + +#include "lldb/Core/Stream.h" +#include "lldb/Core/ValueObject.h" +#include "lldb/DataFormatters/TypeSummary.h" + +namespace lldb_private { + namespace formatters + { + class VectorIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd + { + public: + VectorIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp, + ConstString item_name); + + size_t + CalculateNumChildren() override; + + lldb::ValueObjectSP + GetChildAtIndex(size_t idx) override; + + bool + Update() override; + + bool + MightHaveChildren() override; + + size_t + GetIndexOfChildWithName(const ConstString &name) override; + + ~VectorIteratorSyntheticFrontEnd() override; + + private: + ExecutionContextRef m_exe_ctx_ref; + ConstString m_item_name; + lldb::ValueObjectSP m_item_sp; + }; + + } // namespace formatters +} // namespace lldb_private + +#endif // liblldb_CF_h_ diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index 03f94edbc75e..6afbd6ad1de5 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -736,6 +736,7 @@ 942AFF0719F84C02007B43B4 /* LibCxxInitializerList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 942AFF0619F84C02007B43B4 /* LibCxxInitializerList.cpp */; }; 94380B8219940B0A00BFE4A8 /* StringLexer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94380B8119940B0A00BFE4A8 /* StringLexer.cpp */; }; 9439FB1A19EF140C006FD6A4 /* NSIndexPath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9439FB1919EF140C006FD6A4 /* NSIndexPath.cpp */; }; + 943B91011B991846007BA499 /* CXXFunctionPointer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 943B91001B991846007BA499 /* CXXFunctionPointer.cpp */; settings = {ASSET_TAGS = (); }; }; 943BDEFE1AA7B2F800789CE8 /* LLDBAssert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 943BDEFD1AA7B2F800789CE8 /* LLDBAssert.cpp */; }; 943F31A61B97D9970047A590 /* CxxStringTypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 943F31A51B97D9970047A590 /* CxxStringTypes.cpp */; settings = {ASSET_TAGS = (); }; }; 944372DC171F6B4300E57C32 /* RegisterContextDummy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 944372DA171F6B4300E57C32 /* RegisterContextDummy.cpp */; }; @@ -765,7 +766,6 @@ 94B6E76213D88365005F417F /* ValueObjectSyntheticFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B6E76113D88362005F417F /* ValueObjectSyntheticFilter.cpp */; }; 94BA8B6D176F8C9B005A91B5 /* Range.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94BA8B6C176F8C9B005A91B5 /* Range.cpp */; }; 94BA8B70176F97CE005A91B5 /* CommandHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94BA8B6F176F97CE005A91B5 /* CommandHistory.cpp */; }; - 94CB255B16B069770059775D /* CXXFormatterFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB255716B069770059775D /* CXXFormatterFunctions.cpp */; }; 94CB255C16B069770059775D /* DataVisualization.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB255816B069770059775D /* DataVisualization.cpp */; }; 94CB255D16B069770059775D /* FormatClasses.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB255916B069770059775D /* FormatClasses.cpp */; }; 94CB255E16B069770059775D /* FormatManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB255A16B069770059775D /* FormatManager.cpp */; }; @@ -2425,6 +2425,15 @@ 94380B8019940B0300BFE4A8 /* StringLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = StringLexer.h; path = include/lldb/Utility/StringLexer.h; sourceTree = ""; }; 94380B8119940B0A00BFE4A8 /* StringLexer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StringLexer.cpp; path = source/Utility/StringLexer.cpp; sourceTree = ""; }; 9439FB1919EF140C006FD6A4 /* NSIndexPath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NSIndexPath.cpp; path = source/DataFormatters/NSIndexPath.cpp; sourceTree = ""; }; + 943B90F81B990A27007BA499 /* CF.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CF.h; path = include/lldb/DataFormatters/CF.h; sourceTree = ""; }; + 943B90F91B990A27007BA499 /* Cocoa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Cocoa.h; path = include/lldb/DataFormatters/Cocoa.h; sourceTree = ""; }; + 943B90FA1B990A27007BA499 /* LibCxx.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LibCxx.h; path = include/lldb/DataFormatters/LibCxx.h; sourceTree = ""; }; + 943B90FB1B9913E4007BA499 /* LibStdcpp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LibStdcpp.h; path = include/lldb/DataFormatters/LibStdcpp.h; sourceTree = ""; }; + 943B90FC1B991586007BA499 /* VectorIterator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = VectorIterator.h; path = include/lldb/DataFormatters/VectorIterator.h; sourceTree = ""; }; + 943B90FD1B991680007BA499 /* CxxStringTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CxxStringTypes.h; path = include/lldb/DataFormatters/CxxStringTypes.h; sourceTree = ""; }; + 943B90FE1B9916F3007BA499 /* CoreMedia.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CoreMedia.h; path = include/lldb/DataFormatters/CoreMedia.h; sourceTree = ""; }; + 943B90FF1B99183B007BA499 /* CXXFunctionPointer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CXXFunctionPointer.h; path = include/lldb/DataFormatters/CXXFunctionPointer.h; sourceTree = ""; }; + 943B91001B991846007BA499 /* CXXFunctionPointer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CXXFunctionPointer.cpp; path = source/DataFormatters/CXXFunctionPointer.cpp; sourceTree = ""; }; 943BDEFC1AA7B2DE00789CE8 /* LLDBAssert.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = LLDBAssert.h; path = include/lldb/Utility/LLDBAssert.h; sourceTree = ""; }; 943BDEFD1AA7B2F800789CE8 /* LLDBAssert.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LLDBAssert.cpp; path = source/Utility/LLDBAssert.cpp; sourceTree = ""; }; 943F31A51B97D9970047A590 /* CxxStringTypes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CxxStringTypes.cpp; path = source/DataFormatters/CxxStringTypes.cpp; sourceTree = ""; }; @@ -2487,11 +2496,9 @@ 94BA8B6E176F8CA0005A91B5 /* Range.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Range.h; path = include/lldb/Utility/Range.h; sourceTree = ""; }; 94BA8B6F176F97CE005A91B5 /* CommandHistory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CommandHistory.cpp; path = source/Interpreter/CommandHistory.cpp; sourceTree = ""; }; 94BA8B71176F97D4005A91B5 /* CommandHistory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CommandHistory.h; path = include/lldb/Interpreter/CommandHistory.h; sourceTree = ""; }; - 94CB255716B069770059775D /* CXXFormatterFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CXXFormatterFunctions.cpp; path = source/DataFormatters/CXXFormatterFunctions.cpp; sourceTree = ""; }; 94CB255816B069770059775D /* DataVisualization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DataVisualization.cpp; path = source/DataFormatters/DataVisualization.cpp; sourceTree = ""; }; 94CB255916B069770059775D /* FormatClasses.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FormatClasses.cpp; path = source/DataFormatters/FormatClasses.cpp; sourceTree = ""; }; 94CB255A16B069770059775D /* FormatManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FormatManager.cpp; path = source/DataFormatters/FormatManager.cpp; sourceTree = ""; }; - 94CB255F16B069800059775D /* CXXFormatterFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CXXFormatterFunctions.h; path = include/lldb/DataFormatters/CXXFormatterFunctions.h; sourceTree = ""; }; 94CB256016B069800059775D /* DataVisualization.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataVisualization.h; path = include/lldb/DataFormatters/DataVisualization.h; sourceTree = ""; }; 94CB256116B069800059775D /* FormatClasses.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FormatClasses.h; path = include/lldb/DataFormatters/FormatClasses.h; sourceTree = ""; }; 94CB256216B069800059775D /* FormatManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FormatManager.h; path = include/lldb/DataFormatters/FormatManager.h; sourceTree = ""; }; @@ -5313,11 +5320,15 @@ 94CB255616B0683B0059775D /* DataFormatters */ = { isa = PBXGroup; children = ( + 943B90F81B990A27007BA499 /* CF.h */, 94CD704B16F8DDEA00CF1E42 /* CF.cpp */, + 943B90F91B990A27007BA499 /* Cocoa.h */, 94CD704C16F8DDEA00CF1E42 /* Cocoa.cpp */, + 943B90FE1B9916F3007BA499 /* CoreMedia.h */, 9492E2A41A8AC11000295BBD /* CoreMedia.cpp */, - 94CB255F16B069800059775D /* CXXFormatterFunctions.h */, - 94CB255716B069770059775D /* CXXFormatterFunctions.cpp */, + 943B90FF1B99183B007BA499 /* CXXFunctionPointer.h */, + 943B91001B991846007BA499 /* CXXFunctionPointer.cpp */, + 943B90FD1B991680007BA499 /* CxxStringTypes.h */, 943F31A51B97D9970047A590 /* CxxStringTypes.cpp */, 94CB256016B069800059775D /* DataVisualization.h */, 94CB255816B069770059775D /* DataVisualization.cpp */, @@ -5332,12 +5343,14 @@ 94D0858B1B9675B8000D24BD /* FormattersHelpers.cpp */, 942612F51B94FFE900EF842E /* LanguageCategory.h */, 942612F61B95000000EF842E /* LanguageCategory.cpp */, + 943B90FA1B990A27007BA499 /* LibCxx.h */, 94D0B10A16D5535900EA9C70 /* LibCxx.cpp */, 942AFF0619F84C02007B43B4 /* LibCxxInitializerList.cpp */, 94CD704F16F8DF1C00CF1E42 /* LibCxxList.cpp */, 94CD705116F8F5BC00CF1E42 /* LibCxxMap.cpp */, 94EA27CD17DE91750070F505 /* LibCxxUnorderedMap.cpp */, 942AFF0419F84ABF007B43B4 /* LibCxxVector.cpp */, + 943B90FB1B9913E4007BA499 /* LibStdcpp.h */, 94D0B10B16D5535900EA9C70 /* LibStdcpp.cpp */, 94D6A0A716CEB55F00833B6E /* NSArray.cpp */, 94D6A0A816CEB55F00833B6E /* NSDictionary.cpp */, @@ -5359,6 +5372,7 @@ 94CD131919BA33B400DB7BED /* TypeValidator.cpp */, 945215DD17F639E600521C0B /* ValueObjectPrinter.h */, 945215DE17F639EE00521C0B /* ValueObjectPrinter.cpp */, + 943B90FC1B991586007BA499 /* VectorIterator.h */, 9418EBCB1AA9108B0058B02E /* VectorType.h */, 9418EBCC1AA910910058B02E /* VectorType.cpp */, ); @@ -6606,6 +6620,7 @@ 260CC65215D0440D002BF2E0 /* OptionValueString.cpp in Sources */, 6D55B2911A8A806200A70529 /* GDBRemoteCommunicationServerLLGS.cpp in Sources */, 260CC65315D0440D002BF2E0 /* OptionValueUInt64.cpp in Sources */, + 943B91011B991846007BA499 /* CXXFunctionPointer.cpp in Sources */, 260CC65415D0440D002BF2E0 /* OptionValueUUID.cpp in Sources */, 94BA8B6D176F8C9B005A91B5 /* Range.cpp in Sources */, 26DAED6315D327C200E15819 /* OptionValuePathMappings.cpp in Sources */, @@ -6627,7 +6642,6 @@ 94094C6B163B6F840083A547 /* ValueObjectCast.cpp in Sources */, AF9107EF168570D200DBCD3C /* RegisterContextDarwin_arm64.cpp in Sources */, AF1FA88A1A60A69500272AFC /* RegisterNumber.cpp in Sources */, - 94CB255B16B069770059775D /* CXXFormatterFunctions.cpp in Sources */, 94CB255C16B069770059775D /* DataVisualization.cpp in Sources */, 94CD705016F8DF1C00CF1E42 /* LibCxxList.cpp in Sources */, 94CB255D16B069770059775D /* FormatClasses.cpp in Sources */, diff --git a/lldb/source/DataFormatters/CF.cpp b/lldb/source/DataFormatters/CF.cpp index 6ab9013268bd..719d15e94051 100644 --- a/lldb/source/DataFormatters/CF.cpp +++ b/lldb/source/DataFormatters/CF.cpp @@ -7,13 +7,14 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/CF.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Error.h" #include "lldb/Core/Stream.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/ObjCLanguageRuntime.h" diff --git a/lldb/source/DataFormatters/CMakeLists.txt b/lldb/source/DataFormatters/CMakeLists.txt index 98efaeed0625..3a1e0f042a2c 100644 --- a/lldb/source/DataFormatters/CMakeLists.txt +++ b/lldb/source/DataFormatters/CMakeLists.txt @@ -2,7 +2,7 @@ add_lldb_library(lldbDataFormatters CF.cpp Cocoa.cpp CoreMedia.cpp - CXXFormatterFunctions.cpp + CXXFunctionPointer.cpp CxxStringTypes.cpp DataVisualization.cpp FormatCache.cpp diff --git a/lldb/source/DataFormatters/CXXFormatterFunctions.cpp b/lldb/source/DataFormatters/CXXFormatterFunctions.cpp deleted file mode 100644 index 90f554beee07..000000000000 --- a/lldb/source/DataFormatters/CXXFormatterFunctions.cpp +++ /dev/null @@ -1,266 +0,0 @@ -//===-- CXXFormatterFunctions.cpp---------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/DataFormatters/CXXFormatterFunctions.h" -#include "lldb/DataFormatters/StringPrinter.h" -#include "lldb/DataFormatters/TypeSummary.h" - -#include "llvm/Support/ConvertUTF.h" - -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Error.h" -#include "lldb/Core/Stream.h" -#include "lldb/Core/ValueObject.h" -#include "lldb/Core/ValueObjectConstResult.h" -#include "lldb/Host/Endian.h" -#include "lldb/Symbol/ClangASTContext.h" -#include "lldb/Target/SectionLoadList.h" -#include "lldb/Target/Target.h" -#include "lldb/Target/Thread.h" - -#include "lldb/Utility/ProcessStructReader.h" - -#include - -#if __ANDROID_NDK__ -#include -#endif - -#include "lldb/Host/Time.h" - -using namespace lldb; -using namespace lldb_private; -using namespace lldb_private::formatters; - -StackFrame* -lldb_private::formatters::GetViableFrame (ExecutionContext exe_ctx) -{ - StackFrame* frame = exe_ctx.GetFramePtr(); - if (frame) - return frame; - - Process* process = exe_ctx.GetProcessPtr(); - if (!process) - return nullptr; - - ThreadSP thread_sp(process->GetThreadList().GetSelectedThread()); - if (thread_sp) - return thread_sp->GetSelectedFrame().get(); - return nullptr; -} - -bool -lldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj, - const char* target_type, - const char* selector, - uint64_t &value) -{ - if (!target_type || !*target_type) - return false; - if (!selector || !*selector) - return false; - StreamString expr; - expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); - ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); - lldb::ValueObjectSP result_sp; - Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = GetViableFrame(exe_ctx); - if (!target || !stack_frame) - return false; - - EvaluateExpressionOptions options; - options.SetCoerceToId(false); - options.SetUnwindOnError(true); - options.SetKeepInMemory(true); - - target->EvaluateExpression(expr.GetData(), - stack_frame, - result_sp, - options); - if (!result_sp) - return false; - value = result_sp->GetValueAsUnsigned(0); - return true; -} - -bool -lldb_private::formatters::ExtractSummaryFromObjCExpression (ValueObject &valobj, - const char* target_type, - const char* selector, - Stream &stream) -{ - if (!target_type || !*target_type) - return false; - if (!selector || !*selector) - return false; - StreamString expr; - expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); - ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); - lldb::ValueObjectSP result_sp; - Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = GetViableFrame(exe_ctx); - if (!target || !stack_frame) - return false; - - EvaluateExpressionOptions options; - options.SetCoerceToId(false); - options.SetUnwindOnError(true); - options.SetKeepInMemory(true); - options.SetUseDynamic(lldb::eDynamicCanRunTarget); - - target->EvaluateExpression(expr.GetData(), - stack_frame, - result_sp, - options); - if (!result_sp) - return false; - stream.Printf("%s",result_sp->GetSummaryAsCString()); - return true; -} - -lldb::ValueObjectSP -lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, - const char* return_type, - const char* selector, - uint64_t index) -{ - lldb::ValueObjectSP valobj_sp; - if (!return_type || !*return_type) - return valobj_sp; - if (!selector || !*selector) - return valobj_sp; - StreamString expr_path_stream; - valobj.GetExpressionPath(expr_path_stream, false); - StreamString expr; - expr.Printf("(%s)[%s %s:%" PRId64 "]",return_type,expr_path_stream.GetData(),selector,index); - ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); - lldb::ValueObjectSP result_sp; - Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = GetViableFrame(exe_ctx); - if (!target || !stack_frame) - return valobj_sp; - - EvaluateExpressionOptions options; - options.SetCoerceToId(false); - options.SetUnwindOnError(true); - options.SetKeepInMemory(true); - options.SetUseDynamic(lldb::eDynamicCanRunTarget); - - target->EvaluateExpression(expr.GetData(), - stack_frame, - valobj_sp, - options); - return valobj_sp; -} - -lldb::ValueObjectSP -lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, - const char* return_type, - const char* selector, - const char* key) -{ - lldb::ValueObjectSP valobj_sp; - if (!return_type || !*return_type) - return valobj_sp; - if (!selector || !*selector) - return valobj_sp; - if (!key || !*key) - return valobj_sp; - StreamString expr_path_stream; - valobj.GetExpressionPath(expr_path_stream, false); - StreamString expr; - expr.Printf("(%s)[%s %s:%s]",return_type,expr_path_stream.GetData(),selector,key); - ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); - lldb::ValueObjectSP result_sp; - Target* target = exe_ctx.GetTargetPtr(); - StackFrame* stack_frame = GetViableFrame(exe_ctx); - if (!target || !stack_frame) - return valobj_sp; - - EvaluateExpressionOptions options; - options.SetCoerceToId(false); - options.SetUnwindOnError(true); - options.SetKeepInMemory(true); - options.SetUseDynamic(lldb::eDynamicCanRunTarget); - - target->EvaluateExpression(expr.GetData(), - stack_frame, - valobj_sp, - options); - return valobj_sp; -} - -bool -lldb_private::formatters::FunctionPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - std::string destination; - StreamString sstr; - AddressType func_ptr_address_type = eAddressTypeInvalid; - addr_t func_ptr_address = valobj.GetPointerValue (&func_ptr_address_type); - if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) - { - switch (func_ptr_address_type) - { - case eAddressTypeInvalid: - case eAddressTypeFile: - case eAddressTypeHost: - break; - - case eAddressTypeLoad: - { - ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); - - Address so_addr; - Target *target = exe_ctx.GetTargetPtr(); - if (target && target->GetSectionLoadList().IsEmpty() == false) - { - if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) - { - so_addr.Dump (&sstr, - exe_ctx.GetBestExecutionContextScope(), - Address::DumpStyleResolvedDescription, - Address::DumpStyleSectionNameOffset); - } - } - } - break; - } - } - if (sstr.GetSize() > 0) - { - stream.Printf("(%s)", sstr.GetData()); - return true; - } - else - return false; -} - -bool -lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) -{ - stream.Printf("%s",valobj.GetObjectDescription()); - return true; -} - -size_t -lldb_private::formatters::ExtractIndexFromString (const char* item_name) -{ - if (!item_name || !*item_name) - return UINT32_MAX; - if (*item_name != '[') - return UINT32_MAX; - item_name++; - char* endptr = NULL; - unsigned long int idx = ::strtoul(item_name, &endptr, 0); - if (idx == 0 && endptr == item_name) - return UINT32_MAX; - if (idx == ULONG_MAX) - return UINT32_MAX; - return idx; -} diff --git a/lldb/source/DataFormatters/CXXFunctionPointer.cpp b/lldb/source/DataFormatters/CXXFunctionPointer.cpp new file mode 100644 index 000000000000..82a301bb8f56 --- /dev/null +++ b/lldb/source/DataFormatters/CXXFunctionPointer.cpp @@ -0,0 +1,63 @@ +//===-- CXXFormatterFunctions.cpp---------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/DataFormatters/CXXFunctionPointer.h" +#include "lldb/Target/SectionLoadList.h" +#include "lldb/Target/Target.h" + +#include + +using namespace lldb; +using namespace lldb_private; +using namespace lldb_private::formatters; + +bool +lldb_private::formatters::CXXFunctionPointerSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) +{ + std::string destination; + StreamString sstr; + AddressType func_ptr_address_type = eAddressTypeInvalid; + addr_t func_ptr_address = valobj.GetPointerValue (&func_ptr_address_type); + if (func_ptr_address != 0 && func_ptr_address != LLDB_INVALID_ADDRESS) + { + switch (func_ptr_address_type) + { + case eAddressTypeInvalid: + case eAddressTypeFile: + case eAddressTypeHost: + break; + + case eAddressTypeLoad: + { + ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); + + Address so_addr; + Target *target = exe_ctx.GetTargetPtr(); + if (target && target->GetSectionLoadList().IsEmpty() == false) + { + if (target->GetSectionLoadList().ResolveLoadAddress(func_ptr_address, so_addr)) + { + so_addr.Dump (&sstr, + exe_ctx.GetBestExecutionContextScope(), + Address::DumpStyleResolvedDescription, + Address::DumpStyleSectionNameOffset); + } + } + } + break; + } + } + if (sstr.GetSize() > 0) + { + stream.Printf("(%s)", sstr.GetData()); + return true; + } + else + return false; +} diff --git a/lldb/source/DataFormatters/Cocoa.cpp b/lldb/source/DataFormatters/Cocoa.cpp index 6c55f5b8a61e..d89c3e354699 100644 --- a/lldb/source/DataFormatters/Cocoa.cpp +++ b/lldb/source/DataFormatters/Cocoa.cpp @@ -7,20 +7,21 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" -#include "lldb/DataFormatters/StringPrinter.h" -#include "lldb/DataFormatters/TypeSummary.h" +#include "lldb/DataFormatters/Cocoa.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Error.h" #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" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/Target.h" - +#include "lldb/Target/Process.h" #include "lldb/Utility/ProcessStructReader.h" using namespace lldb; @@ -1129,6 +1130,13 @@ lldb_private::formatters::GetOSXEpoch () return epoch; } +bool +lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream, const TypeSummaryOptions& options) +{ + stream.Printf("%s",valobj.GetObjectDescription()); + return true; +} + template bool lldb_private::formatters::NSDataSummaryProvider (ValueObject&, Stream&, const TypeSummaryOptions&) ; diff --git a/lldb/source/DataFormatters/CoreMedia.cpp b/lldb/source/DataFormatters/CoreMedia.cpp index 9fb7779db2dd..c2fe8e821281 100644 --- a/lldb/source/DataFormatters/CoreMedia.cpp +++ b/lldb/source/DataFormatters/CoreMedia.cpp @@ -7,7 +7,7 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/CoreMedia.h" #include "lldb/Core/Flags.h" #include "lldb/Symbol/ClangASTContext.h" diff --git a/lldb/source/DataFormatters/CxxStringTypes.cpp b/lldb/source/DataFormatters/CxxStringTypes.cpp index f7764ea43940..d709d5efa134 100644 --- a/lldb/source/DataFormatters/CxxStringTypes.cpp +++ b/lldb/source/DataFormatters/CxxStringTypes.cpp @@ -7,9 +7,7 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" -#include "lldb/DataFormatters/StringPrinter.h" -#include "lldb/DataFormatters/TypeSummary.h" +#include "lldb/DataFormatters/CxxStringTypes.h" #include "llvm/Support/ConvertUTF.h" @@ -18,12 +16,13 @@ #include "lldb/Core/Stream.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/DataFormatters/StringPrinter.h" +#include "lldb/DataFormatters/TypeSummary.h" #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/SectionLoadList.h" #include "lldb/Target/Target.h" #include "lldb/Target/Thread.h" - #include "lldb/Utility/ProcessStructReader.h" #include diff --git a/lldb/source/DataFormatters/FormatManager.cpp b/lldb/source/DataFormatters/FormatManager.cpp index 08b7f6d87c36..e0b8fb3f40ca 100644 --- a/lldb/source/DataFormatters/FormatManager.cpp +++ b/lldb/source/DataFormatters/FormatManager.cpp @@ -15,7 +15,14 @@ // Project includes #include "lldb/Core/Debugger.h" -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/CF.h" +#include "lldb/DataFormatters/Cocoa.h" +#include "lldb/DataFormatters/CoreMedia.h" +#include "lldb/DataFormatters/CXXFunctionPointer.h" +#include "lldb/DataFormatters/CxxStringTypes.h" +#include "lldb/DataFormatters/LibCxx.h" +#include "lldb/DataFormatters/LibStdcpp.h" +#include "lldb/DataFormatters/VectorType.h" #include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/DataFormatters/LanguageCategory.h" #include "lldb/Target/ExecutionContext.h" @@ -1635,7 +1642,7 @@ FormatManager::LoadHardcodedFormatters() [](lldb_private::ValueObject& valobj, lldb::DynamicValueType, FormatManager&) -> TypeSummaryImpl::SharedPointer { - static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags(), lldb_private::formatters::FunctionPointerSummaryProvider, "Function pointer summary provider")); + static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags(), lldb_private::formatters::CXXFunctionPointerSummaryProvider, "Function pointer summary provider")); if (valobj.GetCompilerType().IsFunctionPointerType()) { return formatter_sp; diff --git a/lldb/source/DataFormatters/FormattersHelpers.cpp b/lldb/source/DataFormatters/FormattersHelpers.cpp index cbded9da9634..ba5f6c04f78d 100644 --- a/lldb/source/DataFormatters/FormattersHelpers.cpp +++ b/lldb/source/DataFormatters/FormattersHelpers.cpp @@ -18,6 +18,8 @@ #include "lldb/Core/ConstString.h" #include "lldb/Core/RegularExpression.h" +#include "lldb/Target/StackFrame.h" +#include "lldb/Target/Thread.h" using namespace lldb; using namespace lldb_private; @@ -118,3 +120,178 @@ lldb_private::formatters::AddFilter (TypeCategoryImpl::SharedPointer category_s category_sp->GetTypeFiltersContainer()->Add(type_name,filter_sp); } #endif + +StackFrame* +lldb_private::formatters::GetViableFrame (ExecutionContext exe_ctx) +{ + StackFrame* frame = exe_ctx.GetFramePtr(); + if (frame) + return frame; + + Process* process = exe_ctx.GetProcessPtr(); + if (!process) + return nullptr; + + ThreadSP thread_sp(process->GetThreadList().GetSelectedThread()); + if (thread_sp) + return thread_sp->GetSelectedFrame().get(); + return nullptr; +} + +bool +lldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj, + const char* target_type, + const char* selector, + uint64_t &value) +{ + if (!target_type || !*target_type) + return false; + if (!selector || !*selector) + return false; + StreamString expr; + expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); + ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); + lldb::ValueObjectSP result_sp; + Target* target = exe_ctx.GetTargetPtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); + if (!target || !stack_frame) + return false; + + EvaluateExpressionOptions options; + options.SetCoerceToId(false); + options.SetUnwindOnError(true); + options.SetKeepInMemory(true); + + target->EvaluateExpression(expr.GetData(), + stack_frame, + result_sp, + options); + if (!result_sp) + return false; + value = result_sp->GetValueAsUnsigned(0); + return true; +} + +bool +lldb_private::formatters::ExtractSummaryFromObjCExpression (ValueObject &valobj, + const char* target_type, + const char* selector, + Stream &stream) +{ + if (!target_type || !*target_type) + return false; + if (!selector || !*selector) + return false; + StreamString expr; + expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector); + ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); + lldb::ValueObjectSP result_sp; + Target* target = exe_ctx.GetTargetPtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); + if (!target || !stack_frame) + return false; + + EvaluateExpressionOptions options; + options.SetCoerceToId(false); + options.SetUnwindOnError(true); + options.SetKeepInMemory(true); + options.SetUseDynamic(lldb::eDynamicCanRunTarget); + + target->EvaluateExpression(expr.GetData(), + stack_frame, + result_sp, + options); + if (!result_sp) + return false; + stream.Printf("%s",result_sp->GetSummaryAsCString()); + return true; +} + +lldb::ValueObjectSP +lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, + const char* return_type, + const char* selector, + uint64_t index) +{ + lldb::ValueObjectSP valobj_sp; + if (!return_type || !*return_type) + return valobj_sp; + if (!selector || !*selector) + return valobj_sp; + StreamString expr_path_stream; + valobj.GetExpressionPath(expr_path_stream, false); + StreamString expr; + expr.Printf("(%s)[%s %s:%" PRId64 "]",return_type,expr_path_stream.GetData(),selector,index); + ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); + lldb::ValueObjectSP result_sp; + Target* target = exe_ctx.GetTargetPtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); + if (!target || !stack_frame) + return valobj_sp; + + EvaluateExpressionOptions options; + options.SetCoerceToId(false); + options.SetUnwindOnError(true); + options.SetKeepInMemory(true); + options.SetUseDynamic(lldb::eDynamicCanRunTarget); + + target->EvaluateExpression(expr.GetData(), + stack_frame, + valobj_sp, + options); + return valobj_sp; +} + +lldb::ValueObjectSP +lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj, + const char* return_type, + const char* selector, + const char* key) +{ + lldb::ValueObjectSP valobj_sp; + if (!return_type || !*return_type) + return valobj_sp; + if (!selector || !*selector) + return valobj_sp; + if (!key || !*key) + return valobj_sp; + StreamString expr_path_stream; + valobj.GetExpressionPath(expr_path_stream, false); + StreamString expr; + expr.Printf("(%s)[%s %s:%s]",return_type,expr_path_stream.GetData(),selector,key); + ExecutionContext exe_ctx (valobj.GetExecutionContextRef()); + lldb::ValueObjectSP result_sp; + Target* target = exe_ctx.GetTargetPtr(); + StackFrame* stack_frame = GetViableFrame(exe_ctx); + if (!target || !stack_frame) + return valobj_sp; + + EvaluateExpressionOptions options; + options.SetCoerceToId(false); + options.SetUnwindOnError(true); + options.SetKeepInMemory(true); + options.SetUseDynamic(lldb::eDynamicCanRunTarget); + + target->EvaluateExpression(expr.GetData(), + stack_frame, + valobj_sp, + options); + return valobj_sp; +} + +size_t +lldb_private::formatters::ExtractIndexFromString (const char* item_name) +{ + if (!item_name || !*item_name) + return UINT32_MAX; + if (*item_name != '[') + return UINT32_MAX; + item_name++; + char* endptr = NULL; + unsigned long int idx = ::strtoul(item_name, &endptr, 0); + if (idx == 0 && endptr == item_name) + return UINT32_MAX; + if (idx == ULONG_MAX) + return UINT32_MAX; + return idx; +} diff --git a/lldb/source/DataFormatters/LibCxx.cpp b/lldb/source/DataFormatters/LibCxx.cpp index 329f8286a970..298d124280f6 100644 --- a/lldb/source/DataFormatters/LibCxx.cpp +++ b/lldb/source/DataFormatters/LibCxx.cpp @@ -7,9 +7,7 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" -#include "lldb/DataFormatters/StringPrinter.h" -#include "lldb/DataFormatters/TypeSummary.h" +#include "lldb/DataFormatters/LibCxx.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Debugger.h" @@ -18,6 +16,10 @@ #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/DataFormatters/VectorIterator.h" #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/DataFormatters/LibCxxInitializerList.cpp b/lldb/source/DataFormatters/LibCxxInitializerList.cpp index 652771e24662..87f8a3d0bddd 100644 --- a/lldb/source/DataFormatters/LibCxxInitializerList.cpp +++ b/lldb/source/DataFormatters/LibCxxInitializerList.cpp @@ -7,10 +7,11 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/LibCxx.h" #include "lldb/Core/ConstString.h" #include "lldb/Core/ValueObject.h" +#include "lldb/DataFormatters/FormattersHelpers.h" using namespace lldb; using namespace lldb_private; diff --git a/lldb/source/DataFormatters/LibCxxList.cpp b/lldb/source/DataFormatters/LibCxxList.cpp index 9cf05e130603..9a8b70d1ebc0 100644 --- a/lldb/source/DataFormatters/LibCxxList.cpp +++ b/lldb/source/DataFormatters/LibCxxList.cpp @@ -7,13 +7,14 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/LibCxx.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Error.h" #include "lldb/Core/Stream.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/DataFormatters/LibCxxMap.cpp b/lldb/source/DataFormatters/LibCxxMap.cpp index 51a4a4f81045..a59a6f59e6f4 100644 --- a/lldb/source/DataFormatters/LibCxxMap.cpp +++ b/lldb/source/DataFormatters/LibCxxMap.cpp @@ -7,13 +7,14 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/LibCxx.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Error.h" #include "lldb/Core/Stream.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/DataFormatters/LibCxxUnorderedMap.cpp b/lldb/source/DataFormatters/LibCxxUnorderedMap.cpp index 4c35fedc0cc6..1d8a9af153b2 100644 --- a/lldb/source/DataFormatters/LibCxxUnorderedMap.cpp +++ b/lldb/source/DataFormatters/LibCxxUnorderedMap.cpp @@ -7,13 +7,14 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/LibCxx.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Error.h" #include "lldb/Core/Stream.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/Target.h" diff --git a/lldb/source/DataFormatters/LibCxxVector.cpp b/lldb/source/DataFormatters/LibCxxVector.cpp index 735cbf5d1e99..1e14fff60089 100644 --- a/lldb/source/DataFormatters/LibCxxVector.cpp +++ b/lldb/source/DataFormatters/LibCxxVector.cpp @@ -7,10 +7,11 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/LibCxx.h" #include "lldb/Core/ConstString.h" #include "lldb/Core/ValueObject.h" +#include "lldb/DataFormatters/FormattersHelpers.h" using namespace lldb; using namespace lldb_private; diff --git a/lldb/source/DataFormatters/LibStdcpp.cpp b/lldb/source/DataFormatters/LibStdcpp.cpp index 33447af5328e..73f9594e7fb8 100644 --- a/lldb/source/DataFormatters/LibStdcpp.cpp +++ b/lldb/source/DataFormatters/LibStdcpp.cpp @@ -7,13 +7,14 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/LibStdcpp.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Error.h" #include "lldb/Core/Stream.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/DataFormatters/VectorIterator.h" #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/Target.h" @@ -22,6 +23,36 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; +class LibstdcppMapIteratorSyntheticFrontEnd : public SyntheticChildrenFrontEnd +{ +public: + 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; + + ~LibstdcppMapIteratorSyntheticFrontEnd() override; + +private: + ExecutionContextRef m_exe_ctx_ref; + lldb::addr_t m_pair_address; + CompilerType m_pair_type; + EvaluateExpressionOptions m_options; + lldb::ValueObjectSP m_pair_sp; +}; + /* (std::_Rb_tree_iterator, std::allocator > > >) ibeg = { (_Base_ptr) _M_node = 0x0000000100103910 { @@ -33,7 +64,7 @@ using namespace lldb_private::formatters; } */ -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::LibstdcppMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : +LibstdcppMapIteratorSyntheticFrontEnd::LibstdcppMapIteratorSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : SyntheticChildrenFrontEnd(*valobj_sp.get()), m_exe_ctx_ref(), m_pair_address(0), @@ -50,7 +81,7 @@ lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::LibstdcppMapIte } bool -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::Update() +LibstdcppMapIteratorSyntheticFrontEnd::Update() { ValueObjectSP valobj_sp = m_backend.GetSP(); if (!valobj_sp) @@ -93,13 +124,13 @@ lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::Update() } size_t -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::CalculateNumChildren () +LibstdcppMapIteratorSyntheticFrontEnd::CalculateNumChildren () { return 2; } lldb::ValueObjectSP -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::GetChildAtIndex (size_t idx) +LibstdcppMapIteratorSyntheticFrontEnd::GetChildAtIndex (size_t idx) { if (m_pair_address != 0 && m_pair_type) { @@ -112,13 +143,13 @@ lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::GetChildAtIndex } bool -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::MightHaveChildren () +LibstdcppMapIteratorSyntheticFrontEnd::MightHaveChildren () { return true; } size_t -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) +LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name) { if (name == ConstString("first")) return 0; @@ -127,7 +158,7 @@ lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::GetIndexOfChild return UINT32_MAX; } -lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEnd::~LibstdcppMapIteratorSyntheticFrontEnd () +LibstdcppMapIteratorSyntheticFrontEnd::~LibstdcppMapIteratorSyntheticFrontEnd () {} SyntheticChildrenFrontEnd* diff --git a/lldb/source/DataFormatters/NSArray.cpp b/lldb/source/DataFormatters/NSArray.cpp index aed1e2ca60f4..0bf340b13380 100644 --- a/lldb/source/DataFormatters/NSArray.cpp +++ b/lldb/source/DataFormatters/NSArray.cpp @@ -7,13 +7,14 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/Cocoa.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Error.h" #include "lldb/Core/Stream.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/ObjCLanguageRuntime.h" diff --git a/lldb/source/DataFormatters/NSDictionary.cpp b/lldb/source/DataFormatters/NSDictionary.cpp index 15f05ab49c3e..0de0cbdc96a4 100644 --- a/lldb/source/DataFormatters/NSDictionary.cpp +++ b/lldb/source/DataFormatters/NSDictionary.cpp @@ -7,13 +7,14 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/Cocoa.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Error.h" #include "lldb/Core/Stream.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/ObjCLanguageRuntime.h" diff --git a/lldb/source/DataFormatters/NSIndexPath.cpp b/lldb/source/DataFormatters/NSIndexPath.cpp index 0908487310e1..a09cbcc34762 100644 --- a/lldb/source/DataFormatters/NSIndexPath.cpp +++ b/lldb/source/DataFormatters/NSIndexPath.cpp @@ -7,10 +7,11 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/Cocoa.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/DataFormatters/TypeSynthetic.h" #include "lldb/Target/ObjCLanguageRuntime.h" #include "lldb/Target/Process.h" diff --git a/lldb/source/DataFormatters/NSSet.cpp b/lldb/source/DataFormatters/NSSet.cpp index 77e33490ced7..ea33a6a3c031 100644 --- a/lldb/source/DataFormatters/NSSet.cpp +++ b/lldb/source/DataFormatters/NSSet.cpp @@ -7,13 +7,14 @@ // //===----------------------------------------------------------------------===// -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/Cocoa.h" #include "lldb/Core/DataBufferHeap.h" #include "lldb/Core/Error.h" #include "lldb/Core/Stream.h" #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectConstResult.h" +#include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/Host/Endian.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/ObjCLanguageRuntime.h" diff --git a/lldb/source/DataFormatters/VectorType.cpp b/lldb/source/DataFormatters/VectorType.cpp index 02e2b95232d3..183893ac264a 100644 --- a/lldb/source/DataFormatters/VectorType.cpp +++ b/lldb/source/DataFormatters/VectorType.cpp @@ -10,7 +10,7 @@ #include "lldb/DataFormatters/VectorType.h" #include "lldb/Core/ValueObject.h" -#include "lldb/DataFormatters/CXXFormatterFunctions.h" +#include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/Symbol/ClangASTContext.h" #include "lldb/Symbol/CompilerType.h"