[Lldb-commits] [lldb] r219852 - Add synthetic children support for NSIndexPath
Eric Christopher
echristo at gmail.com
Tue Oct 21 13:51:20 PDT 2014
llvm turns on the -Wnested-anon-types warning so I pulled them into
their context.
-eric
On Wed, Oct 15, 2014 at 2:38 PM, Enrico Granata <egranata at apple.com> wrote:
> Author: enrico
> Date: Wed Oct 15 16:38:32 2014
> New Revision: 219852
>
> URL: http://llvm.org/viewvc/llvm-project?rev=219852&view=rev
> Log:
> Add synthetic children support for NSIndexPath
>
> Added:
> lldb/trunk/source/DataFormatters/NSIndexPath.cpp
> Modified:
> lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h
> lldb/trunk/lldb.xcodeproj/project.pbxproj
> lldb/trunk/source/Core/ValueObjectConstResult.cpp
> lldb/trunk/source/DataFormatters/FormatManager.cpp
>
> Modified: lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h?rev=219852&r1=219851&r2=219852&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h (original)
> +++ lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h Wed Oct 15 16:38:32 2014
> @@ -474,6 +474,8 @@ namespace lldb_private {
>
> SyntheticChildrenFrontEnd* NSSetSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
>
> + SyntheticChildrenFrontEnd* NSIndexPathSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
> +
> class LibcxxVectorBoolSyntheticFrontEnd : public SyntheticChildrenFrontEnd
> {
> public:
>
> Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=219852&r1=219851&r2=219852&view=diff
> ==============================================================================
> --- lldb/trunk/lldb.xcodeproj/project.pbxproj (original)
> +++ lldb/trunk/lldb.xcodeproj/project.pbxproj Wed Oct 15 16:38:32 2014
> @@ -648,6 +648,7 @@
> 941BCC8114E48C4000BB969C /* SBTypeSummary.h in Headers */ = {isa = PBXBuildFile; fileRef = 9461568814E355F2003A195C /* SBTypeSummary.h */; settings = {ATTRIBUTES = (Public, ); }; };
> 941BCC8214E48C4000BB969C /* SBTypeSynthetic.h in Headers */ = {isa = PBXBuildFile; fileRef = 9461568914E355F2003A195C /* SBTypeSynthetic.h */; settings = {ATTRIBUTES = (Public, ); }; };
> 94380B8219940B0A00BFE4A8 /* StringLexer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94380B8119940B0A00BFE4A8 /* StringLexer.cpp */; };
> + 9439FB1A19EF140C006FD6A4 /* NSIndexPath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9439FB1919EF140C006FD6A4 /* NSIndexPath.cpp */; };
> 944372DC171F6B4300E57C32 /* RegisterContextDummy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 944372DA171F6B4300E57C32 /* RegisterContextDummy.cpp */; };
> 944372DD171F6B4300E57C32 /* RegisterContextDummy.h in Headers */ = {isa = PBXBuildFile; fileRef = 944372DB171F6B4300E57C32 /* RegisterContextDummy.h */; };
> 9443B122140C18C40013457C /* SBData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9443B121140C18C10013457C /* SBData.cpp */; };
> @@ -1985,6 +1986,7 @@
> 94145430175D7FDE00284436 /* lldb-versioning.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "lldb-versioning.h"; path = "include/lldb/lldb-versioning.h"; sourceTree = "<group>"; };
> 94380B8019940B0300BFE4A8 /* StringLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = StringLexer.h; path = include/lldb/Utility/StringLexer.h; sourceTree = "<group>"; };
> 94380B8119940B0A00BFE4A8 /* StringLexer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StringLexer.cpp; path = source/Utility/StringLexer.cpp; sourceTree = "<group>"; };
> + 9439FB1919EF140C006FD6A4 /* NSIndexPath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = NSIndexPath.cpp; path = source/DataFormatters/NSIndexPath.cpp; sourceTree = "<group>"; };
> 944372DA171F6B4300E57C32 /* RegisterContextDummy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterContextDummy.cpp; path = Utility/RegisterContextDummy.cpp; sourceTree = "<group>"; };
> 944372DB171F6B4300E57C32 /* RegisterContextDummy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterContextDummy.h; path = Utility/RegisterContextDummy.h; sourceTree = "<group>"; };
> 9443B120140C18A90013457C /* SBData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SBData.h; path = include/lldb/API/SBData.h; sourceTree = "<group>"; };
> @@ -4327,6 +4329,7 @@
> 94D0B10B16D5535900EA9C70 /* LibStdcpp.cpp */,
> 94D6A0A716CEB55F00833B6E /* NSArray.cpp */,
> 94D6A0A816CEB55F00833B6E /* NSDictionary.cpp */,
> + 9439FB1919EF140C006FD6A4 /* NSIndexPath.cpp */,
> 94D6A0A916CEB55F00833B6E /* NSSet.cpp */,
> 94CB256816B096F90059775D /* TypeCategory.h */,
> 94CB256416B096F10059775D /* TypeCategory.cpp */,
> @@ -5079,6 +5082,7 @@
> 94D0B10D16D5535900EA9C70 /* LibStdcpp.cpp in Sources */,
> AF0E22F018A09FB20009B7D1 /* AppleGetItemInfoHandler.cpp in Sources */,
> 2689004E13353E0400698AC0 /* Stream.cpp in Sources */,
> + 9439FB1A19EF140C006FD6A4 /* NSIndexPath.cpp in Sources */,
> 2689004F13353E0400698AC0 /* StreamFile.cpp in Sources */,
> 2689005013353E0400698AC0 /* StreamString.cpp in Sources */,
> 2689005113353E0400698AC0 /* StringList.cpp in Sources */,
>
> Modified: lldb/trunk/source/Core/ValueObjectConstResult.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObjectConstResult.cpp?rev=219852&r1=219851&r2=219852&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/ValueObjectConstResult.cpp (original)
> +++ lldb/trunk/source/Core/ValueObjectConstResult.cpp Wed Oct 15 16:38:32 2014
> @@ -230,6 +230,7 @@ ValueObjectConstResult::ValueObjectConst
> {
> m_value = value;
> m_value.GetData(m_data);
> + m_name = name;
> }
>
> ValueObjectConstResult::~ValueObjectConstResult()
>
> Modified: lldb/trunk/source/DataFormatters/FormatManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/FormatManager.cpp?rev=219852&r1=219851&r2=219852&view=diff
> ==============================================================================
> --- lldb/trunk/source/DataFormatters/FormatManager.cpp (original)
> +++ lldb/trunk/source/DataFormatters/FormatManager.cpp Wed Oct 15 16:38:32 2014
> @@ -1394,6 +1394,8 @@ FormatManager::LoadObjCFormatters()
> AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSOrderedSet synthetic children", ConstString("NSOrderedSet"), ScriptedSyntheticChildren::Flags());
> AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetI synthetic children", ConstString("__NSOrderedSetI"), ScriptedSyntheticChildren::Flags());
> AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetM synthetic children", ConstString("__NSOrderedSetM"), ScriptedSyntheticChildren::Flags());
> +
> + AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator, "NSIndexPath synthetic children", ConstString("NSIndexPath"), ScriptedSyntheticChildren::Flags());
>
> AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFBagRef"), appkit_flags);
> AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("__CFBag"), appkit_flags);
>
> Added: lldb/trunk/source/DataFormatters/NSIndexPath.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/NSIndexPath.cpp?rev=219852&view=auto
> ==============================================================================
> --- lldb/trunk/source/DataFormatters/NSIndexPath.cpp (added)
> +++ lldb/trunk/source/DataFormatters/NSIndexPath.cpp Wed Oct 15 16:38:32 2014
> @@ -0,0 +1,306 @@
> +//===-- NSIndexPath.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/Core/ValueObject.h"
> +#include "lldb/Core/ValueObjectConstResult.h"
> +#include "lldb/DataFormatters/TypeSynthetic.h"
> +#include "lldb/Target/ObjCLanguageRuntime.h"
> +#include "lldb/Target/Process.h"
> +#include "lldb/Symbol/ClangASTContext.h"
> +
> +using namespace lldb;
> +using namespace lldb_private;
> +using namespace lldb_private::formatters;
> +
> +class NSIndexPathSyntheticFrontEnd : public SyntheticChildrenFrontEnd
> +{
> +public:
> + NSIndexPathSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
> + SyntheticChildrenFrontEnd (*valobj_sp.get()),
> + m_ptr_size(0),
> + m_ast_ctx(nullptr),
> + m_uint_star_type()
> + {
> + m_ptr_size = m_backend.GetTargetSP()->GetArchitecture().GetAddressByteSize();
> + }
> +
> + virtual size_t
> + CalculateNumChildren ()
> + {
> + return m_impl.GetNumIndexes();
> + }
> +
> + virtual lldb::ValueObjectSP
> + GetChildAtIndex (size_t idx)
> + {
> + return m_impl.GetIndexAtIndex(idx, m_uint_star_type);
> + }
> +
> + virtual bool
> + Update()
> + {
> + m_impl.m_mode = Mode::Invalid;
> +
> + m_ast_ctx = ClangASTContext::GetASTContext(m_backend.GetClangType().GetASTContext());
> + if (!m_ast_ctx)
> + return false;
> +
> + m_uint_star_type = m_ast_ctx->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_mode = Mode::Inlined;
> + m_impl.m_inlined.SetIndexes(payload, *process_sp);
> + }
> + else
> + {
> + ObjCLanguageRuntime::ClassDescriptor::iVarDescriptor _indexes_id;
> + ObjCLanguageRuntime::ClassDescriptor::iVarDescriptor _length_id;
> +
> + bool has_indexes(false),has_length(false);
> +
> + for (auto 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;
> + }
> + }
> + }
> + return false;
> + }
> +
> + virtual bool
> + MightHaveChildren ()
> + {
> + if (m_impl.m_mode == Mode::Invalid)
> + return false;
> + return true;
> + }
> +
> + virtual size_t
> + 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;
> + }
> +
> + virtual lldb::ValueObjectSP
> + GetSyntheticValue () { return nullptr; }
> +
> + virtual
> + ~NSIndexPathSyntheticFrontEnd () {}
> +
> +protected:
> + ObjCLanguageRuntime::ClassDescriptorSP m_descriptor_sp;
> +
> + enum class Mode {
> + Inlined,
> + Outsourced,
> + Invalid
> + };
> +
> + struct Impl {
> + Mode m_mode;
> +
> + 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 ClangASTType& 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);
> + }
> + }
> +
> + union {
> + struct {
> + 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 ClangASTType& desired_type)
> + {
> + 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.SetClangType(desired_type);
> + StreamString idx_name;
> + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx);
> + return ValueObjectConstResult::Create(m_process, v, ConstString(idx_name.GetData()));
> + }
> +
> + 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) {
> + if (m_ptr_size == 8)
> + {
> + switch (pos) {
> + case 5: return {((m_indexes >> 51) & 0x1ff),true};
> + case 4: return {((m_indexes >> 42) & 0x1ff),true};
> + case 3: return {((m_indexes >> 33) & 0x1ff),true};
> + case 2: return {((m_indexes >> 24) & 0x1ff),true};
> + case 1: return {((m_indexes >> 15) & 0x1ff),true};
> + case 0: return {((m_indexes >> 6) & 0x1ff),true};
> + }
> + }
> + else
> + {
> + switch (pos) {
> + case 2: return {((m_indexes >> 23) & 0x1ff),true};
> + case 1: return {((m_indexes >> 14) & 0x1ff),true};
> + case 0: return {((m_indexes >> 5) & 0x1ff),true};
> + }
> + }
> + return {0,false};
> + }
> +
> + } m_inlined;
> + struct {
> + ValueObject *m_indexes;
> + size_t m_count;
> +
> + lldb::ValueObjectSP
> + GetIndexAtIndex (size_t idx)
> + {
> + if (m_indexes)
> + {
> + ValueObjectSP index_sp(m_indexes->GetSyntheticArrayMemberFromPointer(idx, true));
> + return index_sp;
> + }
> + return nullptr;
> + }
> + } m_outsourced;
> + };
> + } m_impl;
> +
> + uint32_t m_ptr_size;
> + ClangASTContext* m_ast_ctx;
> + ClangASTType 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;
> + }
> + }
> +}
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits
More information about the lldb-commits
mailing list