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

Reply via email to