diff options
Diffstat (limited to 'source/DataFormatters/NSIndexPath.cpp')
-rw-r--r-- | source/DataFormatters/NSIndexPath.cpp | 338 |
1 files changed, 0 insertions, 338 deletions
diff --git a/source/DataFormatters/NSIndexPath.cpp b/source/DataFormatters/NSIndexPath.cpp deleted file mode 100644 index 363bd5c0527e1..0000000000000 --- a/source/DataFormatters/NSIndexPath.cpp +++ /dev/null @@ -1,338 +0,0 @@ -//===-- 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.Clear(); - - 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_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; - } - - 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); - } - } - - 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 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())); - } - - void - Clear () - { - 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) - { - 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}; - } - - }; - struct OutsourcedIndexes { - ValueObject *m_indexes; - size_t m_count; - - 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; - } - }; - - union { - struct InlinedIndexes m_inlined; - struct OutsourcedIndexes m_outsourced; - }; - - void - Clear () - { - m_mode = Mode::Invalid; - m_inlined.Clear(); - m_outsourced.Clear(); - } - } 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; - } - } -} |