Author: Daedie-git Date: 2026-08-22T13:37:40+02:00 New Revision: d952ddc243962c95d28ab8d453524983283a8321
URL: https://github.com/llvm/llvm-project/commit/d952ddc243962c95d28ab8d453524983283a8321 DIFF: https://github.com/llvm/llvm-project/commit/d952ddc243962c95d28ab8d453524983283a8321.diff LOG: [lldb] Add MSVC STL formatter for std::source_location (#217244) Summarize MSVC STL `std::source_location` from `_File` / `_Function` / `_Line` / `_Column`. LoadCommon last-match-wins, so this dispatches on the MSVC layout and otherwise keeps the existing libstdc++ formatter. A default-constructed location is left without a summary, and implementation children remain hidden. Tests: generic source_location suite's MSVC STL category (Windows), including child-hiding checks. Part of #24834 Assisted-by: Grok 4.6 Assisted-by: codex-5.6-high --------- Co-authored-by: Bjorn Schobben <[email protected]> Added: Modified: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp lldb/source/Plugins/Language/CPlusPlus/MsvcStl.cpp lldb/source/Plugins/Language/CPlusPlus/MsvcStl.h lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/source_location/TestDataFormatterStdSourceLocation.py Removed: ################################################################################ diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index c5b277311eadc..2ed109d41d2a3 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -1770,6 +1770,14 @@ static bool GenericValarraySummaryProvider(ValueObject &valobj, Stream &stream, return ContainerSizeSummaryProvider(valobj, stream, options); } +static bool +GenericSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options) { + if (IsMsvcStlSourceLocation(valobj)) + return MsvcStlSourceLocationSummaryProvider(valobj, stream, options); + return LibStdcppSourceLocationSummaryProvider(valobj, stream, options); +} + /// Load formatters that are formatting types from more than one STL static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { if (!cpp_category_sp) @@ -1889,6 +1897,10 @@ static void LoadCommonStlFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { "MSVC STL/libstdc++ std::filesystem::path summary provider", "^std::filesystem::(__cxx11::)?path$", stl_summary_flags, true); + AddCXXSummary(cpp_category_sp, GenericSourceLocationSummaryProvider, + "MSVC STL/libstdc++ std::source_location summary provider", + "std::source_location", stl_summary_flags); + stl_summary_flags.SetDontShowChildren(false); stl_summary_flags.SetSkipPointers(false); diff --git a/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.cpp b/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.cpp index 93a01acdc0f0a..0d10eb287b2ce 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.cpp @@ -16,6 +16,7 @@ #include "lldb/Utility/Status.h" #include "lldb/Utility/Stream.h" #include "lldb/ValueObject/ValueObject.h" +#include "llvm/ADT/StringRef.h" #include "Plugins/Language/CPlusPlus/CxxStringTypes.h" @@ -305,3 +306,42 @@ bool lldb_private::formatters::MsvcStlStrongOrderingSummaryProvider( } return true; } + +bool lldb_private::formatters::IsMsvcStlSourceLocation(ValueObject &valobj) { + if (auto valobj_sp = valobj.GetNonSyntheticValue()) + return valobj_sp->GetChildMemberWithName("_File") != nullptr; + return false; +} + +bool lldb_private::formatters::MsvcStlSourceLocationSummaryProvider( + ValueObject &valobj, Stream &stream, const TypeSummaryOptions &) { + ValueObjectSP file_sp = valobj.GetChildMemberWithName("_File"); + ValueObjectSP function_sp = valobj.GetChildMemberWithName("_Function"); + ValueObjectSP line_sp = valobj.GetChildMemberWithName("_Line"); + ValueObjectSP column_sp = valobj.GetChildMemberWithName("_Column"); + + if (!file_sp || !function_sp || !line_sp || !column_sp) + return false; + + bool success = false; + uint64_t line = line_sp->GetValueAsUnsigned(0, &success); + if (!success) + return false; + + uint64_t column = column_sp->GetValueAsUnsigned(0, &success); + if (!success) + return false; + + const char *file = file_sp->GetSummaryAsCString(); + // Default-constructed source_location is empty; don't invent a summary. + if (line == 0 && column == 0 && + (!file || file[0] == '\0' || llvm::StringRef(file) == "\"\"")) + return false; + + stream.Format("{0}:{1}:{2}", file ? file : "<unknown>", line, column); + + if (const char *function = function_sp->GetSummaryAsCString()) + stream.Printf(" (%s)", function); + + return true; +} diff --git a/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.h b/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.h index d488a6e7c1d32..4ec992b9ed21d 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.h +++ b/lldb/source/Plugins/Language/CPlusPlus/MsvcStl.h @@ -165,6 +165,11 @@ SyntheticChildrenFrontEnd * MsvcStlValarraySyntheticFrontEndCreator(CXXSyntheticChildren *, lldb::ValueObjectSP valobj_sp); +// MSVC STL std::source_location +bool IsMsvcStlSourceLocation(ValueObject &valobj); +bool MsvcStlSourceLocationSummaryProvider(ValueObject &valobj, Stream &stream, + const TypeSummaryOptions &options); + } // namespace formatters } // namespace lldb_private diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/source_location/TestDataFormatterStdSourceLocation.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/source_location/TestDataFormatterStdSourceLocation.py index 4dd28c816a10c..f648567e07f3b 100644 --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/source_location/TestDataFormatterStdSourceLocation.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/generic/source_location/TestDataFormatterStdSourceLocation.py @@ -21,13 +21,11 @@ def do_test(self): loc_main = frame.FindVariable("loc_main") self.assertTrue(loc_main.GetError().Success()) - self.assertRegex(loc_main.summary, r"main\.cpp\":6:\d+ \(\"int main\(\)\"\)") + self.assertRegex(loc_main.summary, r'main\.cpp":6:\d+ \(".*\bmain\b.*"\)') loc_foo = frame.FindVariable("loc_foo") self.assertTrue(loc_foo.GetError().Success()) - self.assertRegex( - loc_foo.summary, r"main\.cpp\":3:\d+ \(\"std::source_location foo\(\)\"\)" - ) + self.assertRegex(loc_foo.summary, r'main\.cpp":3:\d+ \(".*\bfoo\b.*"\)') loc_empty = frame.FindVariable("loc_empty") self.assertTrue(loc_empty.GetError().Success()) @@ -51,3 +49,15 @@ def test_libcxx(self): def test_libstdcxx(self): self.build(dictionary={"USE_LIBSTDCPP": 1}) self.do_test() + + @add_test_categories(["msvcstl"]) + def test_msvcstl(self): + self.build() + self.do_test() + + for member in ("_File =", "_Function =", "_Line =", "_Column ="): + self.expect( + "frame variable loc_main loc_foo", + matching=False, + substrs=[member], + ) _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
