|
19 | 19 | #include "lldb/Target/ProcessStructReader.h"
|
20 | 20 | #include "lldb/Target/SectionLoadList.h"
|
21 | 21 | #include "lldb/Target/Target.h"
|
| 22 | +#include "lldb/Utility/ConstString.h" |
22 | 23 | #include "lldb/Utility/DataBufferHeap.h"
|
23 | 24 | #include "lldb/Utility/Endian.h"
|
24 | 25 | #include "lldb/Utility/Status.h"
|
25 | 26 | #include "lldb/Utility/Stream.h"
|
26 | 27 |
|
27 | 28 | #include "Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h"
|
28 | 29 | #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
|
| 30 | +#include <tuple> |
29 | 31 |
|
30 | 32 | using namespace lldb;
|
31 | 33 | using namespace lldb_private;
|
@@ -560,7 +562,7 @@ ExtractLibcxxStringInfo(ValueObject &valobj) {
|
560 | 562 | return {};
|
561 | 563 |
|
562 | 564 | ValueObjectSP layout_decider(
|
563 |
| - D->GetChildAtIndexPath(llvm::ArrayRef<size_t>({0, 0}))); |
| 565 | + D->GetChildAtIndexPath(llvm::ArrayRef<size_t>({0, 0}))); |
564 | 566 |
|
565 | 567 | // this child should exist
|
566 | 568 | if (!layout_decider)
|
@@ -643,24 +645,17 @@ ExtractLibcxxStringInfo(ValueObject &valobj) {
|
643 | 645 | return std::make_pair(size, location_sp);
|
644 | 646 | }
|
645 | 647 |
|
646 |
| -bool lldb_private::formatters::LibcxxWStringSummaryProvider( |
647 |
| - ValueObject &valobj, Stream &stream, |
648 |
| - const TypeSummaryOptions &summary_options) { |
649 |
| - auto string_info = ExtractLibcxxStringInfo(valobj); |
650 |
| - if (!string_info) |
651 |
| - return false; |
652 |
| - uint64_t size; |
653 |
| - ValueObjectSP location_sp; |
654 |
| - std::tie(size, location_sp) = *string_info; |
655 |
| - |
| 648 | +static bool |
| 649 | +LibcxxWStringSummaryProvider(ValueObject &valobj, Stream &stream, |
| 650 | + const TypeSummaryOptions &summary_options, |
| 651 | + ValueObjectSP location_sp, size_t size) { |
656 | 652 | if (size == 0) {
|
657 | 653 | stream.Printf("L\"\"");
|
658 | 654 | return true;
|
659 | 655 | }
|
660 | 656 | if (!location_sp)
|
661 | 657 | return false;
|
662 | 658 |
|
663 |
| - |
664 | 659 | StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj);
|
665 | 660 | if (summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryCapped) {
|
666 | 661 | const auto max_size = valobj.GetTargetSP()->GetMaximumSizeOfStringSummary();
|
@@ -714,17 +709,27 @@ bool lldb_private::formatters::LibcxxWStringSummaryProvider(
|
714 | 709 | return false;
|
715 | 710 | }
|
716 | 711 |
|
717 |
| -template <StringPrinter::StringElementType element_type> |
718 |
| -bool LibcxxStringSummaryProvider(ValueObject &valobj, Stream &stream, |
719 |
| - const TypeSummaryOptions &summary_options, |
720 |
| - std::string prefix_token) { |
| 712 | +bool lldb_private::formatters::LibcxxWStringSummaryProvider( |
| 713 | + ValueObject &valobj, Stream &stream, |
| 714 | + const TypeSummaryOptions &summary_options) { |
721 | 715 | auto string_info = ExtractLibcxxStringInfo(valobj);
|
722 | 716 | if (!string_info)
|
723 | 717 | return false;
|
724 | 718 | uint64_t size;
|
725 | 719 | ValueObjectSP location_sp;
|
726 | 720 | std::tie(size, location_sp) = *string_info;
|
727 | 721 |
|
| 722 | + return ::LibcxxWStringSummaryProvider(valobj, stream, summary_options, |
| 723 | + location_sp, size); |
| 724 | +} |
| 725 | + |
| 726 | +template <StringPrinter::StringElementType element_type> |
| 727 | +static bool |
| 728 | +LibcxxStringSummaryProvider(ValueObject &valobj, Stream &stream, |
| 729 | + const TypeSummaryOptions &summary_options, |
| 730 | + std::string prefix_token, ValueObjectSP location_sp, |
| 731 | + uint64_t size) { |
| 732 | + |
728 | 733 | if (size == 0) {
|
729 | 734 | stream.Printf("\"\"");
|
730 | 735 | return true;
|
@@ -762,6 +767,21 @@ bool LibcxxStringSummaryProvider(ValueObject &valobj, Stream &stream,
|
762 | 767 | return StringPrinter::ReadBufferAndDumpToStream<element_type>(options);
|
763 | 768 | }
|
764 | 769 |
|
| 770 | +template <StringPrinter::StringElementType element_type> |
| 771 | +static bool |
| 772 | +LibcxxStringSummaryProvider(ValueObject &valobj, Stream &stream, |
| 773 | + const TypeSummaryOptions &summary_options, |
| 774 | + std::string prefix_token) { |
| 775 | + auto string_info = ExtractLibcxxStringInfo(valobj); |
| 776 | + if (!string_info) |
| 777 | + return false; |
| 778 | + uint64_t size; |
| 779 | + ValueObjectSP location_sp; |
| 780 | + std::tie(size, location_sp) = *string_info; |
| 781 | + |
| 782 | + return LibcxxStringSummaryProvider<element_type>( |
| 783 | + valobj, stream, summary_options, prefix_token, location_sp, size); |
| 784 | +} |
765 | 785 | template <StringPrinter::StringElementType element_type>
|
766 | 786 | static bool formatStringImpl(ValueObject &valobj, Stream &stream,
|
767 | 787 | const TypeSummaryOptions &summary_options,
|
@@ -796,3 +816,83 @@ bool lldb_private::formatters::LibcxxStringSummaryProviderUTF32(
|
796 | 816 | return formatStringImpl<StringPrinter::StringElementType::UTF32>(
|
797 | 817 | valobj, stream, summary_options, "U");
|
798 | 818 | }
|
| 819 | + |
| 820 | +static std::tuple<bool, ValueObjectSP, size_t> |
| 821 | +LibcxxExtractStringViewData(ValueObject& valobj) { |
| 822 | + ConstString g_data_name("__data"); |
| 823 | + ConstString g_size_name("__size"); |
| 824 | + auto dataobj = valobj.GetChildMemberWithName(g_data_name, true); |
| 825 | + auto sizeobj = valobj.GetChildMemberWithName(g_size_name, true); |
| 826 | + |
| 827 | + if (!dataobj || !sizeobj) |
| 828 | + return std::make_tuple<bool,ValueObjectSP,size_t>(false, {}, {}); |
| 829 | + |
| 830 | + if (!dataobj->GetError().Success() || !sizeobj->GetError().Success()) |
| 831 | + return std::make_tuple<bool,ValueObjectSP,size_t>(false, {}, {}); |
| 832 | + |
| 833 | + bool success{false}; |
| 834 | + uint64_t size = sizeobj->GetValueAsUnsigned(0, &success); |
| 835 | + if (!success) |
| 836 | + return std::make_tuple<bool,ValueObjectSP,size_t>(false, {}, {}); |
| 837 | + |
| 838 | + return std::make_tuple(true,dataobj,size); |
| 839 | +} |
| 840 | + |
| 841 | +template <StringPrinter::StringElementType element_type> |
| 842 | +static bool formatStringViewImpl(ValueObject &valobj, Stream &stream, |
| 843 | + const TypeSummaryOptions &summary_options, |
| 844 | + std::string prefix_token) { |
| 845 | + |
| 846 | + bool success; |
| 847 | + ValueObjectSP dataobj; |
| 848 | + size_t size; |
| 849 | + std::tie(success, dataobj, size) = LibcxxExtractStringViewData(valobj); |
| 850 | + |
| 851 | + if (!success) { |
| 852 | + stream << "Summary Unavailable"; |
| 853 | + return true; |
| 854 | + } |
| 855 | + |
| 856 | + return LibcxxStringSummaryProvider<element_type>( |
| 857 | + valobj, stream, summary_options, prefix_token, dataobj, size); |
| 858 | +} |
| 859 | + |
| 860 | +bool lldb_private::formatters::LibcxxStringViewSummaryProviderASCII( |
| 861 | + ValueObject &valobj, Stream &stream, |
| 862 | + const TypeSummaryOptions &summary_options) { |
| 863 | + return formatStringViewImpl<StringPrinter::StringElementType::ASCII>( |
| 864 | + valobj, stream, summary_options, ""); |
| 865 | +} |
| 866 | + |
| 867 | +bool lldb_private::formatters::LibcxxStringViewSummaryProviderUTF16( |
| 868 | + ValueObject &valobj, Stream &stream, |
| 869 | + const TypeSummaryOptions &summary_options) { |
| 870 | + return formatStringViewImpl<StringPrinter::StringElementType::UTF16>( |
| 871 | + valobj, stream, summary_options, "u"); |
| 872 | +} |
| 873 | + |
| 874 | +bool lldb_private::formatters::LibcxxStringViewSummaryProviderUTF32( |
| 875 | + ValueObject &valobj, Stream &stream, |
| 876 | + const TypeSummaryOptions &summary_options) { |
| 877 | + return formatStringViewImpl<StringPrinter::StringElementType::UTF32>( |
| 878 | + valobj, stream, summary_options, "U"); |
| 879 | +} |
| 880 | + |
| 881 | +bool lldb_private::formatters::LibcxxWStringViewSummaryProvider( |
| 882 | + ValueObject &valobj, Stream &stream, |
| 883 | + const TypeSummaryOptions &summary_options) { |
| 884 | + |
| 885 | + bool success; |
| 886 | + ValueObjectSP dataobj; |
| 887 | + size_t size; |
| 888 | + std::tie( success, dataobj, size ) = LibcxxExtractStringViewData(valobj); |
| 889 | + |
| 890 | + if (!success) { |
| 891 | + stream << "Summary Unavailable"; |
| 892 | + return true; |
| 893 | + } |
| 894 | + |
| 895 | + |
| 896 | + return ::LibcxxWStringSummaryProvider(valobj, stream, summary_options, |
| 897 | + dataobj, size); |
| 898 | +} |
0 commit comments