diff options
Diffstat (limited to 'source/DataFormatters/VectorType.cpp')
-rw-r--r-- | source/DataFormatters/VectorType.cpp | 551 |
1 files changed, 261 insertions, 290 deletions
diff --git a/source/DataFormatters/VectorType.cpp b/source/DataFormatters/VectorType.cpp index 347afa5c0559..652bde792ab4 100644 --- a/source/DataFormatters/VectorType.cpp +++ b/source/DataFormatters/VectorType.cpp @@ -25,306 +25,277 @@ using namespace lldb; using namespace lldb_private; using namespace lldb_private::formatters; -static CompilerType -GetCompilerTypeForFormat (lldb::Format format, - CompilerType element_type, - TypeSystem *type_system) -{ - lldbassert(type_system && "type_system needs to be not NULL"); - - switch (format) - { - case lldb::eFormatAddressInfo: - case lldb::eFormatPointer: - return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 8*type_system->GetPointerByteSize()); - - case lldb::eFormatBoolean: - return type_system->GetBasicTypeFromAST(lldb::eBasicTypeBool); - - case lldb::eFormatBytes: - case lldb::eFormatBytesWithASCII: - case lldb::eFormatChar: - case lldb::eFormatCharArray: - case lldb::eFormatCharPrintable: - return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar); - - case lldb::eFormatComplex /* lldb::eFormatComplexFloat */: - return type_system->GetBasicTypeFromAST(lldb::eBasicTypeFloatComplex); - - case lldb::eFormatCString: - return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar).GetPointerType(); - - case lldb::eFormatFloat: - return type_system->GetBasicTypeFromAST(lldb::eBasicTypeFloat); - - case lldb::eFormatHex: - case lldb::eFormatHexUppercase: - case lldb::eFormatOctal: - return type_system->GetBasicTypeFromAST(lldb::eBasicTypeInt); - - case lldb::eFormatHexFloat: - return type_system->GetBasicTypeFromAST(lldb::eBasicTypeFloat); - - case lldb::eFormatUnicode16: - case lldb::eFormatUnicode32: - - case lldb::eFormatUnsigned: - return type_system->GetBasicTypeFromAST(lldb::eBasicTypeUnsignedInt); - - case lldb::eFormatVectorOfChar: - return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar); - - case lldb::eFormatVectorOfFloat32: - return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingIEEE754, 32); - - case lldb::eFormatVectorOfFloat64: - return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingIEEE754, 64); - - case lldb::eFormatVectorOfSInt16: - return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 16); - - case lldb::eFormatVectorOfSInt32: - return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 32); - - case lldb::eFormatVectorOfSInt64: - return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 64); - - case lldb::eFormatVectorOfSInt8: - return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingSint, 8); - - case lldb::eFormatVectorOfUInt128: - return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 128); - - case lldb::eFormatVectorOfUInt16: - return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 16); - - case lldb::eFormatVectorOfUInt32: - return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 32); - - case lldb::eFormatVectorOfUInt64: - return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 64); - - case lldb::eFormatVectorOfUInt8: - return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 8); - - case lldb::eFormatDefault: - return element_type; - - case lldb::eFormatBinary: - case lldb::eFormatComplexInteger: - case lldb::eFormatDecimal: - case lldb::eFormatEnum: - case lldb::eFormatInstruction: - case lldb::eFormatOSType: - case lldb::eFormatVoid: - default: - return type_system->GetBuiltinTypeForEncodingAndBitSize (eEncodingUint, 8); - } +static CompilerType GetCompilerTypeForFormat(lldb::Format format, + CompilerType element_type, + TypeSystem *type_system) { + lldbassert(type_system && "type_system needs to be not NULL"); + + switch (format) { + case lldb::eFormatAddressInfo: + case lldb::eFormatPointer: + return type_system->GetBuiltinTypeForEncodingAndBitSize( + eEncodingUint, 8 * type_system->GetPointerByteSize()); + + case lldb::eFormatBoolean: + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeBool); + + case lldb::eFormatBytes: + case lldb::eFormatBytesWithASCII: + case lldb::eFormatChar: + case lldb::eFormatCharArray: + case lldb::eFormatCharPrintable: + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar); + + case lldb::eFormatComplex /* lldb::eFormatComplexFloat */: + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeFloatComplex); + + case lldb::eFormatCString: + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar) + .GetPointerType(); + + case lldb::eFormatFloat: + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeFloat); + + case lldb::eFormatHex: + case lldb::eFormatHexUppercase: + case lldb::eFormatOctal: + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeInt); + + case lldb::eFormatHexFloat: + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeFloat); + + case lldb::eFormatUnicode16: + case lldb::eFormatUnicode32: + + case lldb::eFormatUnsigned: + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeUnsignedInt); + + case lldb::eFormatVectorOfChar: + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar); + + case lldb::eFormatVectorOfFloat32: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingIEEE754, + 32); + + case lldb::eFormatVectorOfFloat64: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingIEEE754, + 64); + + case lldb::eFormatVectorOfSInt16: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 16); + + case lldb::eFormatVectorOfSInt32: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 32); + + case lldb::eFormatVectorOfSInt64: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 64); + + case lldb::eFormatVectorOfSInt8: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, 8); + + case lldb::eFormatVectorOfUInt128: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 128); + + case lldb::eFormatVectorOfUInt16: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 16); + + case lldb::eFormatVectorOfUInt32: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 32); + + case lldb::eFormatVectorOfUInt64: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 64); + + case lldb::eFormatVectorOfUInt8: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 8); + + case lldb::eFormatDefault: + return element_type; + + case lldb::eFormatBinary: + case lldb::eFormatComplexInteger: + case lldb::eFormatDecimal: + case lldb::eFormatEnum: + case lldb::eFormatInstruction: + case lldb::eFormatOSType: + case lldb::eFormatVoid: + default: + return type_system->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 8); + } } -static lldb::Format -GetItemFormatForFormat (lldb::Format format, - CompilerType element_type) -{ - switch (format) - { - case lldb::eFormatVectorOfChar: - return lldb::eFormatChar; - - case lldb::eFormatVectorOfFloat32: - case lldb::eFormatVectorOfFloat64: - return lldb::eFormatFloat; - - case lldb::eFormatVectorOfSInt16: - case lldb::eFormatVectorOfSInt32: - case lldb::eFormatVectorOfSInt64: - case lldb::eFormatVectorOfSInt8: - return lldb::eFormatDecimal; - - case lldb::eFormatVectorOfUInt128: - case lldb::eFormatVectorOfUInt16: - case lldb::eFormatVectorOfUInt32: - case lldb::eFormatVectorOfUInt64: - case lldb::eFormatVectorOfUInt8: - return lldb::eFormatUnsigned; - - case lldb::eFormatBinary: - case lldb::eFormatComplexInteger: - case lldb::eFormatDecimal: - case lldb::eFormatEnum: - case lldb::eFormatInstruction: - case lldb::eFormatOSType: - case lldb::eFormatVoid: - return eFormatHex; - - case lldb::eFormatDefault: - { - // special case the (default, char) combination to actually display as an integer value - // most often, you won't want to see the ASCII characters... (and if you do, eFormatChar is a keystroke away) - bool is_char = element_type.IsCharType(); - bool is_signed = false; - element_type.IsIntegerType(is_signed); - return is_char ? (is_signed ? lldb::eFormatDecimal : eFormatHex) : format; - } - break; - - default: - return format; - } +static lldb::Format GetItemFormatForFormat(lldb::Format format, + CompilerType element_type) { + switch (format) { + case lldb::eFormatVectorOfChar: + return lldb::eFormatChar; + + case lldb::eFormatVectorOfFloat32: + case lldb::eFormatVectorOfFloat64: + return lldb::eFormatFloat; + + case lldb::eFormatVectorOfSInt16: + case lldb::eFormatVectorOfSInt32: + case lldb::eFormatVectorOfSInt64: + case lldb::eFormatVectorOfSInt8: + return lldb::eFormatDecimal; + + case lldb::eFormatVectorOfUInt128: + case lldb::eFormatVectorOfUInt16: + case lldb::eFormatVectorOfUInt32: + case lldb::eFormatVectorOfUInt64: + case lldb::eFormatVectorOfUInt8: + return lldb::eFormatUnsigned; + + case lldb::eFormatBinary: + case lldb::eFormatComplexInteger: + case lldb::eFormatDecimal: + case lldb::eFormatEnum: + case lldb::eFormatInstruction: + case lldb::eFormatOSType: + case lldb::eFormatVoid: + return eFormatHex; + + case lldb::eFormatDefault: { + // special case the (default, char) combination to actually display as an + // integer value + // most often, you won't want to see the ASCII characters... (and if you do, + // eFormatChar is a keystroke away) + bool is_char = element_type.IsCharType(); + bool is_signed = false; + element_type.IsIntegerType(is_signed); + return is_char ? (is_signed ? lldb::eFormatDecimal : eFormatHex) : format; + } break; + + default: + return format; + } } -static size_t -CalculateNumChildren (CompilerType container_type, - CompilerType element_type, - lldb_private::ExecutionContextScope *exe_scope = nullptr // does not matter here because all we trade in are basic types - ) -{ - auto container_size = container_type.GetByteSize(exe_scope); - auto element_size = element_type.GetByteSize(exe_scope); - - if (element_size) - { - if (container_size % element_size) - return 0; - return container_size / element_size; - } - return 0; +static size_t CalculateNumChildren( + CompilerType container_type, CompilerType element_type, + lldb_private::ExecutionContextScope *exe_scope = + nullptr // does not matter here because all we trade in are basic types + ) { + auto container_size = container_type.GetByteSize(exe_scope); + auto element_size = element_type.GetByteSize(exe_scope); + + if (element_size) { + if (container_size % element_size) + return 0; + return container_size / element_size; + } + return 0; } namespace lldb_private { - namespace formatters { - - class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd - { - public: - VectorTypeSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) : - SyntheticChildrenFrontEnd(*valobj_sp), - m_parent_format (eFormatInvalid), - m_item_format(eFormatInvalid), - m_child_type(), - m_num_children(0) - {} - - ~VectorTypeSyntheticFrontEnd() override = default; - - size_t - CalculateNumChildren() override - { - return m_num_children; - } - - lldb::ValueObjectSP - GetChildAtIndex(size_t idx) override - { - if (idx >= CalculateNumChildren()) - return lldb::ValueObjectSP(); - auto offset = idx * m_child_type.GetByteSize(nullptr); - ValueObjectSP child_sp(m_backend.GetSyntheticChildAtOffset(offset, m_child_type, true)); - if (!child_sp) - return child_sp; - - StreamString idx_name; - idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); - child_sp->SetName( ConstString( idx_name.GetData() ) ); - - child_sp->SetFormat(m_item_format); - - return child_sp; - } - - bool - Update() override - { - m_parent_format = m_backend.GetFormat(); - CompilerType parent_type(m_backend.GetCompilerType()); - CompilerType element_type; - parent_type.IsVectorType(&element_type, nullptr); - TargetSP target_sp(m_backend.GetTargetSP()); - m_child_type = ::GetCompilerTypeForFormat(m_parent_format, - element_type, - target_sp ? target_sp->GetScratchTypeSystemForLanguage(nullptr, lldb::eLanguageTypeC) : nullptr); - m_num_children = ::CalculateNumChildren(parent_type, - m_child_type); - m_item_format = GetItemFormatForFormat(m_parent_format, - m_child_type); - return false; - } - - bool - MightHaveChildren() override - { - return true; - } - - size_t - GetIndexOfChildWithName(const ConstString &name) override - { - const char* item_name = name.GetCString(); - uint32_t idx = ExtractIndexFromString(item_name); - if (idx < UINT32_MAX && idx >= CalculateNumChildren()) - return UINT32_MAX; - return idx; - } - - private: - lldb::Format m_parent_format; - lldb::Format m_item_format; - CompilerType m_child_type; - size_t m_num_children; - }; - - } // namespace formatters +namespace formatters { + +class VectorTypeSyntheticFrontEnd : public SyntheticChildrenFrontEnd { +public: + VectorTypeSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp) + : SyntheticChildrenFrontEnd(*valobj_sp), m_parent_format(eFormatInvalid), + m_item_format(eFormatInvalid), m_child_type(), m_num_children(0) {} + + ~VectorTypeSyntheticFrontEnd() override = default; + + size_t CalculateNumChildren() override { return m_num_children; } + + lldb::ValueObjectSP GetChildAtIndex(size_t idx) override { + if (idx >= CalculateNumChildren()) + return lldb::ValueObjectSP(); + auto offset = idx * m_child_type.GetByteSize(nullptr); + ValueObjectSP child_sp( + m_backend.GetSyntheticChildAtOffset(offset, m_child_type, true)); + if (!child_sp) + return child_sp; + + StreamString idx_name; + idx_name.Printf("[%" PRIu64 "]", (uint64_t)idx); + child_sp->SetName(ConstString(idx_name.GetString())); + + child_sp->SetFormat(m_item_format); + + return child_sp; + } + + bool Update() override { + m_parent_format = m_backend.GetFormat(); + CompilerType parent_type(m_backend.GetCompilerType()); + CompilerType element_type; + parent_type.IsVectorType(&element_type, nullptr); + TargetSP target_sp(m_backend.GetTargetSP()); + m_child_type = ::GetCompilerTypeForFormat( + m_parent_format, element_type, + target_sp + ? target_sp->GetScratchTypeSystemForLanguage(nullptr, + lldb::eLanguageTypeC) + : nullptr); + m_num_children = ::CalculateNumChildren(parent_type, m_child_type); + m_item_format = GetItemFormatForFormat(m_parent_format, m_child_type); + return false; + } + + bool MightHaveChildren() override { return true; } + + size_t GetIndexOfChildWithName(const ConstString &name) override { + const char *item_name = name.GetCString(); + uint32_t idx = ExtractIndexFromString(item_name); + if (idx < UINT32_MAX && idx >= CalculateNumChildren()) + return UINT32_MAX; + return idx; + } + +private: + lldb::Format m_parent_format; + lldb::Format m_item_format; + CompilerType m_child_type; + size_t m_num_children; +}; + +} // namespace formatters } // namespace lldb_private -bool -lldb_private::formatters::VectorTypeSummaryProvider (ValueObject& valobj, - Stream& s, - const TypeSummaryOptions&) -{ - auto synthetic_children = VectorTypeSyntheticFrontEndCreator(nullptr, valobj.GetSP()); - if (!synthetic_children) - return false; - - synthetic_children->Update(); - - s.PutChar('('); - bool first = true; - - size_t idx = 0, len = synthetic_children->CalculateNumChildren(); - - for (; - idx < len; - idx++) - { - auto child_sp = synthetic_children->GetChildAtIndex(idx); - if (!child_sp) - continue; - child_sp = child_sp->GetQualifiedRepresentationIfAvailable(lldb::eDynamicDontRunTarget, true); - - const char* child_value = child_sp->GetValueAsCString(); - if (child_value && *child_value) - { - if (first) - { - s.Printf("%s", child_value); - first = false; - } - else - { - s.Printf(", %s", child_value); - } - } +bool lldb_private::formatters::VectorTypeSummaryProvider( + ValueObject &valobj, Stream &s, const TypeSummaryOptions &) { + auto synthetic_children = + VectorTypeSyntheticFrontEndCreator(nullptr, valobj.GetSP()); + if (!synthetic_children) + return false; + + synthetic_children->Update(); + + s.PutChar('('); + bool first = true; + + size_t idx = 0, len = synthetic_children->CalculateNumChildren(); + + for (; idx < len; idx++) { + auto child_sp = synthetic_children->GetChildAtIndex(idx); + if (!child_sp) + continue; + child_sp = child_sp->GetQualifiedRepresentationIfAvailable( + lldb::eDynamicDontRunTarget, true); + + const char *child_value = child_sp->GetValueAsCString(); + if (child_value && *child_value) { + if (first) { + s.Printf("%s", child_value); + first = false; + } else { + s.Printf(", %s", child_value); + } } - - s.PutChar(')'); - - return true; + } + + s.PutChar(')'); + + return true; } -lldb_private::SyntheticChildrenFrontEnd* -lldb_private::formatters::VectorTypeSyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp) -{ - if (!valobj_sp) - return nullptr; - return new VectorTypeSyntheticFrontEnd(valobj_sp); +lldb_private::SyntheticChildrenFrontEnd * +lldb_private::formatters::VectorTypeSyntheticFrontEndCreator( + CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp) { + if (!valobj_sp) + return nullptr; + return new VectorTypeSyntheticFrontEnd(valobj_sp); } |