Skip to content

Commit 7dbea95

Browse files
Merge pull request #4821 from adrian-prantl/48889258
[LLDB] libcxx summary formatters for std::string_view
2 parents 1376c15 + 2d4acf3 commit 7dbea95

File tree

6 files changed

+480
-16
lines changed

6 files changed

+480
-16
lines changed

lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,51 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) {
584584
"std::__[[:alnum:]]+::allocator<wchar_t> >$"),
585585
stl_summary_flags, true);
586586

587+
AddCXXSummary(cpp_category_sp,
588+
lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,
589+
"std::string_view summary provider",
590+
ConstString("^std::__[[:alnum:]]+::string_view$"),
591+
stl_summary_flags, true);
592+
AddCXXSummary(cpp_category_sp,
593+
lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,
594+
"std::string_view summary provider",
595+
ConstString("^std::__[[:alnum:]]+::basic_string_view<char, "
596+
"std::__[[:alnum:]]+::char_traits<char> >$"),
597+
stl_summary_flags, true);
598+
AddCXXSummary(
599+
cpp_category_sp,
600+
lldb_private::formatters::LibcxxStringViewSummaryProviderASCII,
601+
"std::string_view summary provider",
602+
ConstString("^std::__[[:alnum:]]+::basic_string_view<unsigned char, "
603+
"std::__[[:alnum:]]+::char_traits<unsigned char> >$"),
604+
stl_summary_flags, true);
605+
606+
AddCXXSummary(cpp_category_sp,
607+
lldb_private::formatters::LibcxxStringViewSummaryProviderUTF16,
608+
"std::u16string_view summary provider",
609+
ConstString("^std::__[[:alnum:]]+::basic_string_view<char16_t, "
610+
"std::__[[:alnum:]]+::char_traits<char16_t> >$"),
611+
stl_summary_flags, true);
612+
613+
AddCXXSummary(cpp_category_sp,
614+
lldb_private::formatters::LibcxxStringViewSummaryProviderUTF32,
615+
"std::u32string_view summary provider",
616+
ConstString("^std::__[[:alnum:]]+::basic_string_view<char32_t, "
617+
"std::__[[:alnum:]]+::char_traits<char32_t> >$"),
618+
stl_summary_flags, true);
619+
620+
AddCXXSummary(cpp_category_sp,
621+
lldb_private::formatters::LibcxxWStringViewSummaryProvider,
622+
"std::wstring_view summary provider",
623+
ConstString("^std::__[[:alnum:]]+::wstring_view$"),
624+
stl_summary_flags, true);
625+
AddCXXSummary(cpp_category_sp,
626+
lldb_private::formatters::LibcxxWStringViewSummaryProvider,
627+
"std::wstring_view summary provider",
628+
ConstString("^std::__[[:alnum:]]+::basic_string_view<wchar_t, "
629+
"std::__[[:alnum:]]+::char_traits<wchar_t> >$"),
630+
stl_summary_flags, true);
631+
587632
SyntheticChildren::Flags stl_synth_flags;
588633
stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(
589634
false);

lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp

Lines changed: 116 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
#include "lldb/Target/ProcessStructReader.h"
2020
#include "lldb/Target/SectionLoadList.h"
2121
#include "lldb/Target/Target.h"
22+
#include "lldb/Utility/ConstString.h"
2223
#include "lldb/Utility/DataBufferHeap.h"
2324
#include "lldb/Utility/Endian.h"
2425
#include "lldb/Utility/Status.h"
2526
#include "lldb/Utility/Stream.h"
2627

2728
#include "Plugins/LanguageRuntime/CPlusPlus/CPPLanguageRuntime.h"
2829
#include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
30+
#include <tuple>
2931

3032
using namespace lldb;
3133
using namespace lldb_private;
@@ -560,7 +562,7 @@ ExtractLibcxxStringInfo(ValueObject &valobj) {
560562
return {};
561563

562564
ValueObjectSP layout_decider(
563-
D->GetChildAtIndexPath(llvm::ArrayRef<size_t>({0, 0})));
565+
D->GetChildAtIndexPath(llvm::ArrayRef<size_t>({0, 0})));
564566

565567
// this child should exist
566568
if (!layout_decider)
@@ -643,24 +645,17 @@ ExtractLibcxxStringInfo(ValueObject &valobj) {
643645
return std::make_pair(size, location_sp);
644646
}
645647

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) {
656652
if (size == 0) {
657653
stream.Printf("L\"\"");
658654
return true;
659655
}
660656
if (!location_sp)
661657
return false;
662658

663-
664659
StringPrinter::ReadBufferAndDumpToStreamOptions options(valobj);
665660
if (summary_options.GetCapping() == TypeSummaryCapping::eTypeSummaryCapped) {
666661
const auto max_size = valobj.GetTargetSP()->GetMaximumSizeOfStringSummary();
@@ -714,17 +709,27 @@ bool lldb_private::formatters::LibcxxWStringSummaryProvider(
714709
return false;
715710
}
716711

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) {
721715
auto string_info = ExtractLibcxxStringInfo(valobj);
722716
if (!string_info)
723717
return false;
724718
uint64_t size;
725719
ValueObjectSP location_sp;
726720
std::tie(size, location_sp) = *string_info;
727721

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+
728733
if (size == 0) {
729734
stream.Printf("\"\"");
730735
return true;
@@ -762,6 +767,21 @@ bool LibcxxStringSummaryProvider(ValueObject &valobj, Stream &stream,
762767
return StringPrinter::ReadBufferAndDumpToStream<element_type>(options);
763768
}
764769

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+
}
765785
template <StringPrinter::StringElementType element_type>
766786
static bool formatStringImpl(ValueObject &valobj, Stream &stream,
767787
const TypeSummaryOptions &summary_options,
@@ -796,3 +816,83 @@ bool lldb_private::formatters::LibcxxStringSummaryProviderUTF32(
796816
return formatStringImpl<StringPrinter::StringElementType::UTF32>(
797817
valobj, stream, summary_options, "U");
798818
}
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+
}

lldb/source/Plugins/Language/CPlusPlus/LibCxx.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,22 @@ bool LibcxxWStringSummaryProvider(
3434
ValueObject &valobj, Stream &stream,
3535
const TypeSummaryOptions &options); // libc++ std::wstring
3636

37+
bool LibcxxStringViewSummaryProviderASCII(
38+
ValueObject &valueObj, Stream &stream,
39+
const TypeSummaryOptions &summary_options); // libc++ std::string_view
40+
41+
bool LibcxxStringViewSummaryProviderUTF16(
42+
ValueObject &valobj, Stream &stream,
43+
const TypeSummaryOptions &summary_options); // libc++ std::u16string_view
44+
45+
bool LibcxxStringViewSummaryProviderUTF32(
46+
ValueObject &valobj, Stream &stream,
47+
const TypeSummaryOptions &summary_options); // libc++ std::u32string_view
48+
49+
bool LibcxxWStringViewSummaryProvider(
50+
ValueObject &valobj, Stream &stream,
51+
const TypeSummaryOptions &options); // libc++ std::wstring_view
52+
3753
bool LibcxxOptionalSummaryProvider(
3854
ValueObject &valobj, Stream &stream,
3955
const TypeSummaryOptions &options); // libc++ std::optional<>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
CXX_SOURCES := main.cpp
2+
3+
USE_LIBCPP := 1
4+
5+
CXXFLAGS_EXTRAS := -std=c++11 -O0
6+
include Makefile.rules

0 commit comments

Comments
 (0)