Author: Paul Kirth Date: 2026-04-03T11:26:12-07:00 New Revision: 4ad1844304d94bc5d695975214741662fe84d605
URL: https://github.com/llvm/llvm-project/commit/4ad1844304d94bc5d695975214741662fe84d605 DIFF: https://github.com/llvm/llvm-project/commit/4ad1844304d94bc5d695975214741662fe84d605.diff LOG: [clang-doc] Refactor FriendInfo parameters to use ArrayRef (#190047) This also adapts readBlock for the new layouts. Added: Modified: clang-tools-extra/clang-doc/BitcodeReader.cpp clang-tools-extra/clang-doc/BitcodeWriter.cpp clang-tools-extra/clang-doc/JSONGenerator.cpp clang-tools-extra/clang-doc/Representation.h clang-tools-extra/clang-doc/Serialize.cpp Removed: ################################################################################ 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..655a7f6336c1c 100644 --- a/clang-tools-extra/clang-doc/BitcodeWriter.cpp +++ b/clang-tools-extra/clang-doc/BitcodeWriter.cpp @@ -490,9 +490,8 @@ 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) - emitBlock(P); + for (const auto &P : R.Params) + emitBlock(P); if (R.ReturnType) emitBlock(*R.ReturnType); for (const auto &CI : R.Description) 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()); } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
