[Lldb-commits] [lldb] d952ddc - [lldb] Add MSVC STL formatter for std::source_location (#217244)
via lldb-commits
lldb-commits at lists.llvm.org
Sat Aug 22 04:37:45 PDT 2026
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 <bjorn.schobben at aimsport.com>
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],
+ )
More information about the lldb-commits
mailing list