https://github.com/ilovepi updated 
https://github.com/llvm/llvm-project/pull/190047

>From f721cfbd5a6c296ebae00b6d005fd81e736f30d6 Mon Sep 17 00:00:00 2001
From: Paul Kirth <[email protected]>
Date: Thu, 19 Mar 2026 19:25:06 +0000
Subject: [PATCH 1/2] [clang-doc] Refactor FriendInfo parameters to use
 ArrayRef

This also adapts readBlock for the new layouts.
---
 clang-tools-extra/clang-doc/BitcodeReader.cpp | 52 ++++++++++++++++---
 clang-tools-extra/clang-doc/BitcodeWriter.cpp |  3 +-
 clang-tools-extra/clang-doc/JSONGenerator.cpp |  4 +-
 clang-tools-extra/clang-doc/Representation.h  |  2 +-
 clang-tools-extra/clang-doc/Serialize.cpp     |  3 +-
 5 files changed, 50 insertions(+), 14 deletions(-)

diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp 
b/clang-tools-extra/clang-doc/BitcodeReader.cpp
index 27984cf321b46..74f67032e068f 100644
--- a/clang-tools-extra/clang-doc/BitcodeReader.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp
@@ -620,13 +620,6 @@ template <> llvm::Error addTypeInfo(FunctionInfo *I, 
FieldTypeInfo &&T) {
   return llvm::Error::success();
 }
 
-template <> llvm::Error addTypeInfo(FriendInfo *I, FieldTypeInfo &&T) {
-  if (!I->Params)
-    I->Params.emplace();
-  I->Params->emplace_back(std::move(T));
-  return llvm::Error::success();
-}
-
 template <> llvm::Error addTypeInfo(FriendInfo *I, TypeInfo &&T) {
   I->ReturnType.emplace(std::move(T));
   return llvm::Error::success();
@@ -957,6 +950,51 @@ llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, 
T I) {
   }
 }
 
+template <>
+llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, FriendInfo *I) {
+  llvm::TimeTraceScope("Reducing infos", "readBlock");
+  if (llvm::Error Err = Stream.EnterSubBlock(ID))
+    return Err;
+
+  llvm::SmallVector<FieldTypeInfo, 4> LocalParams;
+
+  while (true) {
+    unsigned BlockOrCode = 0;
+    llvm::Expected<Cursor> C = skipUntilRecordOrBlock(BlockOrCode);
+    if (!C)
+      return C.takeError();
+
+    switch (*C) {
+    case Cursor::BadBlock:
+      return llvm::createStringError(llvm::inconvertibleErrorCode(),
+                                     "bad block found");
+    case Cursor::BlockEnd: {
+      if (!LocalParams.empty())
+        I->Params = allocateArray<FieldTypeInfo>(LocalParams, TransientArena);
+      return llvm::Error::success();
+    }
+    case Cursor::BlockBegin:
+      if (BlockOrCode == BI_FIELD_TYPE_BLOCK_ID) {
+        FieldTypeInfo FI;
+        if (auto Err = readBlock(BlockOrCode, &FI))
+          return Err;
+        LocalParams.push_back(std::move(FI));
+        continue;
+      }
+      if (llvm::Error Err = readSubBlock(BlockOrCode, I)) {
+        if (llvm::Error Skipped = Stream.SkipBlock())
+          return joinErrors(std::move(Err), std::move(Skipped));
+        return Err;
+      }
+      continue;
+    case Cursor::Record:
+      break;
+    }
+    if (auto Err = readRecord(BlockOrCode, I))
+      return Err;
+  }
+}
+
 // TODO: fix inconsistentent returning of errors in add callbacks.
 // Once that's fixed, we only need one handleSubBlock.
 template <typename InfoType, typename T, typename Callback>
diff --git a/clang-tools-extra/clang-doc/BitcodeWriter.cpp 
b/clang-tools-extra/clang-doc/BitcodeWriter.cpp
index 710ae5760162b..780b2beab2e54 100644
--- a/clang-tools-extra/clang-doc/BitcodeWriter.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeWriter.cpp
@@ -490,8 +490,7 @@ void ClangDocBitcodeWriter::emitBlock(const FriendInfo &R) {
   emitRecord(R.IsClass, FRIEND_IS_CLASS);
   if (R.Template)
     emitBlock(*R.Template);
-  if (R.Params)
-    for (const auto &P : *R.Params)
+  for (const auto &P : R.Params)
       emitBlock(P);
   if (R.ReturnType)
     emitBlock(*R.ReturnType);
diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp 
b/clang-tools-extra/clang-doc/JSONGenerator.cpp
index 980dafc2a4ed1..c753da33299af 100644
--- a/clang-tools-extra/clang-doc/JSONGenerator.cpp
+++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp
@@ -655,8 +655,8 @@ void JSONGenerator::serializeInfo(const FriendInfo &I, 
Object &Obj) {
   Obj["IsClass"] = I.IsClass;
   if (I.Template)
     serializeInfo(I.Template.value(), Obj);
-  if (I.Params)
-    serializeArray(I.Params.value(), Obj, "Params", serializeInfoLambda());
+  if (!I.Params.empty())
+    serializeArray(I.Params, Obj, "Params", serializeInfoLambda());
   if (I.ReturnType) {
     auto ReturnTypeObj = Object();
     serializeInfo(I.ReturnType.value(), ReturnTypeObj);
diff --git a/clang-tools-extra/clang-doc/Representation.h 
b/clang-tools-extra/clang-doc/Representation.h
index ada4da64a61fb..c8f3fc946f064 100644
--- a/clang-tools-extra/clang-doc/Representation.h
+++ b/clang-tools-extra/clang-doc/Representation.h
@@ -522,7 +522,7 @@ struct FriendInfo : public SymbolInfo, public 
llvm::ilist_node<FriendInfo> {
   Reference Ref;
   std::optional<TemplateInfo> Template;
   std::optional<TypeInfo> ReturnType;
-  std::optional<SmallVector<FieldTypeInfo, 4>> Params;
+  llvm::ArrayRef<FieldTypeInfo> Params;
   bool IsClass = false;
 };
 
diff --git a/clang-tools-extra/clang-doc/Serialize.cpp 
b/clang-tools-extra/clang-doc/Serialize.cpp
index 023e21dc763b1..cb5c5ef03e197 100644
--- a/clang-tools-extra/clang-doc/Serialize.cpp
+++ b/clang-tools-extra/clang-doc/Serialize.cpp
@@ -1013,8 +1013,7 @@ void Serializer::parseFriends(RecordInfo &RI, const 
CXXRecordDecl *D) {
     if (auto *FuncDecl = dyn_cast_or_null<FunctionDecl>(ActualDecl)) {
       FunctionInfo TempInfo;
       parseParameters(TempInfo, FuncDecl);
-      F.Params.emplace();
-      F.Params = std::move(TempInfo.Params);
+      F.Params = allocateArray<FieldTypeInfo>(TempInfo.Params, TransientArena);
       F.ReturnType = getTypeInfoForType(FuncDecl->getReturnType(),
                                         FuncDecl->getLangOpts());
     }

>From 08ca72f02c30f3d13ee7162c05a1fae92017ef98 Mon Sep 17 00:00:00 2001
From: Paul Kirth <[email protected]>
Date: Fri, 3 Apr 2026 05:50:43 +0000
Subject: [PATCH 2/2] clang-format

---
 clang-tools-extra/clang-doc/BitcodeWriter.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang-tools-extra/clang-doc/BitcodeWriter.cpp 
b/clang-tools-extra/clang-doc/BitcodeWriter.cpp
index 780b2beab2e54..655a7f6336c1c 100644
--- a/clang-tools-extra/clang-doc/BitcodeWriter.cpp
+++ b/clang-tools-extra/clang-doc/BitcodeWriter.cpp
@@ -491,7 +491,7 @@ void ClangDocBitcodeWriter::emitBlock(const FriendInfo &R) {
   if (R.Template)
     emitBlock(*R.Template);
   for (const auto &P : R.Params)
-      emitBlock(P);
+    emitBlock(P);
   if (R.ReturnType)
     emitBlock(*R.ReturnType);
   for (const auto &CI : R.Description)

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

Reply via email to