[llvm-branch-commits] [clang-tools-extra] [clang-doc] Refactor FriendInfo parameters to use ArrayRef (PR #190047)
Paul Kirth via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Apr 2 22:47:52 PDT 2026
https://github.com/ilovepi updated https://github.com/llvm/llvm-project/pull/190047
>From f9f61f55902f4a66f3c317bc76aad4a3fb56af4c Mon Sep 17 00:00:00 2001
From: Paul Kirth <paulkirth at google.com>
Date: Thu, 19 Mar 2026 19:25:06 +0000
Subject: [PATCH] [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());
}
More information about the llvm-branch-commits
mailing list