https://github.com/aviralg updated 
https://github.com/llvm/llvm-project/pull/183390

>From 05cff5c9bcec4ddfa6f49c0efa7f2f78d1150c2a Mon Sep 17 00:00:00 2001
From: Aviral Goel <[email protected]>
Date: Wed, 25 Feb 2026 13:03:29 -0800
Subject: [PATCH] Fix messages and make things consistent

---
 .../Analysis/Scalable/Model/BuildNamespace.h  |   5 +-
 .../Analysis/Scalable/Model/EntityLinkage.h   |  23 +-
 .../Scalable/Serialization/JSONFormat.h       |   3 -
 .../Scalable/Support/FormatProviders.h        |  14 +
 .../Scalable/EntityLinker/EntityLinker.cpp    |  18 +-
 .../Scalable/Model/BuildNamespace.cpp         |  25 +-
 .../Analysis/Scalable/Model/EntityLinkage.cpp |  31 +-
 .../Scalable/ModelStringConversions.h         |  87 ++++++
 .../Scalable/Serialization/JSONFormat.cpp     | 129 ++++-----
 .../Analysis/Scalable/BuildNamespaceTest.cpp  |  65 +++--
 .../Analysis/Scalable/CMakeLists.txt          |   5 +
 .../Analysis/Scalable/EntityIdTest.cpp        |  14 +
 .../Analysis/Scalable/EntityLinkageTest.cpp   |  44 ++-
 .../Analysis/Scalable/EntityLinkerTest.cpp    |   8 +-
 .../Analysis/Scalable/EntityNameTest.cpp      |  16 +-
 .../Scalable/ModelStringConversionsTest.cpp   | 100 +++++++
 .../JSONFormatTest/TUSummaryTest.cpp          | 274 +++++++++---------
 .../Analysis/Scalable/SummaryNameTest.cpp     |   7 +
 18 files changed, 565 insertions(+), 303 deletions(-)
 create mode 100644 clang/lib/Analysis/Scalable/ModelStringConversions.h
 create mode 100644 
clang/unittests/Analysis/Scalable/ModelStringConversionsTest.cpp

diff --git a/clang/include/clang/Analysis/Scalable/Model/BuildNamespace.h 
b/clang/include/clang/Analysis/Scalable/Model/BuildNamespace.h
index 61c767e7953dc..39307d976e986 100644
--- a/clang/include/clang/Analysis/Scalable/Model/BuildNamespace.h
+++ b/clang/include/clang/Analysis/Scalable/Model/BuildNamespace.h
@@ -29,10 +29,6 @@ namespace clang::ssaf {
 
 enum class BuildNamespaceKind : unsigned short { CompilationUnit, LinkUnit };
 
-llvm::StringRef toString(BuildNamespaceKind BNK);
-
-std::optional<BuildNamespaceKind> parseBuildNamespaceKind(llvm::StringRef Str);
-
 /// Represents a single namespace in the build process.
 ///
 /// A BuildNamespace groups program entities, such as those belonging to a
@@ -123,6 +119,7 @@ class NestedBuildNamespace {
                                        const NestedBuildNamespace &NBN);
 };
 
+llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, BuildNamespaceKind BNK);
 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const BuildNamespace &BN);
 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
                               const NestedBuildNamespace &NBN);
diff --git a/clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h 
b/clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h
index 0d52a70ae7f92..3e9374d6ddab3 100644
--- a/clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h
+++ b/clang/include/clang/Analysis/Scalable/Model/EntityLinkage.h
@@ -14,6 +14,12 @@
 
 namespace clang::ssaf {
 
+enum class EntityLinkageType {
+  None,     ///< local variables, function parameters
+  Internal, ///< static functions/variables, anonymous namespace
+  External  ///< globally visible across translation units
+};
+
 /// Represents the linkage properties of an entity in the program model.
 ///
 /// EntityLinkage captures whether an entity has no linkage, internal linkage,
@@ -24,26 +30,19 @@ class EntityLinkage {
   friend class TestFixture;
 
 public:
-  enum class LinkageType {
-    None,     ///< local variables, function parameters
-    Internal, ///< static functions/variables, anonymous namespace
-    External  ///< globally visible across translation units
-  };
+  constexpr explicit EntityLinkage(EntityLinkageType L) : Linkage(L) {}
 
-  constexpr explicit EntityLinkage(LinkageType L) : Linkage(L) {}
-
-  LinkageType getLinkage() const { return Linkage; }
+  EntityLinkageType getLinkage() const { return Linkage; }
 
   bool operator==(const EntityLinkage &Other) const;
   bool operator!=(const EntityLinkage &Other) const;
 
 private:
-  LinkageType Linkage;
+  EntityLinkageType Linkage;
 };
 
-/// Returns a string representation of the linkage type.
-llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
-                              EntityLinkage::LinkageType Linkage);
+/// Writes a string representation of the linkage type to the stream.
+llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, EntityLinkageType 
Linkage);
 
 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
                               const EntityLinkage &Linkage);
diff --git a/clang/include/clang/Analysis/Scalable/Serialization/JSONFormat.h 
b/clang/include/clang/Analysis/Scalable/Serialization/JSONFormat.h
index 8d46bbf29863a..30dfa305238f6 100644
--- a/clang/include/clang/Analysis/Scalable/Serialization/JSONFormat.h
+++ b/clang/include/clang/Analysis/Scalable/Serialization/JSONFormat.h
@@ -69,9 +69,6 @@ class JSONFormat final : public SerializationFormat {
   EntityId entityIdFromJSON(const uint64_t EntityIdIndex) const;
   uint64_t entityIdToJSON(EntityId EI) const;
 
-  llvm::Expected<BuildNamespaceKind>
-  buildNamespaceKindFromJSON(llvm::StringRef BuildNamespaceKindStr) const;
-
   llvm::Expected<BuildNamespace>
   buildNamespaceFromJSON(const Object &BuildNamespaceObject) const;
   Object buildNamespaceToJSON(const BuildNamespace &BN) const;
diff --git a/clang/include/clang/Analysis/Scalable/Support/FormatProviders.h 
b/clang/include/clang/Analysis/Scalable/Support/FormatProviders.h
index 3610a3b2d0074..80bbf79bbdb37 100644
--- a/clang/include/clang/Analysis/Scalable/Support/FormatProviders.h
+++ b/clang/include/clang/Analysis/Scalable/Support/FormatProviders.h
@@ -31,6 +31,13 @@ template <> struct format_provider<clang::ssaf::EntityId> {
   }
 };
 
+template <> struct format_provider<clang::ssaf::EntityLinkageType> {
+  static void format(clang::ssaf::EntityLinkageType Val, raw_ostream &OS,
+                     StringRef Style) {
+    OS << Val;
+  }
+};
+
 template <> struct format_provider<clang::ssaf::EntityLinkage> {
   static void format(clang::ssaf::EntityLinkage Val, raw_ostream &OS,
                      StringRef Style) {
@@ -38,6 +45,13 @@ template <> struct 
format_provider<clang::ssaf::EntityLinkage> {
   }
 };
 
+template <> struct format_provider<clang::ssaf::BuildNamespaceKind> {
+  static void format(clang::ssaf::BuildNamespaceKind Val, raw_ostream &OS,
+                     StringRef Style) {
+    OS << Val;
+  }
+};
+
 template <> struct format_provider<clang::ssaf::BuildNamespace> {
   static void format(const clang::ssaf::BuildNamespace &Val, raw_ostream &OS,
                      StringRef Style) {
diff --git a/clang/lib/Analysis/Scalable/EntityLinker/EntityLinker.cpp 
b/clang/lib/Analysis/Scalable/EntityLinker/EntityLinker.cpp
index 1860a76db67aa..cd0c83a38a377 100644
--- a/clang/lib/Analysis/Scalable/EntityLinker/EntityLinker.cpp
+++ b/clang/lib/Analysis/Scalable/EntityLinker/EntityLinker.cpp
@@ -49,16 +49,16 @@ static constexpr const char *DuplicateTUNamespace =
 static NestedBuildNamespace
 resolveNamespace(const NestedBuildNamespace &LUNamespace,
                  const NestedBuildNamespace &EntityNamespace,
-                 EntityLinkage::LinkageType Linkage) {
+                 EntityLinkageType Linkage) {
   switch (Linkage) {
-  case EntityLinkage::LinkageType::None:
-  case EntityLinkage::LinkageType::Internal:
+  case EntityLinkageType::None:
+  case EntityLinkageType::Internal:
     return EntityNamespace.makeQualified(LUNamespace);
-  case EntityLinkage::LinkageType::External:
+  case EntityLinkageType::External:
     return NestedBuildNamespace(LUNamespace);
   }
 
-  llvm_unreachable("Unhandled EntityLinkage::LinkageType variant");
+  llvm_unreachable("Unhandled EntityLinkageType variant");
 }
 
 EntityId EntityLinker::resolveEntity(const EntityName &OldName,
@@ -79,8 +79,8 @@ EntityId EntityLinker::resolveEntity(const EntityName 
&OldName,
     // Insertion failure for `None` and `Internal` linkage is a fatal error
     // because these entities have unique namespaces and should never collide.
     // `External` linkage entities may collide.
-    if (Linkage.getLinkage() == EntityLinkage::LinkageType::None ||
-        Linkage.getLinkage() == EntityLinkage::LinkageType::Internal) {
+    if (Linkage.getLinkage() == EntityLinkageType::None ||
+        Linkage.getLinkage() == EntityLinkageType::Internal) {
       ErrorBuilder::fatal(ErrorMessages::EntityAlreadyExistsInLinkageTable,
                           ErrorMessages::EntityLinkerFatalErrorPrefix, NewId,
                           Linkage);
@@ -144,8 +144,8 @@ EntityLinker::merge(TUSummaryEncoding &Summary,
         // Insertion should never fail for `None` and `Internal` linkage
         // entities because these entities will have different namespaces 
across
         // TUs even if their names match.
-        if (Linkage.getLinkage() == EntityLinkage::LinkageType::None ||
-            Linkage.getLinkage() == EntityLinkage::LinkageType::Internal) {
+        if (Linkage.getLinkage() == EntityLinkageType::None ||
+            Linkage.getLinkage() == EntityLinkageType::Internal) {
           ErrorBuilder::fatal(
               ErrorMessages::FailedToInsertEntityIntoOutputSummary,
               ErrorMessages::EntityLinkerFatalErrorPrefix, NewId, Linkage, SN);
diff --git a/clang/lib/Analysis/Scalable/Model/BuildNamespace.cpp 
b/clang/lib/Analysis/Scalable/Model/BuildNamespace.cpp
index bdb2d03b3e7c1..b74ac7dcf80c8 100644
--- a/clang/lib/Analysis/Scalable/Model/BuildNamespace.cpp
+++ b/clang/lib/Analysis/Scalable/Model/BuildNamespace.cpp
@@ -7,30 +7,13 @@
 
//===----------------------------------------------------------------------===//
 
 #include "clang/Analysis/Scalable/Model/BuildNamespace.h"
+#include "../ModelStringConversions.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/Support/ErrorHandling.h"
 #include <tuple>
 
 namespace clang::ssaf {
 
-llvm::StringRef toString(BuildNamespaceKind BNK) {
-  switch (BNK) {
-  case BuildNamespaceKind::CompilationUnit:
-    return "compilation_unit";
-  case BuildNamespaceKind::LinkUnit:
-    return "link_unit";
-  }
-  llvm_unreachable("Unknown BuildNamespaceKind");
-}
-
-std::optional<BuildNamespaceKind> parseBuildNamespaceKind(llvm::StringRef Str) 
{
-  if (Str == "compilation_unit")
-    return BuildNamespaceKind::CompilationUnit;
-  if (Str == "link_unit")
-    return BuildNamespaceKind::LinkUnit;
-  return std::nullopt;
-}
-
 BuildNamespace
 BuildNamespace::makeCompilationUnit(llvm::StringRef CompilationId) {
   return BuildNamespace{BuildNamespaceKind::CompilationUnit,
@@ -71,8 +54,12 @@ bool NestedBuildNamespace::operator<(const 
NestedBuildNamespace &Other) const {
   return Namespaces < Other.Namespaces;
 }
 
+llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, BuildNamespaceKind BNK) {
+  return OS << buildNamespaceKindToString(BNK);
+}
+
 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const BuildNamespace &BN) 
{
-  return OS << "BuildNamespace(" << toString(BN.Kind) << ", " << BN.Name << 
")";
+  return OS << "BuildNamespace(" << BN.Kind << ", " << BN.Name << ")";
 }
 
 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
diff --git a/clang/lib/Analysis/Scalable/Model/EntityLinkage.cpp 
b/clang/lib/Analysis/Scalable/Model/EntityLinkage.cpp
index 16cd78ee84943..d0c0654b5d5f6 100644
--- a/clang/lib/Analysis/Scalable/Model/EntityLinkage.cpp
+++ b/clang/lib/Analysis/Scalable/Model/EntityLinkage.cpp
@@ -7,27 +7,10 @@
 
//===----------------------------------------------------------------------===//
 
 #include "clang/Analysis/Scalable/Model/EntityLinkage.h"
-#include "llvm/Support/ErrorHandling.h"
 
-namespace clang::ssaf {
+#include "../ModelStringConversions.h"
 
-llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
-                              EntityLinkage::LinkageType Linkage) {
-  switch (Linkage) {
-  case EntityLinkage::LinkageType::None:
-    return OS << "None";
-  case EntityLinkage::LinkageType::Internal:
-    return OS << "Internal";
-  case EntityLinkage::LinkageType::External:
-    return OS << "External";
-  }
-  llvm_unreachable("Unhandled EntityLinkage::LinkageType variant");
-}
-
-llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
-                              const EntityLinkage &Linkage) {
-  return OS << "EntityLinkage(" << Linkage.getLinkage() << ")";
-}
+namespace clang::ssaf {
 
 bool EntityLinkage::operator==(const EntityLinkage &Other) const {
   return Linkage == Other.Linkage;
@@ -37,4 +20,14 @@ bool EntityLinkage::operator!=(const EntityLinkage &Other) 
const {
   return !(*this == Other);
 }
 
+llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
+                              EntityLinkageType Linkage) {
+  return OS << entityLinkageTypeToString(Linkage);
+}
+
+llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
+                              const EntityLinkage &Linkage) {
+  return OS << "EntityLinkage(" << Linkage.getLinkage() << ")";
+}
+
 } // namespace clang::ssaf
diff --git a/clang/lib/Analysis/Scalable/ModelStringConversions.h 
b/clang/lib/Analysis/Scalable/ModelStringConversions.h
new file mode 100644
index 0000000000000..7042b08e7198e
--- /dev/null
+++ b/clang/lib/Analysis/Scalable/ModelStringConversions.h
@@ -0,0 +1,87 @@
+//===- ModelStringConversions.h 
-------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Internal string conversion utilities for SSAF model types.
+//
+// These functions are shared by the model .cpp files (for operator<<) and
+// JSONFormat.cpp (for serialization). They are not part of the public API.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_LIB_ANALYSIS_SCALABLE_MODELSTRINGCONVERSIONS_H
+#define CLANG_LIB_ANALYSIS_SCALABLE_MODELSTRINGCONVERSIONS_H
+
+#include "clang/Analysis/Scalable/Model/BuildNamespace.h"
+#include "clang/Analysis/Scalable/Model/EntityLinkage.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/ErrorHandling.h"
+#include <optional>
+
+namespace clang::ssaf {
+
+//===----------------------------------------------------------------------===//
+// BuildNamespaceKind
+//===----------------------------------------------------------------------===//
+
+/// Returns the canonical string representation of \p BNK used for
+/// serialization and display (e.g. "CompilationUnit", "LinkUnit").
+inline llvm::StringRef buildNamespaceKindToString(BuildNamespaceKind BNK) {
+  switch (BNK) {
+  case BuildNamespaceKind::CompilationUnit:
+    return "CompilationUnit";
+  case BuildNamespaceKind::LinkUnit:
+    return "LinkUnit";
+  }
+  llvm_unreachable("Unhandled BuildNamespaceKind variant");
+}
+
+/// Parses a string produced by buildNamespaceKindToString(). Returns
+/// std::nullopt if \p Str does not match any known BuildNamespaceKind value.
+inline std::optional<BuildNamespaceKind>
+buildNamespaceKindFromString(llvm::StringRef Str) {
+  if (Str == "CompilationUnit")
+    return BuildNamespaceKind::CompilationUnit;
+  if (Str == "LinkUnit")
+    return BuildNamespaceKind::LinkUnit;
+  return std::nullopt;
+}
+
+//===----------------------------------------------------------------------===//
+// EntityLinkageType
+//===----------------------------------------------------------------------===//
+
+/// Returns the canonical string representation of \p LT used for
+/// serialization and display (e.g. "None", "Internal", "External").
+inline llvm::StringRef entityLinkageTypeToString(EntityLinkageType LT) {
+  switch (LT) {
+  case EntityLinkageType::None:
+    return "None";
+  case EntityLinkageType::Internal:
+    return "Internal";
+  case EntityLinkageType::External:
+    return "External";
+  }
+  llvm_unreachable("Unhandled EntityLinkageType variant");
+}
+
+/// Parses a string produced by entityLinkageTypeToString(). Returns
+/// std::nullopt if \p Str does not match any known EntityLinkageType value.
+inline std::optional<EntityLinkageType>
+entityLinkageTypeFromString(llvm::StringRef Str) {
+  if (Str == "None")
+    return EntityLinkageType::None;
+  if (Str == "Internal")
+    return EntityLinkageType::Internal;
+  if (Str == "External")
+    return EntityLinkageType::External;
+  return std::nullopt;
+}
+
+} // namespace clang::ssaf
+
+#endif // CLANG_LIB_ANALYSIS_SCALABLE_MODELSTRINGCONVERSIONS_H
diff --git a/clang/lib/Analysis/Scalable/Serialization/JSONFormat.cpp 
b/clang/lib/Analysis/Scalable/Serialization/JSONFormat.cpp
index e2eda695a4eee..02c3b9b51da3e 100644
--- a/clang/lib/Analysis/Scalable/Serialization/JSONFormat.cpp
+++ b/clang/lib/Analysis/Scalable/Serialization/JSONFormat.cpp
@@ -1,6 +1,10 @@
 #include "clang/Analysis/Scalable/Serialization/JSONFormat.h"
+
+#include "../ModelStringConversions.h"
+
 #include "clang/Analysis/Scalable/Model/EntityLinkage.h"
 #include "clang/Analysis/Scalable/Support/ErrorBuilder.h"
+#include "clang/Analysis/Scalable/Support/FormatProviders.h"
 #include "clang/Analysis/Scalable/TUSummary/TUSummary.h"
 
 #include "llvm/ADT/STLExtras.h"
@@ -56,7 +60,7 @@ constexpr const char *ReadingFromFile = "reading {0} from 
file '{1}'";
 constexpr const char *WritingToFile = "writing {0} to file '{1}'";
 
 constexpr const char *FailedInsertionOnDuplication =
-    "failed to insert {0} at index '{1}': encountered duplicate {2} '{3}'";
+    "failed to insert {0} at index '{1}': encountered duplicate '{2}'";
 
 constexpr const char *FailedToReadObject =
     "failed to read {0}: expected JSON {1}";
@@ -66,24 +70,20 @@ constexpr const char *FailedToReadObjectAtIndex =
     "failed to read {0} from index '{1}': expected JSON {2}";
 
 constexpr const char *FailedToDeserializeEntitySummaryNoFormatInfo =
-    "failed to deserialize EntitySummary: no FormatInfo registered for summary 
"
-    "'{0}'";
+    "failed to deserialize EntitySummary: no FormatInfo registered for '{0}'";
 constexpr const char *FailedToSerializeEntitySummaryNoFormatInfo =
-    "failed to serialize EntitySummary: no FormatInfo registered for summary "
-    "'{0}'";
+    "failed to serialize EntitySummary: no FormatInfo registered for '{0}'";
 
 constexpr const char *FailedToDeserializeEntitySummaryMissingData =
-    "failed to deserialize EntitySummary: null EntitySummary data for summary "
-    "'{0}'";
+    "failed to deserialize EntitySummary: null EntitySummary data for '{0}'";
 constexpr const char *FailedToSerializeEntitySummaryMissingData =
-    "JSONFormat - null EntitySummary data for summary '{0}'";
+    "JSONFormat - null EntitySummary data for '{0}'";
 
 constexpr const char *FailedToDeserializeEntitySummaryMismatchedSummaryName =
-    "failed to deserialize EntitySummary: EntitySummary data for summary '{0}' 
"
-    "reports mismatched summary '{1}'";
+    "failed to deserialize EntitySummary: EntitySummary data for '{0}' reports 
"
+    "mismatched '{1}'";
 constexpr const char *FailedToSerializeEntitySummaryMismatchedSummaryName =
-    "JSONFormat - EntitySummary data for summary '{0}' reports mismatched "
-    "summary '{1}'";
+    "JSONFormat - EntitySummary data for '{0}' reports mismatched '{1}'";
 
 constexpr const char *InvalidBuildNamespaceKind =
     "invalid 'kind' BuildNamespaceKind value '{0}'";
@@ -92,12 +92,10 @@ constexpr const char *InvalidEntityLinkageType =
     "invalid 'type' EntityLinkageType value '{0}'";
 
 constexpr const char *FailedToDeserializeLinkageTableExtraId =
-    "failed to deserialize LinkageTable: extra EntityId '{0}' not present in "
-    "IdTable";
+    "failed to deserialize LinkageTable: extra '{0}' not present in IdTable";
 
 constexpr const char *FailedToDeserializeLinkageTableMissingId =
-    "failed to deserialize LinkageTable: missing EntityId '{0}' present in "
-    "IdTable";
+    "failed to deserialize LinkageTable: missing '{0}' present in IdTable";
 
 } // namespace ErrorMessages
 
@@ -239,23 +237,24 @@ uint64_t JSONFormat::entityIdToJSON(EntityId EI) const {
 // BuildNamespaceKind
 //----------------------------------------------------------------------------
 
-llvm::Expected<BuildNamespaceKind> JSONFormat::buildNamespaceKindFromJSON(
-    llvm::StringRef BuildNamespaceKindStr) const {
-  auto OptBuildNamespaceKind = parseBuildNamespaceKind(BuildNamespaceKindStr);
+namespace {
+
+llvm::Expected<BuildNamespaceKind>
+buildNamespaceKindFromJSON(llvm::StringRef BuildNamespaceKindStr) {
+  auto OptBuildNamespaceKind =
+      buildNamespaceKindFromString(BuildNamespaceKindStr);
   if (!OptBuildNamespaceKind) {
     return ErrorBuilder::create(std::errc::invalid_argument,
                                 ErrorMessages::InvalidBuildNamespaceKind,
                                 BuildNamespaceKindStr)
         .build();
   }
-
   return *OptBuildNamespaceKind;
 }
 
-namespace {
-
+// Provided for consistency with respect to rest of the codebase.
 llvm::StringRef buildNamespaceKindToJSON(BuildNamespaceKind BNK) {
-  return toString(BNK);
+  return buildNamespaceKindToString(BNK);
 }
 
 } // namespace
@@ -275,10 +274,11 @@ JSONFormat::buildNamespaceFromJSON(const Object 
&BuildNamespaceObject) const {
   }
 
   auto ExpectedKind = buildNamespaceKindFromJSON(*OptBuildNamespaceKindStr);
-  if (!ExpectedKind)
+  if (!ExpectedKind) {
     return ErrorBuilder::wrap(ExpectedKind.takeError())
         .context(ErrorMessages::ReadingFromField, "BuildNamespaceKind", "kind")
         .build();
+  }
 
   auto OptNameStr = BuildNamespaceObject.getString("name");
   if (!OptNameStr) {
@@ -401,27 +401,21 @@ Object JSONFormat::entityNameToJSON(const EntityName &EN) 
const {
 
 namespace {
 
-std::optional<EntityLinkage::LinkageType>
-parseEntityLinkageType(llvm::StringRef S) {
-  if (S == "none")
-    return EntityLinkage::LinkageType::None;
-  if (S == "internal")
-    return EntityLinkage::LinkageType::Internal;
-  if (S == "external")
-    return EntityLinkage::LinkageType::External;
-  return std::nullopt;
+llvm::Expected<EntityLinkageType>
+entityLinkageTypeFromJSON(llvm::StringRef EntityLinkageTypeStr) {
+  auto OptEntityLinkageType = 
entityLinkageTypeFromString(EntityLinkageTypeStr);
+  if (!OptEntityLinkageType) {
+    return ErrorBuilder::create(std::errc::invalid_argument,
+                                ErrorMessages::InvalidEntityLinkageType,
+                                EntityLinkageTypeStr)
+        .build();
+  }
+  return *OptEntityLinkageType;
 }
 
-llvm::StringRef entityLinkageTypeToJSON(EntityLinkage::LinkageType LT) {
-  switch (LT) {
-  case EntityLinkage::LinkageType::None:
-    return "none";
-  case EntityLinkage::LinkageType::Internal:
-    return "internal";
-  case EntityLinkage::LinkageType::External:
-    return "external";
-  }
-  llvm_unreachable("Unhandled EntityLinkage::LinkageType variant");
+// Provided for consistency with respect to rest of the codebase.
+llvm::StringRef entityLinkageTypeToJSON(EntityLinkageType LT) {
+  return entityLinkageTypeToString(LT);
 }
 
 } // namespace
@@ -440,15 +434,14 @@ JSONFormat::entityLinkageFromJSON(const Object 
&EntityLinkageObject) const {
         .build();
   }
 
-  auto OptLinkageType = parseEntityLinkageType(*OptLinkageStr);
-  if (!OptLinkageType) {
-    return ErrorBuilder::create(std::errc::invalid_argument,
-                                ErrorMessages::InvalidEntityLinkageType,
-                                *OptLinkageStr)
+  auto ExpectedLinkageType = entityLinkageTypeFromJSON(*OptLinkageStr);
+  if (!ExpectedLinkageType) {
+    return ErrorBuilder::wrap(ExpectedLinkageType.takeError())
+        .context(ErrorMessages::ReadingFromField, "EntityLinkageType", "type")
         .build();
   }
 
-  return EntityLinkage(*OptLinkageType);
+  return EntityLinkage(*ExpectedLinkageType);
 }
 
 Object JSONFormat::entityLinkageToJSON(const EntityLinkage &EL) const {
@@ -547,8 +540,8 @@ JSONFormat::entityIdTableFromJSON(const Array 
&EntityIdTableArray) const {
     if (!EntityInserted) {
       return ErrorBuilder::create(std::errc::invalid_argument,
                                   ErrorMessages::FailedInsertionOnDuplication,
-                                  "EntityIdTable entry", Index, "EntityId",
-                                  getIndex(EntityIt->second))
+                                  "EntityIdTable entry", Index,
+                                  EntityIt->second)
           .build();
     }
   }
@@ -663,16 +656,14 @@ JSONFormat::linkageTableFromJSON(const Array 
&LinkageTableArray,
     if (!Inserted) {
       return ErrorBuilder::create(std::errc::invalid_argument,
                                   ErrorMessages::FailedInsertionOnDuplication,
-                                  "LinkageTable entry", Index, "EntityId",
-                                  getIndex(It->first))
+                                  "LinkageTable entry", Index, It->first)
           .build();
     }
 
     if (ExpectedIds.erase(EI) == 0) {
       return ErrorBuilder::create(
                  std::errc::invalid_argument,
-                 ErrorMessages::FailedToDeserializeLinkageTableExtraId,
-                 getIndex(EI))
+                 ErrorMessages::FailedToDeserializeLinkageTableExtraId, EI)
           .context(ErrorMessages::ReadingFromIndex, "LinkageTable entry", 
Index)
           .build();
     }
@@ -682,7 +673,7 @@ JSONFormat::linkageTableFromJSON(const Array 
&LinkageTableArray,
     return ErrorBuilder::create(
                std::errc::invalid_argument,
                ErrorMessages::FailedToDeserializeLinkageTableMissingId,
-               getIndex(*ExpectedIds.begin()))
+               *ExpectedIds.begin())
         .build();
   }
 
@@ -713,8 +704,7 @@ JSONFormat::entitySummaryFromJSON(const SummaryName &SN,
   if (InfoIt == FormatInfos.end()) {
     return ErrorBuilder::create(
                std::errc::invalid_argument,
-               ErrorMessages::FailedToDeserializeEntitySummaryNoFormatInfo,
-               SN.str())
+               ErrorMessages::FailedToDeserializeEntitySummaryNoFormatInfo, SN)
         .build();
   }
 
@@ -732,8 +722,7 @@ JSONFormat::entitySummaryToJSON(const SummaryName &SN,
   if (InfoIt == FormatInfos.end()) {
     return ErrorBuilder::create(
                std::errc::invalid_argument,
-               ErrorMessages::FailedToSerializeEntitySummaryNoFormatInfo,
-               SN.str())
+               ErrorMessages::FailedToSerializeEntitySummaryNoFormatInfo, SN)
         .build();
   }
 
@@ -767,7 +756,8 @@ JSONFormat::entityDataMapEntryFromJSON(const Object 
&EntityDataMapEntryObject,
   if (!OptEntityIdInt) {
     return ErrorBuilder::create(std::errc::invalid_argument,
                                 ErrorMessages::FailedToReadObjectAtField,
-                                "EntityId", "entity_id", "integer")
+                                "EntityId", "entity_id",
+                                "number (unsigned 64-bit integer)")
         .build();
   }
 
@@ -794,8 +784,7 @@ JSONFormat::entityDataMapEntryFromJSON(const Object 
&EntityDataMapEntryObject,
   if (*ExpectedEntitySummary == nullptr) {
     return ErrorBuilder::create(
                std::errc::invalid_argument,
-               ErrorMessages::FailedToDeserializeEntitySummaryMissingData,
-               SN.str())
+               ErrorMessages::FailedToDeserializeEntitySummaryMissingData, SN)
         .build();
   }
 
@@ -805,7 +794,7 @@ JSONFormat::entityDataMapEntryFromJSON(const Object 
&EntityDataMapEntryObject,
                std::errc::invalid_argument,
                ErrorMessages::
                    FailedToDeserializeEntitySummaryMismatchedSummaryName,
-               SN.str(), ActualSN.str())
+               SN, ActualSN)
         .build();
   }
 
@@ -821,14 +810,14 @@ llvm::Expected<Object> 
JSONFormat::entityDataMapEntryToJSON(
 
   if (!EntitySummary) {
     ErrorBuilder::fatal(
-        ErrorMessages::FailedToSerializeEntitySummaryMissingData, SN.str());
+        ErrorMessages::FailedToSerializeEntitySummaryMissingData, SN);
   }
 
   const auto ActualSN = EntitySummary->getSummaryName();
   if (SN != ActualSN) {
     ErrorBuilder::fatal(
-        ErrorMessages::FailedToSerializeEntitySummaryMismatchedSummaryName,
-        SN.str(), ActualSN.str());
+        ErrorMessages::FailedToSerializeEntitySummaryMismatchedSummaryName, SN,
+        ActualSN);
   }
 
   auto ExpectedEntitySummaryObject = entitySummaryToJSON(SN, *EntitySummary);
@@ -880,8 +869,7 @@ JSONFormat::entityDataMapFromJSON(const SummaryName &SN,
     if (!DataInserted) {
       return ErrorBuilder::create(std::errc::invalid_argument,
                                   ErrorMessages::FailedInsertionOnDuplication,
-                                  "EntitySummary entry", Index, "EntityId",
-                                  getIndex(DataIt->first))
+                                  "EntitySummary entry", Index, DataIt->first)
           .build();
     }
   }
@@ -1012,8 +1000,7 @@ JSONFormat::summaryDataMapFromJSON(const Array 
&SummaryDataArray,
     if (!SummaryInserted) {
       return ErrorBuilder::create(std::errc::invalid_argument,
                                   ErrorMessages::FailedInsertionOnDuplication,
-                                  "SummaryData entry", Index, "SummaryName",
-                                  SummaryIt->first.str())
+                                  "SummaryData entry", Index, SummaryIt->first)
           .build();
     }
   }
diff --git a/clang/unittests/Analysis/Scalable/BuildNamespaceTest.cpp 
b/clang/unittests/Analysis/Scalable/BuildNamespaceTest.cpp
index 58b186074df42..383937fe53372 100644
--- a/clang/unittests/Analysis/Scalable/BuildNamespaceTest.cpp
+++ b/clang/unittests/Analysis/Scalable/BuildNamespaceTest.cpp
@@ -7,6 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "clang/Analysis/Scalable/Model/BuildNamespace.h"
+#include "clang/Analysis/Scalable/Support/FormatProviders.h"
+#include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/raw_ostream.h"
 #include "gtest/gtest.h"
 
@@ -29,24 +31,6 @@ TEST(BuildNamespaceTest, DifferentKinds) {
   EXPECT_NE(CU, LU);
 }
 
-TEST(BuildNamespaceTest, ToStringRoundtripCompilationUnit) {
-  auto Kind = BuildNamespaceKind::CompilationUnit;
-  auto Str = toString(Kind);
-  auto Parsed = parseBuildNamespaceKind(Str);
-
-  ASSERT_TRUE(Parsed.has_value());
-  EXPECT_EQ(Kind, *Parsed);
-}
-
-TEST(BuildNamespaceTest, ToStringRoundtripLinkUnit) {
-  auto Kind = BuildNamespaceKind::LinkUnit;
-  auto Str = toString(Kind);
-  auto Parsed = parseBuildNamespaceKind(Str);
-
-  ASSERT_TRUE(Parsed.has_value());
-  EXPECT_EQ(Kind, *Parsed);
-}
-
 // NestedBuildNamespace Tests
 
 TEST(NestedBuildNamespaceTest, DefaultConstruction) {
@@ -94,18 +78,53 @@ TEST(NestedBuildNamespaceTest, EmptyQualified) {
   EXPECT_EQ(Qualified, NBN);
 }
 
+TEST(BuildNamespaceKindTest, FormatProvider) {
+  EXPECT_EQ(llvm::formatv("{0}", BuildNamespaceKind::CompilationUnit).str(),
+            "CompilationUnit");
+  EXPECT_EQ(llvm::formatv("{0}", BuildNamespaceKind::LinkUnit).str(),
+            "LinkUnit");
+}
+
+TEST(BuildNamespaceKindTest, StreamOutputCompilationUnit) {
+  std::string S;
+  llvm::raw_string_ostream(S) << BuildNamespaceKind::CompilationUnit;
+  EXPECT_EQ(S, "CompilationUnit");
+}
+
+TEST(BuildNamespaceKindTest, StreamOutputLinkUnit) {
+  std::string S;
+  llvm::raw_string_ostream(S) << BuildNamespaceKind::LinkUnit;
+  EXPECT_EQ(S, "LinkUnit");
+}
+
+TEST(BuildNamespaceTest, FormatProvider) {
+  EXPECT_EQ(
+      llvm::formatv("{0}", BuildNamespace(BuildNamespaceKind::CompilationUnit,
+                                          "test.cpp"))
+          .str(),
+      "BuildNamespace(CompilationUnit, test.cpp)");
+}
+
+TEST(NestedBuildNamespaceTest, FormatProvider) {
+  NestedBuildNamespace NBN(
+      BuildNamespace(BuildNamespaceKind::CompilationUnit, "test.cpp"));
+  EXPECT_EQ(
+      llvm::formatv("{0}", NBN).str(),
+      "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)])");
+}
+
 TEST(BuildNamespaceTest, StreamOutputCompilationUnit) {
   BuildNamespace BN(BuildNamespaceKind::CompilationUnit, "test.cpp");
   std::string S;
   llvm::raw_string_ostream(S) << BN;
-  EXPECT_EQ(S, "BuildNamespace(compilation_unit, test.cpp)");
+  EXPECT_EQ(S, "BuildNamespace(CompilationUnit, test.cpp)");
 }
 
 TEST(BuildNamespaceTest, StreamOutputLinkUnit) {
   BuildNamespace BN(BuildNamespaceKind::LinkUnit, "app");
   std::string S;
   llvm::raw_string_ostream(S) << BN;
-  EXPECT_EQ(S, "BuildNamespace(link_unit, app)");
+  EXPECT_EQ(S, "BuildNamespace(LinkUnit, app)");
 }
 
 TEST(NestedBuildNamespaceTest, StreamOutputEmpty) {
@@ -121,7 +140,7 @@ TEST(NestedBuildNamespaceTest, StreamOutputSingle) {
   std::string S;
   llvm::raw_string_ostream(S) << NBN;
   EXPECT_EQ(
-      S, "NestedBuildNamespace([BuildNamespace(compilation_unit, test.cpp)])");
+      S, "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)])");
 }
 
 TEST(NestedBuildNamespaceTest, StreamOutputMultiple) {
@@ -131,8 +150,8 @@ TEST(NestedBuildNamespaceTest, StreamOutputMultiple) {
       BuildNamespace(BuildNamespaceKind::LinkUnit, "app")));
   std::string S;
   llvm::raw_string_ostream(S) << NBN;
-  EXPECT_EQ(S, "NestedBuildNamespace([BuildNamespace(compilation_unit, "
-               "test.cpp), BuildNamespace(link_unit, app)])");
+  EXPECT_EQ(S, "NestedBuildNamespace([BuildNamespace(CompilationUnit, "
+               "test.cpp), BuildNamespace(LinkUnit, app)])");
 }
 
 } // namespace
diff --git a/clang/unittests/Analysis/Scalable/CMakeLists.txt 
b/clang/unittests/Analysis/Scalable/CMakeLists.txt
index df98d265a0251..178977872f728 100644
--- a/clang/unittests/Analysis/Scalable/CMakeLists.txt
+++ b/clang/unittests/Analysis/Scalable/CMakeLists.txt
@@ -8,6 +8,7 @@ add_distinct_clang_unittest(ClangScalableAnalysisTests
   EntityLinkerTest.cpp
   EntityNameTest.cpp
   ErrorBuilderTest.cpp
+  ModelStringConversionsTest.cpp
   Registries/FancyAnalysisData.cpp
   Registries/MockSerializationFormat.cpp
   Registries/MockSummaryExtractor1.cpp
@@ -34,3 +35,7 @@ add_distinct_clang_unittest(ClangScalableAnalysisTests
   FrontendOpenMP
   Support
   )
+
+target_include_directories(ClangScalableAnalysisTests PRIVATE
+  ${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/Analysis/Scalable
+  )
diff --git a/clang/unittests/Analysis/Scalable/EntityIdTest.cpp 
b/clang/unittests/Analysis/Scalable/EntityIdTest.cpp
index 2761aaefa8504..36526cc308ccd 100644
--- a/clang/unittests/Analysis/Scalable/EntityIdTest.cpp
+++ b/clang/unittests/Analysis/Scalable/EntityIdTest.cpp
@@ -9,6 +9,8 @@
 #include "clang/Analysis/Scalable/Model/EntityId.h"
 #include "clang/Analysis/Scalable/Model/EntityIdTable.h"
 #include "clang/Analysis/Scalable/Model/EntityName.h"
+#include "clang/Analysis/Scalable/Support/FormatProviders.h"
+#include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/raw_ostream.h"
 #include "gtest/gtest.h"
 #include <cctype>
@@ -68,6 +70,18 @@ TEST(EntityIdTest, Transitivity) {
   EXPECT_TRUE(Ids[0] < Ids[1] && Ids[1] < Ids[2]);
 }
 
+TEST(EntityIdTest, FormatProvider) {
+  EntityIdTable Table;
+  EntityName Entity("c:@F@foo", "", {});
+  EntityId Id = Table.getId(Entity);
+
+  std::string S = llvm::formatv("{0}", Id).str();
+  llvm::StringRef Ref(S);
+  ASSERT_TRUE(Ref.consume_front("EntityId("));
+  ASSERT_TRUE(Ref.consume_back(")"));
+  EXPECT_TRUE(isNonNegativeInteger(Ref));
+}
+
 TEST(EntityIdTest, StreamOutput) {
   EntityIdTable Table;
   EntityName Entity("c:@F@foo", "", {});
diff --git a/clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp 
b/clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp
index 8764b0dcf0bda..74cdb859d72a2 100644
--- a/clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp
+++ b/clang/unittests/Analysis/Scalable/EntityLinkageTest.cpp
@@ -7,16 +7,19 @@
 
//===----------------------------------------------------------------------===//
 
 #include "clang/Analysis/Scalable/Model/EntityLinkage.h"
+#include "clang/Analysis/Scalable/Support/FormatProviders.h"
+#include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/raw_ostream.h"
 #include "gtest/gtest.h"
 
 using clang::ssaf::EntityLinkage;
+using clang::ssaf::EntityLinkageType;
 
 namespace {
 
-constexpr inline auto None = EntityLinkage::LinkageType::None;
-constexpr inline auto Internal = EntityLinkage::LinkageType::Internal;
-constexpr inline auto External = EntityLinkage::LinkageType::External;
+constexpr inline auto None = EntityLinkageType::None;
+constexpr inline auto Internal = EntityLinkageType::Internal;
+constexpr inline auto External = EntityLinkageType::External;
 
 TEST(EntityLinkageTest, Constructor) {
   EntityLinkage NoneLinkage(None);
@@ -58,6 +61,41 @@ TEST(EntityLinkageTest, EqualityOperatorDistinct) {
   EXPECT_NE(EntityLinkage(Internal), EntityLinkage(External));
 }
 
+TEST(EntityLinkageTypeTest, FormatProvider) {
+  EXPECT_EQ(llvm::formatv("{0}", EntityLinkageType::None).str(), "None");
+  EXPECT_EQ(llvm::formatv("{0}", EntityLinkageType::Internal).str(),
+            "Internal");
+  EXPECT_EQ(llvm::formatv("{0}", EntityLinkageType::External).str(),
+            "External");
+}
+
+TEST(EntityLinkageTypeTest, StreamOutputNone) {
+  std::string S;
+  llvm::raw_string_ostream(S) << EntityLinkageType::None;
+  EXPECT_EQ(S, "None");
+}
+
+TEST(EntityLinkageTypeTest, StreamOutputInternal) {
+  std::string S;
+  llvm::raw_string_ostream(S) << EntityLinkageType::Internal;
+  EXPECT_EQ(S, "Internal");
+}
+
+TEST(EntityLinkageTypeTest, StreamOutputExternal) {
+  std::string S;
+  llvm::raw_string_ostream(S) << EntityLinkageType::External;
+  EXPECT_EQ(S, "External");
+}
+
+TEST(EntityLinkageTest, FormatProvider) {
+  EXPECT_EQ(llvm::formatv("{0}", EntityLinkage(None)).str(),
+            "EntityLinkage(None)");
+  EXPECT_EQ(llvm::formatv("{0}", EntityLinkage(Internal)).str(),
+            "EntityLinkage(Internal)");
+  EXPECT_EQ(llvm::formatv("{0}", EntityLinkage(External)).str(),
+            "EntityLinkage(External)");
+}
+
 TEST(EntityLinkageTest, StreamOutputNone) {
   std::string S;
   llvm::raw_string_ostream(S) << EntityLinkage(None);
diff --git a/clang/unittests/Analysis/Scalable/EntityLinkerTest.cpp 
b/clang/unittests/Analysis/Scalable/EntityLinkerTest.cpp
index b228bc5389307..b6d28f701fb6f 100644
--- a/clang/unittests/Analysis/Scalable/EntityLinkerTest.cpp
+++ b/clang/unittests/Analysis/Scalable/EntityLinkerTest.cpp
@@ -57,11 +57,11 @@ size_t MockEntitySummaryEncoding::Index = 0;
 class EntityLinkerTest : public TestFixture {
 protected:
   static constexpr EntityLinkage NoneLinkage =
-      EntityLinkage(EntityLinkage::LinkageType::None);
+      EntityLinkage(EntityLinkageType::None);
   static constexpr EntityLinkage InternalLinkage =
-      EntityLinkage(EntityLinkage::LinkageType::Internal);
+      EntityLinkage(EntityLinkageType::Internal);
   static constexpr EntityLinkage ExternalLinkage =
-      EntityLinkage(EntityLinkage::LinkageType::External);
+      EntityLinkage(EntityLinkageType::External);
 
   void SetUp() override {
     // This ensures that the MockEntitySummary id assignment does not
@@ -628,7 +628,7 @@ TEST_F(EntityLinkerTest, RejectsDuplicateTUSummary) {
   ASSERT_THAT_ERROR(Linker.link(std::move(TU2)),
                     llvm::FailedWithMessage(
                         HasSubstr("failed to link TU summary: duplicate "
-                                  "BuildNamespace(compilation_unit, TU)")));
+                                  "BuildNamespace(CompilationUnit, TU)")));
 }
 
 } // namespace
diff --git a/clang/unittests/Analysis/Scalable/EntityNameTest.cpp 
b/clang/unittests/Analysis/Scalable/EntityNameTest.cpp
index c49b51b248ec6..a1a1f9ea24fda 100644
--- a/clang/unittests/Analysis/Scalable/EntityNameTest.cpp
+++ b/clang/unittests/Analysis/Scalable/EntityNameTest.cpp
@@ -8,6 +8,8 @@
 
 #include "clang/Analysis/Scalable/Model/EntityName.h"
 #include "clang/Analysis/Scalable/Model/BuildNamespace.h"
+#include "clang/Analysis/Scalable/Support/FormatProviders.h"
+#include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/raw_ostream.h"
 #include "gtest/gtest.h"
 
@@ -57,6 +59,16 @@ TEST(EntityNameTest, MakeQualified) {
   EXPECT_NE(Qualified, EN);
 }
 
+TEST(EntityNameTest, FormatProvider) {
+  NestedBuildNamespace NBN(
+      BuildNamespace(BuildNamespaceKind::CompilationUnit, "test.cpp"));
+  EntityName EN("c:@F@foo", "", NBN);
+  EXPECT_EQ(
+      llvm::formatv("{0}", EN).str(),
+      "EntityName(c:@F@foo, , "
+      "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)]))");
+}
+
 TEST(EntityNameTest, StreamOutputNoSuffix) {
   NestedBuildNamespace NBN(
       BuildNamespace(BuildNamespaceKind::CompilationUnit, "test.cpp"));
@@ -65,7 +77,7 @@ TEST(EntityNameTest, StreamOutputNoSuffix) {
   llvm::raw_string_ostream(S) << EN;
   EXPECT_EQ(
       S, "EntityName(c:@F@foo, , "
-         "NestedBuildNamespace([BuildNamespace(compilation_unit, 
test.cpp)]))");
+         "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)]))");
 }
 
 TEST(EntityNameTest, StreamOutputWithSuffix) {
@@ -76,7 +88,7 @@ TEST(EntityNameTest, StreamOutputWithSuffix) {
   llvm::raw_string_ostream(S) << EN;
   EXPECT_EQ(
       S, "EntityName(c:@F@foo, 1, "
-         "NestedBuildNamespace([BuildNamespace(compilation_unit, 
test.cpp)]))");
+         "NestedBuildNamespace([BuildNamespace(CompilationUnit, test.cpp)]))");
 }
 
 } // namespace
diff --git a/clang/unittests/Analysis/Scalable/ModelStringConversionsTest.cpp 
b/clang/unittests/Analysis/Scalable/ModelStringConversionsTest.cpp
new file mode 100644
index 0000000000000..a7d4128020524
--- /dev/null
+++ b/clang/unittests/Analysis/Scalable/ModelStringConversionsTest.cpp
@@ -0,0 +1,100 @@
+//===- ModelStringConversionsTest.cpp 
-------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "ModelStringConversions.h"
+#include "gtest/gtest.h"
+
+using namespace clang::ssaf;
+
+namespace {
+
+//===----------------------------------------------------------------------===//
+// BuildNamespaceKind
+//===----------------------------------------------------------------------===//
+
+TEST(BuildNamespaceKindStringTest, ToStringCompilationUnit) {
+  EXPECT_EQ(buildNamespaceKindToString(BuildNamespaceKind::CompilationUnit),
+            "CompilationUnit");
+}
+
+TEST(BuildNamespaceKindStringTest, ToStringLinkUnit) {
+  EXPECT_EQ(buildNamespaceKindToString(BuildNamespaceKind::LinkUnit),
+            "LinkUnit");
+}
+
+TEST(BuildNamespaceKindStringTest, FromStringCompilationUnit) {
+  EXPECT_EQ(buildNamespaceKindFromString("CompilationUnit"),
+            BuildNamespaceKind::CompilationUnit);
+}
+
+TEST(BuildNamespaceKindStringTest, FromStringLinkUnit) {
+  EXPECT_EQ(buildNamespaceKindFromString("LinkUnit"),
+            BuildNamespaceKind::LinkUnit);
+}
+
+TEST(BuildNamespaceKindStringTest, FromStringUnknown) {
+  EXPECT_EQ(buildNamespaceKindFromString("compilation_unit"), std::nullopt);
+  EXPECT_EQ(buildNamespaceKindFromString("link_unit"), std::nullopt);
+  EXPECT_EQ(buildNamespaceKindFromString(""), std::nullopt);
+  EXPECT_EQ(buildNamespaceKindFromString("unknown"), std::nullopt);
+}
+
+TEST(BuildNamespaceKindStringTest, RoundTrip) {
+  for (auto Kind :
+       {BuildNamespaceKind::CompilationUnit, BuildNamespaceKind::LinkUnit}) {
+    EXPECT_EQ(buildNamespaceKindFromString(buildNamespaceKindToString(Kind)),
+              Kind);
+  }
+}
+
+//===----------------------------------------------------------------------===//
+// EntityLinkageType
+//===----------------------------------------------------------------------===//
+
+TEST(EntityLinkageTypeStringTest, ToStringNone) {
+  EXPECT_EQ(entityLinkageTypeToString(EntityLinkageType::None), "None");
+}
+
+TEST(EntityLinkageTypeStringTest, ToStringInternal) {
+  EXPECT_EQ(entityLinkageTypeToString(EntityLinkageType::Internal), 
"Internal");
+}
+
+TEST(EntityLinkageTypeStringTest, ToStringExternal) {
+  EXPECT_EQ(entityLinkageTypeToString(EntityLinkageType::External), 
"External");
+}
+
+TEST(EntityLinkageTypeStringTest, FromStringNone) {
+  EXPECT_EQ(entityLinkageTypeFromString("None"), EntityLinkageType::None);
+}
+
+TEST(EntityLinkageTypeStringTest, FromStringInternal) {
+  EXPECT_EQ(entityLinkageTypeFromString("Internal"),
+            EntityLinkageType::Internal);
+}
+
+TEST(EntityLinkageTypeStringTest, FromStringExternal) {
+  EXPECT_EQ(entityLinkageTypeFromString("External"),
+            EntityLinkageType::External);
+}
+
+TEST(EntityLinkageTypeStringTest, FromStringUnknown) {
+  EXPECT_EQ(entityLinkageTypeFromString("none"), std::nullopt);
+  EXPECT_EQ(entityLinkageTypeFromString("internal"), std::nullopt);
+  EXPECT_EQ(entityLinkageTypeFromString("external"), std::nullopt);
+  EXPECT_EQ(entityLinkageTypeFromString(""), std::nullopt);
+  EXPECT_EQ(entityLinkageTypeFromString("unknown"), std::nullopt);
+}
+
+TEST(EntityLinkageTypeStringTest, RoundTrip) {
+  for (auto LT : {EntityLinkageType::None, EntityLinkageType::Internal,
+                  EntityLinkageType::External}) {
+    EXPECT_EQ(entityLinkageTypeFromString(entityLinkageTypeToString(LT)), LT);
+  }
+}
+
+} // namespace
diff --git 
a/clang/unittests/Analysis/Scalable/Serialization/JSONFormatTest/TUSummaryTest.cpp
 
b/clang/unittests/Analysis/Scalable/Serialization/JSONFormatTest/TUSummaryTest.cpp
index 3ece18d2f724d..612ca58419a12 100644
--- 
a/clang/unittests/Analysis/Scalable/Serialization/JSONFormatTest/TUSummaryTest.cpp
+++ 
b/clang/unittests/Analysis/Scalable/Serialization/JSONFormatTest/TUSummaryTest.cpp
@@ -586,7 +586,7 @@ TEST_F(JSONFormatTUSummaryTest, NoReadPermission) {
 
   auto ExpectedFilePath = writeJSON(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -635,7 +635,7 @@ TEST_F(JSONFormatTUSummaryTest, NotObject) {
 TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryLinkageMissingType) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -662,7 +662,7 @@ TEST_F(JSONFormatTUSummaryTest, 
LinkageTableEntryLinkageMissingType) {
 TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryLinkageInvalidType) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -692,13 +692,13 @@ TEST_F(JSONFormatTUSummaryTest, 
LinkageTableEntryLinkageInvalidType) {
 TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryMissingId) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
     "linkage_table": [
       {
-        "linkage": { "type": "external" }
+        "linkage": { "type": "External" }
       }
     ],
     "data": []
@@ -717,14 +717,14 @@ TEST_F(JSONFormatTUSummaryTest, 
LinkageTableEntryMissingId) {
 TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryIdNotUInt64) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
     "linkage_table": [
       {
         "id": "not_a_number",
-        "linkage": { "type": "external" }
+        "linkage": { "type": "External" }
       }
     ],
     "data": []
@@ -743,7 +743,7 @@ TEST_F(JSONFormatTUSummaryTest, 
LinkageTableEntryIdNotUInt64) {
 TEST_F(JSONFormatTUSummaryTest, LinkageTableEntryMissingLinkage) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -772,7 +772,7 @@ TEST_F(JSONFormatTUSummaryTest, 
LinkageTableEntryMissingLinkage) {
 TEST_F(JSONFormatTUSummaryTest, LinkageTableNotArray) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -791,7 +791,7 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableNotArray) {
 TEST_F(JSONFormatTUSummaryTest, LinkageTableElementNotObject) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -810,14 +810,14 @@ TEST_F(JSONFormatTUSummaryTest, 
LinkageTableElementNotObject) {
 TEST_F(JSONFormatTUSummaryTest, LinkageTableExtraId) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "external" }
+        "linkage": { "type": "External" }
       }
     ],
     "data": []
@@ -829,13 +829,13 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableExtraId) {
                   HasSubstr("reading LinkageTable from field 'linkage_table'"),
                   HasSubstr("reading LinkageTable entry from index '0'"),
                   HasSubstr("failed to deserialize LinkageTable"),
-                  HasSubstr("extra EntityId '0' not present in IdTable"))));
+                  HasSubstr("extra 'EntityId(0)' not present in IdTable"))));
 }
 
 TEST_F(JSONFormatTUSummaryTest, LinkageTableMissingId) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -846,7 +846,7 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableMissingId) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -862,13 +862,13 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableMissingId) {
                   HasSubstr("reading TUSummary from file"),
                   HasSubstr("reading LinkageTable from field 'linkage_table'"),
                   HasSubstr("failed to deserialize LinkageTable"),
-                  HasSubstr("missing EntityId '0' present in IdTable"))));
+                  HasSubstr("missing 'EntityId(0)' present in IdTable"))));
 }
 
 TEST_F(JSONFormatTUSummaryTest, LinkageTableDuplicateId) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -879,7 +879,7 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableDuplicateId) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -889,11 +889,11 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableDuplicateId) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "external" }
+        "linkage": { "type": "External" }
       },
       {
         "id": 0,
-        "linkage": { "type": "internal" }
+        "linkage": { "type": "Internal" }
       }
     ],
     "data": []
@@ -904,7 +904,7 @@ TEST_F(JSONFormatTUSummaryTest, LinkageTableDuplicateId) {
                   HasSubstr("reading TUSummary from file"),
                   HasSubstr("reading LinkageTable from field 'linkage_table'"),
                   HasSubstr("failed to insert LinkageTable entry at index 
'1'"),
-                  HasSubstr("encountered duplicate EntityId '0'"))));
+                  HasSubstr("encountered duplicate 'EntityId(0)'"))));
 }
 
 // ============================================================================
@@ -958,7 +958,7 @@ TEST_F(JSONFormatTUSummaryTest, MissingKind) {
 TEST_F(JSONFormatTUSummaryTest, MissingName) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit"
+      "kind": "CompilationUnit"
     },
     "id_table": [],
     "linkage_table": [],
@@ -981,7 +981,7 @@ TEST_F(JSONFormatTUSummaryTest, MissingName) {
 TEST_F(JSONFormatTUSummaryTest, NamespaceElementNotObject) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -997,7 +997,7 @@ TEST_F(JSONFormatTUSummaryTest, NamespaceElementNotObject) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "none" }
+        "linkage": { "type": "None" }
       }
     ],
     "data": []
@@ -1018,7 +1018,7 @@ TEST_F(JSONFormatTUSummaryTest, 
NamespaceElementNotObject) {
 TEST_F(JSONFormatTUSummaryTest, NamespaceElementMissingKind) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -1038,7 +1038,7 @@ TEST_F(JSONFormatTUSummaryTest, 
NamespaceElementMissingKind) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "internal" }
+        "linkage": { "type": "Internal" }
       }
     ],
     "data": []
@@ -1060,7 +1060,7 @@ TEST_F(JSONFormatTUSummaryTest, 
NamespaceElementMissingKind) {
 TEST_F(JSONFormatTUSummaryTest, NamespaceElementInvalidKind) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -1081,7 +1081,7 @@ TEST_F(JSONFormatTUSummaryTest, 
NamespaceElementInvalidKind) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "external" }
+        "linkage": { "type": "External" }
       }
     ],
     "data": []
@@ -1104,7 +1104,7 @@ TEST_F(JSONFormatTUSummaryTest, 
NamespaceElementInvalidKind) {
 TEST_F(JSONFormatTUSummaryTest, NamespaceElementMissingName) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -1115,7 +1115,7 @@ TEST_F(JSONFormatTUSummaryTest, 
NamespaceElementMissingName) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit"
+              "kind": "CompilationUnit"
             }
           ]
         }
@@ -1124,7 +1124,7 @@ TEST_F(JSONFormatTUSummaryTest, 
NamespaceElementMissingName) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "none" }
+        "linkage": { "type": "None" }
       }
     ],
     "data": []
@@ -1150,7 +1150,7 @@ TEST_F(JSONFormatTUSummaryTest, 
NamespaceElementMissingName) {
 TEST_F(JSONFormatTUSummaryTest, EntityNameMissingUSR) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -1165,7 +1165,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityNameMissingUSR) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "internal" }
+        "linkage": { "type": "Internal" }
       }
     ],
     "data": []
@@ -1184,7 +1184,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityNameMissingUSR) {
 TEST_F(JSONFormatTUSummaryTest, EntityNameMissingSuffix) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -1199,7 +1199,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityNameMissingSuffix) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "external" }
+        "linkage": { "type": "External" }
       }
     ],
     "data": []
@@ -1218,7 +1218,7 @@ TEST_F(JSONFormatTUSummaryTest, EntityNameMissingSuffix) {
 TEST_F(JSONFormatTUSummaryTest, EntityNameMissingNamespace) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -1233,7 +1233,7 @@ TEST_F(JSONFormatTUSummaryTest, 
EntityNameMissingNamespace) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "none" }
+        "linkage": { "type": "None" }
       }
     ],
     "data": []
@@ -1258,7 +1258,7 @@ TEST_F(JSONFormatTUSummaryTest, 
EntityNameMissingNamespace) {
 TEST_F(JSONFormatTUSummaryTest, IDTableEntryMissingID) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -1287,7 +1287,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableEntryMissingID) {
 TEST_F(JSONFormatTUSummaryTest, IDTableEntryMissingName) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -1298,7 +1298,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableEntryMissingName) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "none" }
+        "linkage": { "type": "None" }
       }
     ],
     "data": []
@@ -1316,7 +1316,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableEntryMissingName) {
 TEST_F(JSONFormatTUSummaryTest, IDTableEntryIDNotUInt64) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -1350,7 +1350,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableEntryIDNotUInt64) {
 TEST_F(JSONFormatTUSummaryTest, IDTableNotArray) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": {},
@@ -1368,7 +1368,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableNotArray) {
 TEST_F(JSONFormatTUSummaryTest, IDTableElementNotObject) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [123],
@@ -1388,7 +1388,7 @@ TEST_F(JSONFormatTUSummaryTest, IDTableElementNotObject) {
 TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -1399,7 +1399,7 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -1412,7 +1412,7 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -1422,11 +1422,11 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "internal" }
+        "linkage": { "type": "Internal" }
       },
       {
         "id": 1,
-        "linkage": { "type": "external" }
+        "linkage": { "type": "External" }
       }
     ],
     "data": []
@@ -1438,7 +1438,7 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) {
           AllOf(HasSubstr("reading TUSummary from file"),
                 HasSubstr("reading IdTable from field 'id_table'"),
                 HasSubstr("failed to insert EntityIdTable entry at index '1'"),
-                HasSubstr("encountered duplicate EntityId '0'"))));
+                HasSubstr("encountered duplicate 'EntityId(0)'"))));
 }
 
 // ============================================================================
@@ -1448,7 +1448,7 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateEntity) {
 TEST_F(JSONFormatTUSummaryTest, ReadEntitySummaryNoFormatInfo) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1476,8 +1476,9 @@ TEST_F(JSONFormatTUSummaryTest, 
ReadEntitySummaryNoFormatInfo) {
           HasSubstr("reading EntitySummary entry from index '0'"),
           HasSubstr("reading EntitySummary from field 'entity_summary'"),
           HasSubstr("failed to deserialize EntitySummary"),
-          HasSubstr("no FormatInfo registered for summary "
-                    "'UnregisteredEntitySummaryForJSONFormatTest'"))));
+          HasSubstr(
+              "no FormatInfo registered for "
+              "'SummaryName(UnregisteredEntitySummaryForJSONFormatTest)'"))));
 }
 
 // ============================================================================
@@ -1488,7 +1489,7 @@ TEST_F(JSONFormatTUSummaryTest,
        PairsEntitySummaryForJSONFormatTestMissingPairsField) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1522,7 +1523,7 @@ TEST_F(JSONFormatTUSummaryTest,
        PairsEntitySummaryForJSONFormatTestInvalidPairsFieldType) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1558,7 +1559,7 @@ TEST_F(JSONFormatTUSummaryTest,
        PairsEntitySummaryForJSONFormatTestPairsElementNotObject) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1594,7 +1595,7 @@ TEST_F(JSONFormatTUSummaryTest,
        PairsEntitySummaryForJSONFormatTestMissingFirstField) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1634,7 +1635,7 @@ TEST_F(JSONFormatTUSummaryTest,
        PairsEntitySummaryForJSONFormatTestInvalidFirstField) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1675,7 +1676,7 @@ TEST_F(JSONFormatTUSummaryTest,
        PairsEntitySummaryForJSONFormatTestMissingSecondField) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1715,7 +1716,7 @@ TEST_F(JSONFormatTUSummaryTest,
        PairsEntitySummaryForJSONFormatTestInvalidSecondField) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1759,7 +1760,7 @@ TEST_F(JSONFormatTUSummaryTest,
 TEST_F(JSONFormatTUSummaryTest, EntityDataMissingEntityID) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1791,7 +1792,7 @@ TEST_F(JSONFormatTUSummaryTest, 
EntityDataMissingEntityID) {
 TEST_F(JSONFormatTUSummaryTest, EntityDataMissingEntitySummary) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1823,7 +1824,7 @@ TEST_F(JSONFormatTUSummaryTest, 
EntityDataMissingEntitySummary) {
 TEST_F(JSONFormatTUSummaryTest, EntityIDNotUInt64) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1850,13 +1851,13 @@ TEST_F(JSONFormatTUSummaryTest, EntityIDNotUInt64) {
           HasSubstr("reading EntitySummary entries from field 'summary_data'"),
           HasSubstr("reading EntitySummary entry from index '0'"),
           HasSubstr("failed to read EntityId from field 'entity_id'"),
-          HasSubstr("expected JSON integer"))));
+          HasSubstr("expected JSON number (unsigned 64-bit integer)"))));
 }
 
 TEST_F(JSONFormatTUSummaryTest, ReadEntitySummaryMissingData) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1883,14 +1884,14 @@ TEST_F(JSONFormatTUSummaryTest, 
ReadEntitySummaryMissingData) {
           HasSubstr("reading EntitySummary entries from field 'summary_data'"),
           HasSubstr("reading EntitySummary entry from index '0'"),
           HasSubstr("failed to deserialize EntitySummary"),
-          HasSubstr("null EntitySummary data for summary "
-                    "'NullEntitySummaryForJSONFormatTest'"))));
+          HasSubstr("null EntitySummary data for "
+                    "'SummaryName(NullEntitySummaryForJSONFormatTest)'"))));
 }
 
 TEST_F(JSONFormatTUSummaryTest, ReadEntitySummaryMismatchedSummaryName) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -1917,10 +1918,12 @@ TEST_F(JSONFormatTUSummaryTest, 
ReadEntitySummaryMismatchedSummaryName) {
           HasSubstr("reading EntitySummary entries from field 'summary_data'"),
           HasSubstr("reading EntitySummary entry from index '0'"),
           HasSubstr("failed to deserialize EntitySummary"),
-          HasSubstr("EntitySummary data for summary "
-                    "'MismatchedEntitySummaryForJSONFormatTest' reports "
-                    "mismatched summary "
-                    "'MismatchedEntitySummaryForJSONFormatTest_WrongName'"))));
+          HasSubstr(
+              "EntitySummary data for "
+              "'SummaryName(MismatchedEntitySummaryForJSONFormatTest)' reports 
"
+              "mismatched "
+              
"'SummaryName(MismatchedEntitySummaryForJSONFormatTest_WrongName)"
+              "'"))));
 }
 
 // ============================================================================
@@ -1941,8 +1944,8 @@ TEST_F(JSONFormatTUSummaryTest, 
WriteEntitySummaryMissingData) {
 
   EXPECT_DEATH(
       { (void)writeTUSummary(Summary, "output.json"); },
-      "JSONFormat - null EntitySummary data for summary "
-      "'NullEntitySummaryForJSONFormatTest'");
+      "JSONFormat - null EntitySummary data for "
+      "'SummaryName\\(NullEntitySummaryForJSONFormatTest\\)'");
 }
 
 TEST_F(JSONFormatTUSummaryTest, WriteEntitySummaryMismatchedSummaryName) {
@@ -1960,10 +1963,10 @@ TEST_F(JSONFormatTUSummaryTest, 
WriteEntitySummaryMismatchedSummaryName) {
 
   EXPECT_DEATH(
       { (void)writeTUSummary(Summary, "output.json"); },
-      "JSONFormat - EntitySummary data for summary "
-      "'MismatchedEntitySummaryForJSONFormatTest' reports "
-      "mismatched summary "
-      "'MismatchedEntitySummaryForJSONFormatTest_WrongName'");
+      "JSONFormat - EntitySummary data for "
+      "'SummaryName\\(MismatchedEntitySummaryForJSONFormatTest\\)' reports "
+      "mismatched "
+      "'SummaryName\\(MismatchedEntitySummaryForJSONFormatTest_WrongName\\)'");
 }
 
 // ============================================================================
@@ -1973,7 +1976,7 @@ TEST_F(JSONFormatTUSummaryTest, 
WriteEntitySummaryMismatchedSummaryName) {
 TEST_F(JSONFormatTUSummaryTest, EntityDataElementNotObject) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -2000,7 +2003,7 @@ TEST_F(JSONFormatTUSummaryTest, 
EntityDataElementNotObject) {
 TEST_F(JSONFormatTUSummaryTest, DuplicateEntityIdInDataMap) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -2017,7 +2020,7 @@ TEST_F(JSONFormatTUSummaryTest, 
DuplicateEntityIdInDataMap) {
       {
         "id": 0,
         "linkage": {
-          "type": "none"
+          "type": "None"
         }
       }
     ],
@@ -2050,7 +2053,7 @@ TEST_F(JSONFormatTUSummaryTest, 
DuplicateEntityIdInDataMap) {
           HasSubstr("reading SummaryData entry from index '0'"),
           HasSubstr("reading EntitySummary entries from field 'summary_data'"),
           HasSubstr("failed to insert EntitySummary entry at index '1'"),
-          HasSubstr("encountered duplicate EntityId '0'"))));
+          HasSubstr("encountered duplicate 'EntityId(0)'"))));
 }
 
 // ============================================================================
@@ -2060,7 +2063,7 @@ TEST_F(JSONFormatTUSummaryTest, 
DuplicateEntityIdInDataMap) {
 TEST_F(JSONFormatTUSummaryTest, DataEntryMissingSummaryName) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -2085,7 +2088,7 @@ TEST_F(JSONFormatTUSummaryTest, 
DataEntryMissingSummaryName) {
 TEST_F(JSONFormatTUSummaryTest, DataEntryMissingData) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -2115,7 +2118,7 @@ TEST_F(JSONFormatTUSummaryTest, DataEntryMissingData) {
 TEST_F(JSONFormatTUSummaryTest, DataNotArray) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -2134,7 +2137,7 @@ TEST_F(JSONFormatTUSummaryTest, DataNotArray) {
 TEST_F(JSONFormatTUSummaryTest, DataElementNotObject) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -2153,7 +2156,7 @@ TEST_F(JSONFormatTUSummaryTest, DataElementNotObject) {
 TEST_F(JSONFormatTUSummaryTest, DuplicateSummaryName) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -2171,12 +2174,13 @@ TEST_F(JSONFormatTUSummaryTest, DuplicateSummaryName) {
   })");
 
   EXPECT_THAT_EXPECTED(
-      Result, FailedWithMessage(AllOf(
-                  HasSubstr("reading TUSummary from file"),
-                  HasSubstr("reading SummaryData entries from field 'data'"),
-                  HasSubstr("failed to insert SummaryData entry at index '1'"),
-                  HasSubstr("encountered duplicate SummaryName "
-                            "'PairsEntitySummaryForJSONFormatTest'"))));
+      Result,
+      FailedWithMessage(AllOf(
+          HasSubstr("reading TUSummary from file"),
+          HasSubstr("reading SummaryData entries from field 'data'"),
+          HasSubstr("failed to insert SummaryData entry at index '1'"),
+          HasSubstr("encountered duplicate "
+                    "'SummaryName(PairsEntitySummaryForJSONFormatTest)'"))));
 }
 
 // ============================================================================
@@ -2201,7 +2205,7 @@ TEST_F(JSONFormatTUSummaryTest, MissingTUNamespace) {
 TEST_F(JSONFormatTUSummaryTest, MissingIDTable) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "data": []
@@ -2217,7 +2221,7 @@ TEST_F(JSONFormatTUSummaryTest, MissingIDTable) {
 TEST_F(JSONFormatTUSummaryTest, MissingLinkageTable) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -2235,7 +2239,7 @@ TEST_F(JSONFormatTUSummaryTest, MissingLinkageTable) {
 TEST_F(JSONFormatTUSummaryTest, MissingData) {
   auto Result = readTUSummaryFromString(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -2355,15 +2359,17 @@ TEST_F(JSONFormatTUSummaryTest, 
WriteEntitySummaryNoFormatInfo) {
 
   EXPECT_THAT_ERROR(
       std::move(Result),
-      FailedWithMessage(
-          AllOf(HasSubstr("writing TUSummary to file"),
-                HasSubstr("writing SummaryData entry to index '0'"),
-                HasSubstr("writing EntitySummary entries to field "
-                          "'summary_data'"),
-                HasSubstr("writing EntitySummary entry to index '0'"),
-                HasSubstr("failed to serialize EntitySummary"),
-                HasSubstr("no FormatInfo registered for summary "
-                          "'UnregisteredEntitySummaryForJSONFormatTest'"))));
+      FailedWithMessage(AllOf(
+          HasSubstr("writing TUSummary to file"),
+          HasSubstr("writing SummaryData entry to index '0'"),
+          HasSubstr("writing EntitySummary entries to field "
+                    "'summary_data'"),
+          HasSubstr("writing EntitySummary entry to index '0'"),
+          HasSubstr("writing EntitySummary to field 'entity_summary'"),
+          HasSubstr("failed to serialize EntitySummary"),
+          HasSubstr(
+              "no FormatInfo registered for "
+              "'SummaryName(UnregisteredEntitySummaryForJSONFormatTest)'"))));
 }
 
 // ============================================================================
@@ -2373,7 +2379,7 @@ TEST_F(JSONFormatTUSummaryTest, 
WriteEntitySummaryNoFormatInfo) {
 TEST_F(JSONFormatTUSummaryTest, RoundTripEmpty) {
   readWriteCompareTUSummary(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -2385,7 +2391,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripEmpty) {
 TEST_F(JSONFormatTUSummaryTest, RoundTripWithTwoSummaryTypes) {
   readWriteCompareTUSummary(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -2396,7 +2402,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripWithTwoSummaryTypes) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -2409,7 +2415,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripWithTwoSummaryTypes) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -2422,7 +2428,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripWithTwoSummaryTypes) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -2435,7 +2441,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripWithTwoSummaryTypes) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -2448,7 +2454,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripWithTwoSummaryTypes) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -2458,23 +2464,23 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripWithTwoSummaryTypes) {
     "linkage_table": [
       {
         "id": 3,
-        "linkage": { "type": "internal" }
+        "linkage": { "type": "Internal" }
       },
       {
         "id": 1,
-        "linkage": { "type": "none" }
+        "linkage": { "type": "None" }
       },
       {
         "id": 4,
-        "linkage": { "type": "external" }
+        "linkage": { "type": "External" }
       },
       {
         "id": 0,
-        "linkage": { "type": "none" }
+        "linkage": { "type": "None" }
       },
       {
         "id": 2,
-        "linkage": { "type": "internal" }
+        "linkage": { "type": "Internal" }
       }
     ],
     "data": [
@@ -2555,7 +2561,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripWithTwoSummaryTypes) {
 TEST_F(JSONFormatTUSummaryTest, RoundTripLinkUnit) {
   readWriteCompareTUSummary(R"({
     "tu_namespace": {
-      "kind": "link_unit",
+      "kind": "LinkUnit",
       "name": "libtest.so"
     },
     "id_table": [],
@@ -2567,7 +2573,7 @@ TEST_F(JSONFormatTUSummaryTest, RoundTripLinkUnit) {
 TEST_F(JSONFormatTUSummaryTest, RoundTripWithEmptyDataEntry) {
   readWriteCompareTUSummary(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [],
@@ -2584,7 +2590,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripWithEmptyDataEntry) {
 TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithNoneLinkage) {
   readWriteCompareTUSummary(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -2595,7 +2601,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithNoneLinkage) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -2605,7 +2611,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithNoneLinkage) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "none" }
+        "linkage": { "type": "None" }
       }
     ],
     "data": []
@@ -2615,7 +2621,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithNoneLinkage) {
 TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithInternalLinkage) {
   readWriteCompareTUSummary(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -2626,7 +2632,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithInternalLinkage) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -2636,7 +2642,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithInternalLinkage) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "internal" }
+        "linkage": { "type": "Internal" }
       }
     ],
     "data": []
@@ -2646,7 +2652,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithInternalLinkage) {
 TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithExternalLinkage) {
   readWriteCompareTUSummary(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -2657,7 +2663,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithExternalLinkage) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -2667,7 +2673,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithExternalLinkage) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "external" }
+        "linkage": { "type": "External" }
       }
     ],
     "data": []
@@ -2677,7 +2683,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithExternalLinkage) {
 TEST_F(JSONFormatTUSummaryTest, RoundTripLinkageTableWithMultipleEntries) {
   readWriteCompareTUSummary(R"({
     "tu_namespace": {
-      "kind": "compilation_unit",
+      "kind": "CompilationUnit",
       "name": "test.cpp"
     },
     "id_table": [
@@ -2688,7 +2694,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithMultipleEntries) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -2701,7 +2707,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithMultipleEntries) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -2714,7 +2720,7 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithMultipleEntries) {
           "suffix": "",
           "namespace": [
             {
-              "kind": "compilation_unit",
+              "kind": "CompilationUnit",
               "name": "test.cpp"
             }
           ]
@@ -2724,15 +2730,15 @@ TEST_F(JSONFormatTUSummaryTest, 
RoundTripLinkageTableWithMultipleEntries) {
     "linkage_table": [
       {
         "id": 0,
-        "linkage": { "type": "none" }
+        "linkage": { "type": "None" }
       },
       {
         "id": 1,
-        "linkage": { "type": "internal" }
+        "linkage": { "type": "Internal" }
       },
       {
         "id": 2,
-        "linkage": { "type": "external" }
+        "linkage": { "type": "External" }
       }
     ],
     "data": []
diff --git a/clang/unittests/Analysis/Scalable/SummaryNameTest.cpp 
b/clang/unittests/Analysis/Scalable/SummaryNameTest.cpp
index d7b52ed6298a9..51fa12d46664c 100644
--- a/clang/unittests/Analysis/Scalable/SummaryNameTest.cpp
+++ b/clang/unittests/Analysis/Scalable/SummaryNameTest.cpp
@@ -7,6 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include "clang/Analysis/Scalable/Model/SummaryName.h"
+#include "clang/Analysis/Scalable/Support/FormatProviders.h"
+#include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/raw_ostream.h"
 #include "gtest/gtest.h"
 
@@ -51,6 +53,11 @@ TEST(SummaryNameTest, Str) {
   EXPECT_EQ(Handle3.str(), "TestAnalysis2");
 }
 
+TEST(SummaryNameTest, FormatProvider) {
+  EXPECT_EQ(llvm::formatv("{0}", SummaryName("MyAnalysis")).str(),
+            "SummaryName(MyAnalysis)");
+}
+
 TEST(SummaryNameTest, StreamOutput) {
   std::string S;
   llvm::raw_string_ostream(S) << SummaryName("MyAnalysis");

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to