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
