https://github.com/ilovepi updated https://github.com/llvm/llvm-project/pull/190427
>From ea64c90bb70dbba5e999fb469d0f77c98170f1c9 Mon Sep 17 00:00:00 2001 From: Paul Kirth <[email protected]> Date: Fri, 3 Apr 2026 22:41:52 +0000 Subject: [PATCH] [clang-doc] Removed OwnedPtr alias The alias served a purpose during migration, but now conveys the wrong semantics, as the memory these pointers reference is interned inside a local arena, and doesn't convey any sort of ownership. --- clang-tools-extra/clang-doc/BitcodeReader.cpp | 7 +- clang-tools-extra/clang-doc/BitcodeReader.h | 4 +- clang-tools-extra/clang-doc/Generators.cpp | 2 +- clang-tools-extra/clang-doc/Generators.h | 14 +-- clang-tools-extra/clang-doc/HTMLGenerator.cpp | 14 +-- clang-tools-extra/clang-doc/JSONGenerator.cpp | 16 ++-- clang-tools-extra/clang-doc/MDGenerator.cpp | 11 +-- .../clang-doc/MDMustacheGenerator.cpp | 5 +- clang-tools-extra/clang-doc/Mapper.cpp | 6 +- .../clang-doc/Representation.cpp | 35 ++++---- clang-tools-extra/clang-doc/Representation.h | 25 +----- clang-tools-extra/clang-doc/Serialize.cpp | 78 ++++++++-------- clang-tools-extra/clang-doc/Serialize.h | 89 ++++++++----------- clang-tools-extra/clang-doc/YAMLGenerator.cpp | 12 +-- .../benchmarks/ClangDocBenchmark.cpp | 6 +- .../clang-doc/tool/ClangDocMain.cpp | 13 ++- .../unittests/clang-doc/MergeTest.cpp | 6 +- 17 files changed, 157 insertions(+), 186 deletions(-) diff --git a/clang-tools-extra/clang-doc/BitcodeReader.cpp b/clang-tools-extra/clang-doc/BitcodeReader.cpp index 4d4f3aff20b76..e1f569e31a47c 100644 --- a/clang-tools-extra/clang-doc/BitcodeReader.cpp +++ b/clang-tools-extra/clang-doc/BitcodeReader.cpp @@ -1455,16 +1455,15 @@ llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() { } template <typename T> -llvm::Expected<OwnedPtr<Info>> ClangDocBitcodeReader::createInfo(unsigned ID) { +llvm::Expected<Info *> ClangDocBitcodeReader::createInfo(unsigned ID) { llvm::TimeTraceScope("Reducing infos", "createInfo"); auto *I = doc::allocateTransient<T>(); - if (auto Err = readBlock(ID, static_cast<T *>(getPtr(I)))) + if (auto Err = readBlock(ID, I)) return std::move(Err); return I; } -llvm::Expected<OwnedPtr<Info>> -ClangDocBitcodeReader::readBlockToInfo(unsigned ID) { +llvm::Expected<Info *> ClangDocBitcodeReader::readBlockToInfo(unsigned ID) { llvm::TimeTraceScope("Reducing infos", "readBlockToInfo"); switch (ID) { case BI_NAMESPACE_BLOCK_ID: diff --git a/clang-tools-extra/clang-doc/BitcodeReader.h b/clang-tools-extra/clang-doc/BitcodeReader.h index 318b9e77d46a3..9025a7aa8b892 100644 --- a/clang-tools-extra/clang-doc/BitcodeReader.h +++ b/clang-tools-extra/clang-doc/BitcodeReader.h @@ -78,14 +78,14 @@ class ClangDocBitcodeReader { template <typename T> llvm::Error readRecord(unsigned ID, T I); // Allocate the relevant type of info and add read data to the object. - template <typename T> llvm::Expected<OwnedPtr<Info>> createInfo(unsigned ID); + template <typename T> llvm::Expected<Info *> createInfo(unsigned ID); // Helper function to step through blocks to find and dispatch the next record // or block to be read. llvm::Expected<Cursor> skipUntilRecordOrBlock(unsigned &BlockOrRecordID); // Helper function to set up the appropriate type of Info. - llvm::Expected<OwnedPtr<Info>> readBlockToInfo(unsigned ID); + llvm::Expected<Info *> readBlockToInfo(unsigned ID); template <typename InfoType, typename T, typename CallbackFunction> llvm::Error handleSubBlock(unsigned ID, T Parent, CallbackFunction Function); diff --git a/clang-tools-extra/clang-doc/Generators.cpp b/clang-tools-extra/clang-doc/Generators.cpp index 854f09b9b4a82..5ff1a5c0a4eb2 100644 --- a/clang-tools-extra/clang-doc/Generators.cpp +++ b/clang-tools-extra/clang-doc/Generators.cpp @@ -66,7 +66,7 @@ Error MustacheGenerator::setupTemplate( } Error MustacheGenerator::generateDocumentation( - StringRef RootDir, StringMap<doc::OwnedPtr<doc::Info>> Infos, + StringRef RootDir, StringMap<doc::Info *> Infos, const clang::doc::ClangDocContext &CDCtx, std::string DirName) { { llvm::TimeTraceScope TS("Setup Templates"); diff --git a/clang-tools-extra/clang-doc/Generators.h b/clang-tools-extra/clang-doc/Generators.h index 8562e3dfa99d8..fc7fdb515ee4f 100644 --- a/clang-tools-extra/clang-doc/Generators.h +++ b/clang-tools-extra/clang-doc/Generators.h @@ -29,9 +29,10 @@ class Generator { // Write out the decl info for the objects in the given map in the specified // format. - virtual llvm::Error generateDocumentation( - StringRef RootDir, llvm::StringMap<doc::OwnedPtr<doc::Info>> Infos, - const ClangDocContext &CDCtx, std::string DirName = "") = 0; + virtual llvm::Error generateDocumentation(StringRef RootDir, + llvm::StringMap<doc::Info *> Infos, + const ClangDocContext &CDCtx, + std::string DirName = "") = 0; // This function writes a file with the index previously constructed. // It can be overwritten by any of the inherited generators. @@ -131,9 +132,10 @@ struct MustacheGenerator : public Generator { /// 3. Iterates over the JSON files, recreates the directory structure from /// JSON, and calls generateDocForJSON for each file. /// 4. A file of the desired format is created. - llvm::Error generateDocumentation( - StringRef RootDir, llvm::StringMap<doc::OwnedPtr<doc::Info>> Infos, - const clang::doc::ClangDocContext &CDCtx, std::string DirName) override; + llvm::Error generateDocumentation(StringRef RootDir, + llvm::StringMap<doc::Info *> Infos, + const clang::doc::ClangDocContext &CDCtx, + std::string DirName) override; }; // This anchor is used to force the linker to link in the generated object file diff --git a/clang-tools-extra/clang-doc/HTMLGenerator.cpp b/clang-tools-extra/clang-doc/HTMLGenerator.cpp index 4cab14c2ce200..438c2c6986cba 100644 --- a/clang-tools-extra/clang-doc/HTMLGenerator.cpp +++ b/clang-tools-extra/clang-doc/HTMLGenerator.cpp @@ -44,9 +44,10 @@ class HTMLGenerator : public MustacheGenerator { // Populates templates with CSS stylesheets, JS scripts paths. Error setupTemplateResources(const ClangDocContext &CDCtx, json::Value &V, SmallString<128> RelativeRootPath); - llvm::Error generateDocumentation( - StringRef RootDir, llvm::StringMap<doc::OwnedPtr<doc::Info>> Infos, - const ClangDocContext &CDCtx, std::string DirName) override; + llvm::Error generateDocumentation(StringRef RootDir, + llvm::StringMap<doc::Info *> Infos, + const ClangDocContext &CDCtx, + std::string DirName) override; }; Error HTMLGenerator::setupTemplateFiles(const ClangDocContext &CDCtx) { @@ -182,9 +183,10 @@ Error HTMLGenerator::createResources(ClangDocContext &CDCtx) { return Error::success(); } -Error HTMLGenerator::generateDocumentation( - StringRef RootDir, llvm::StringMap<doc::OwnedPtr<doc::Info>> Infos, - const ClangDocContext &CDCtx, std::string DirName) { +Error HTMLGenerator::generateDocumentation(StringRef RootDir, + llvm::StringMap<doc::Info *> Infos, + const ClangDocContext &CDCtx, + std::string DirName) { return MustacheGenerator::generateDocumentation(RootDir, std::move(Infos), CDCtx, "html"); } diff --git a/clang-tools-extra/clang-doc/JSONGenerator.cpp b/clang-tools-extra/clang-doc/JSONGenerator.cpp index 0dfe85abc8382..355502726ee75 100644 --- a/clang-tools-extra/clang-doc/JSONGenerator.cpp +++ b/clang-tools-extra/clang-doc/JSONGenerator.cpp @@ -27,7 +27,7 @@ class JSONGenerator : public Generator { void serializeCommonChildren( const ScopeChildren &Children, json::Object &Obj, std::optional<ReferenceFunc> MDReferenceLambda = std::nullopt); - void serializeContexts(Info *I, llvm::StringMap<OwnedPtr<Info>> &Infos); + void serializeContexts(Info *I, llvm::StringMap<Info *> &Infos); void serializeInfo(const ConstraintInfo &I, Object &Obj); void serializeInfo(const TemplateInfo &Template, Object &Obj); void serializeInfo(const ConceptInfo &I, Object &Obj); @@ -70,7 +70,7 @@ class JSONGenerator : public Generator { static const char *Format; Error generateDocumentation(StringRef RootDir, - llvm::StringMap<OwnedPtr<doc::Info>> Infos, + llvm::StringMap<doc::Info *> Infos, const ClangDocContext &CDCtx, std::string DirName) override; Error createResources(ClangDocContext &CDCtx) override; @@ -920,8 +920,7 @@ Error JSONGenerator::serializeIndex(StringRef RootDir) { return Error::success(); } -void JSONGenerator::serializeContexts(Info *I, - StringMap<OwnedPtr<Info>> &Infos) { +void JSONGenerator::serializeContexts(Info *I, StringMap<Info *> &Infos) { if (I->USR == GlobalNamespaceID) return; auto ParentUSR = I->ParentUSR; @@ -949,14 +948,15 @@ void JSONGenerator::serializeContexts(Info *I, } } -Error JSONGenerator::generateDocumentation( - StringRef RootDir, llvm::StringMap<doc::OwnedPtr<doc::Info>> Infos, - const ClangDocContext &CDCtx, std::string DirName) { +Error JSONGenerator::generateDocumentation(StringRef RootDir, + llvm::StringMap<doc::Info *> Infos, + const ClangDocContext &CDCtx, + std::string DirName) { this->CDCtx = &CDCtx; StringSet<> CreatedDirs; StringMap<std::vector<doc::Info *>> FileToInfos; for (const auto &Group : Infos) { - Info *Info = getPtr(Group.getValue()); + Info *Info = Group.getValue(); SmallString<128> Path; auto RootDirStr = RootDir.str() + "/json"; diff --git a/clang-tools-extra/clang-doc/MDGenerator.cpp b/clang-tools-extra/clang-doc/MDGenerator.cpp index f7db4c01abecf..df1ca6b868d43 100644 --- a/clang-tools-extra/clang-doc/MDGenerator.cpp +++ b/clang-tools-extra/clang-doc/MDGenerator.cpp @@ -500,9 +500,10 @@ class MDGenerator : public Generator { public: static const char *Format; - llvm::Error generateDocumentation( - StringRef RootDir, llvm::StringMap<doc::OwnedPtr<doc::Info>> Infos, - const ClangDocContext &CDCtx, std::string DirName) override; + llvm::Error generateDocumentation(StringRef RootDir, + llvm::StringMap<doc::Info *> Infos, + const ClangDocContext &CDCtx, + std::string DirName) override; llvm::Error createResources(ClangDocContext &CDCtx) override; llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS, const ClangDocContext &CDCtx) override; @@ -511,7 +512,7 @@ class MDGenerator : public Generator { const char *MDGenerator::Format = "md"; llvm::Error MDGenerator::generateDocumentation( - StringRef RootDir, llvm::StringMap<doc::OwnedPtr<doc::Info>> Infos, + StringRef RootDir, llvm::StringMap<doc::Info *> Infos, const ClangDocContext &CDCtx, std::string DirName) { // Track which directories we already tried to create. llvm::StringSet<> CreatedDirs; @@ -519,7 +520,7 @@ llvm::Error MDGenerator::generateDocumentation( // Collect all output by file name and create the necessary directories. llvm::StringMap<std::vector<doc::Info *>> FileToInfos; for (const auto &Group : Infos) { - doc::Info *Info = getPtr(Group.getValue()); + doc::Info *Info = Group.getValue(); llvm::SmallString<128> Path; llvm::sys::path::native(RootDir, Path); diff --git a/clang-tools-extra/clang-doc/MDMustacheGenerator.cpp b/clang-tools-extra/clang-doc/MDMustacheGenerator.cpp index ef7c605d988c1..f9bf66720c77c 100644 --- a/clang-tools-extra/clang-doc/MDMustacheGenerator.cpp +++ b/clang-tools-extra/clang-doc/MDMustacheGenerator.cpp @@ -26,8 +26,7 @@ static std::unique_ptr<MustacheTemplateFile> IndexTemplate = nullptr; struct MDMustacheGenerator : public MustacheGenerator { static const char *Format; - Error generateDocumentation(StringRef RootDir, - StringMap<doc::OwnedPtr<doc::Info>> Infos, + Error generateDocumentation(StringRef RootDir, StringMap<doc::Info *> Infos, const ClangDocContext &CDCtx, std::string DirName) override; Error setupTemplateFiles(const ClangDocContext &CDCtx) override; @@ -72,7 +71,7 @@ Error MDMustacheGenerator::setupTemplateFiles(const ClangDocContext &CDCtx) { } Error MDMustacheGenerator::generateDocumentation( - StringRef RootDir, StringMap<doc::OwnedPtr<doc::Info>> Infos, + StringRef RootDir, StringMap<doc::Info *> Infos, const clang::doc::ClangDocContext &CDCtx, std::string Dirname) { return MustacheGenerator::generateDocumentation(RootDir, std::move(Infos), CDCtx, "md"); diff --git a/clang-tools-extra/clang-doc/Mapper.cpp b/clang-tools-extra/clang-doc/Mapper.cpp index 499ab5638b34e..824c51e614eef 100644 --- a/clang-tools-extra/clang-doc/Mapper.cpp +++ b/clang-tools-extra/clang-doc/Mapper.cpp @@ -65,7 +65,7 @@ bool MapASTVisitor::mapDecl(const T *D, bool IsDefinition) { return true; } - std::pair<OwnedPtr<Info>, OwnedPtr<Info>> CP; + std::pair<Info *, Info *> CP; { llvm::TimeTraceScope TS("emit info from astnode"); @@ -99,10 +99,10 @@ bool MapASTVisitor::mapDecl(const T *D, bool IsDefinition) { // this decl for some reason (e.g. we're only reporting public decls). if (Child) CDCtx.ECtx->reportResult(llvm::toHex(llvm::toStringRef(Child->USR)), - serialize::serialize(Child, CDCtx.Diags)); + serialize::serialize(*Child, CDCtx.Diags)); if (Parent) CDCtx.ECtx->reportResult(llvm::toHex(llvm::toStringRef(Parent->USR)), - serialize::serialize(Parent, CDCtx.Diags)); + serialize::serialize(*Parent, CDCtx.Diags)); } return true; } diff --git a/clang-tools-extra/clang-doc/Representation.cpp b/clang-tools-extra/clang-doc/Representation.cpp index c59e3b875645d..1f67de639bbc8 100644 --- a/clang-tools-extra/clang-doc/Representation.cpp +++ b/clang-tools-extra/clang-doc/Representation.cpp @@ -172,8 +172,7 @@ void mergeUnkeyed<CommentInfo>(DocList<CommentInfo> &Target, } } -llvm::Error mergeSingleInfo(doc::OwnedPtr<doc::Info> &Reduced, - doc::OwnedPtr<doc::Info> &&NewInfo, +llvm::Error mergeSingleInfo(doc::Info *&Reduced, doc::Info *NewInfo, llvm::BumpPtrAllocator &Arena) { if (!Reduced) { switch (NewInfo->IT) { @@ -213,36 +212,36 @@ llvm::Error mergeSingleInfo(doc::OwnedPtr<doc::Info> &Reduced, switch (Reduced->IT) { case InfoType::IT_namespace: - static_cast<NamespaceInfo *>(getPtr(Reduced)) - ->merge(std::move(*static_cast<NamespaceInfo *>(getPtr(NewInfo)))); + static_cast<NamespaceInfo *>(Reduced)->merge( + std::move(*static_cast<NamespaceInfo *>(NewInfo))); break; case InfoType::IT_record: - static_cast<RecordInfo *>(getPtr(Reduced)) - ->merge(std::move(*static_cast<RecordInfo *>(getPtr(NewInfo)))); + static_cast<RecordInfo *>(Reduced)->merge( + std::move(*static_cast<RecordInfo *>(NewInfo))); break; case InfoType::IT_enum: - static_cast<EnumInfo *>(getPtr(Reduced)) - ->merge(std::move(*static_cast<EnumInfo *>(getPtr(NewInfo)))); + static_cast<EnumInfo *>(Reduced)->merge( + std::move(*static_cast<EnumInfo *>(NewInfo))); break; case InfoType::IT_function: - static_cast<FunctionInfo *>(getPtr(Reduced)) - ->merge(std::move(*static_cast<FunctionInfo *>(getPtr(NewInfo)))); + static_cast<FunctionInfo *>(Reduced)->merge( + std::move(*static_cast<FunctionInfo *>(NewInfo))); break; case InfoType::IT_typedef: - static_cast<TypedefInfo *>(getPtr(Reduced)) - ->merge(std::move(*static_cast<TypedefInfo *>(getPtr(NewInfo)))); + static_cast<TypedefInfo *>(Reduced)->merge( + std::move(*static_cast<TypedefInfo *>(NewInfo))); break; case InfoType::IT_concept: - static_cast<ConceptInfo *>(getPtr(Reduced)) - ->merge(std::move(*static_cast<ConceptInfo *>(getPtr(NewInfo)))); + static_cast<ConceptInfo *>(Reduced)->merge( + std::move(*static_cast<ConceptInfo *>(NewInfo))); break; case InfoType::IT_variable: - static_cast<VarInfo *>(getPtr(Reduced)) - ->merge(std::move(*static_cast<VarInfo *>(getPtr(NewInfo)))); + static_cast<VarInfo *>(Reduced)->merge( + std::move(*static_cast<VarInfo *>(NewInfo))); break; case InfoType::IT_friend: - static_cast<FriendInfo *>(getPtr(Reduced)) - ->merge(std::move(*static_cast<FriendInfo *>(getPtr(NewInfo)))); + static_cast<FriendInfo *>(Reduced)->merge( + std::move(*static_cast<FriendInfo *>(NewInfo))); break; default: return llvm::createStringError(llvm::inconvertibleErrorCode(), diff --git a/clang-tools-extra/clang-doc/Representation.h b/clang-tools-extra/clang-doc/Representation.h index 532554443de14..cde30daad97d2 100644 --- a/clang-tools-extra/clang-doc/Representation.h +++ b/clang-tools-extra/clang-doc/Representation.h @@ -104,20 +104,14 @@ llvm::ArrayRef<T> deepCopyArray(llvm::ArrayRef<T> V, return llvm::ArrayRef<T>(Allocated, V.size()); } -// An abstraction for owned pointers. Initially mapped to OwnedPtr, -// to be eventually transitioned to bare pointers in an arena. -template <typename T> using OwnedPtr = T *; - // A helper function to create an owned pointer, abstracting away the memory // allocation mechanism. -template <typename T, typename... Args> -OwnedPtr<T> allocateTransient(Args &&...args) { +template <typename T, typename... Args> T *allocateTransient(Args &&...args) { return new (TransientArena.Allocate<T>()) T(std::forward<Args>(args)...); } // A helper function to create memory allocated in the TransientArena. -template <typename T, typename... Args> -OwnedPtr<T> allocatePersistent(Args &&...args) { +template <typename T, typename... Args> T *allocatePersistent(Args &&...args) { return new (PersistentArena.Allocate<T>()) T(std::forward<Args>(args)...); } @@ -127,10 +121,6 @@ T *allocatePtr(llvm::BumpPtrAllocator &Alloc, Args &&...args) { return new (Alloc.Allocate<T>()) T(std::forward<Args>(args)...); } -// A helper function to access the underlying pointer from an owned pointer, -// abstracting away the pointer dereferencing mechanism. -template <typename T> T *getPtr(const OwnedPtr<T> &O) { return O; } - template <typename T> struct InfoNode : public llvm::ilist_node<InfoNode<T>> { InfoNode(T *P) : Ptr(P) {} T *Ptr = nullptr; @@ -191,14 +181,6 @@ template <typename T> InfoNode<T> *allocateListNodePersistent(T *Item) { // To be eventually transitioned to llvm::simple_ilist. template <typename T> using DocList = llvm::simple_ilist<InfoNode<T>>; -// An abstraction for dynamic lists of owned pointers. -// To be eventually transitioned to llvm::simple_ilist<T*> or similar. -template <typename T> using OwningPtrVec = std::vector<OwnedPtr<T>>; - -// An abstraction for arrays of owned pointers. -// To be eventually transitioned to arena-allocated arrays of bare pointers. -template <typename T> using OwningPtrArray = std::vector<OwnedPtr<T>>; - // SHA1'd hash of a USR. using SymbolID = std::array<uint8_t, 20>; @@ -837,8 +819,7 @@ llvm::Expected<Info *> mergeInfos(SmallVectorImpl<Info *> &Values); // Merges a single new Info into an existing Reduced Info (allocating it if // needed). -llvm::Error mergeSingleInfo(doc::OwnedPtr<doc::Info> &Reduced, - doc::OwnedPtr<doc::Info> &&NewInfo, +llvm::Error mergeSingleInfo(doc::Info *&Reduced, doc::Info *NewInfo, llvm::BumpPtrAllocator &Arena); struct ClangDocContext { diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp index d27381ddca0f5..818ecd478c21b 100644 --- a/clang-tools-extra/clang-doc/Serialize.cpp +++ b/clang-tools-extra/clang-doc/Serialize.cpp @@ -354,7 +354,7 @@ StringRef Serializer::getSourceCode(const Decl *D, const SourceRange &R) { } template <typename T> -static std::string serialize(T &I, DiagnosticsEngine &Diags) { +static std::string serialize(const T &I, DiagnosticsEngine &Diags) { SmallString<2048> Buffer; llvm::BitstreamWriter Stream(Buffer); ClangDocBitcodeWriter Writer(Stream, Diags); @@ -362,20 +362,20 @@ static std::string serialize(T &I, DiagnosticsEngine &Diags) { return Buffer.str().str(); } -std::string serialize(OwnedPtr<Info> &I, DiagnosticsEngine &Diags) { - switch (I->IT) { +std::string serialize(const Info &I, DiagnosticsEngine &Diags) { + switch (I.IT) { case InfoType::IT_namespace: - return serialize(*static_cast<NamespaceInfo *>(getPtr(I)), Diags); + return serialize(static_cast<const NamespaceInfo &>(I), Diags); case InfoType::IT_record: - return serialize(*static_cast<RecordInfo *>(getPtr(I)), Diags); + return serialize(static_cast<const RecordInfo &>(I), Diags); case InfoType::IT_enum: - return serialize(*static_cast<EnumInfo *>(getPtr(I)), Diags); + return serialize(static_cast<const EnumInfo &>(I), Diags); case InfoType::IT_function: - return serialize(*static_cast<FunctionInfo *>(getPtr(I)), Diags); + return serialize(static_cast<const FunctionInfo &>(I), Diags); case InfoType::IT_concept: - return serialize(*static_cast<ConceptInfo *>(getPtr(I)), Diags); + return serialize(static_cast<const ConceptInfo &>(I), Diags); case InfoType::IT_variable: - return serialize(*static_cast<VarInfo *>(getPtr(I)), Diags); + return serialize(static_cast<const VarInfo &>(I), Diags); case InfoType::IT_friend: case InfoType::IT_typedef: case InfoType::IT_default: @@ -506,7 +506,7 @@ void Serializer::InsertChild(ScopeChildren &Scope, VarInfo &Info) { // parameter. Since each variant is used once, it's not worth having a more // elaborate system to automatically deduce this information. template <typename ChildType> -OwnedPtr<Info> Serializer::makeAndInsertIntoParent(ChildType &Child) { +Info *Serializer::makeAndInsertIntoParent(ChildType &Child) { if (Child.Namespace.empty()) { // Insert into unnamed parent namespace. auto *ParentNS = allocateTransient<NamespaceInfo>(); @@ -1005,9 +1005,9 @@ void Serializer::parseBases(llvm::SmallVectorImpl<BaseRecordInfo> &Bases, } } -std::pair<OwnedPtr<Info>, OwnedPtr<Info>> -Serializer::emitInfo(const NamespaceDecl *D, const FullComment *FC, - Location Loc, bool PublicOnly) { +std::pair<Info *, Info *> Serializer::emitInfo(const NamespaceDecl *D, + const FullComment *FC, + Location Loc, bool PublicOnly) { auto *NSI = allocateTransient<NamespaceInfo>(); bool IsInAnonymousNamespace = false; populateInfo(*NSI, D, FC, IsInAnonymousNamespace); @@ -1017,7 +1017,7 @@ Serializer::emitInfo(const NamespaceDecl *D, const FullComment *FC, NSI->Name = D->isAnonymousNamespace() ? "@nonymous_namespace" : NSI->Name; NSI->Path = getInfoRelativePath(NSI->Namespace); if (NSI->Namespace.empty() && NSI->USR == SymbolID()) - return {OwnedPtr<Info>{std::move(NSI)}, nullptr}; + return {NSI, nullptr}; // Namespaces are inserted into the parent by reference, so we need to return // both the parent and the record itself. @@ -1080,9 +1080,9 @@ void Serializer::parseFriends(RecordInfo &RI, const CXXRecordDecl *D) { RI.Friends = allocateArray<FriendInfo>(LocalFriends, TransientArena); } -std::pair<OwnedPtr<Info>, OwnedPtr<Info>> -Serializer::emitInfo(const RecordDecl *D, const FullComment *FC, Location Loc, - bool PublicOnly) { +std::pair<Info *, Info *> Serializer::emitInfo(const RecordDecl *D, + const FullComment *FC, + Location Loc, bool PublicOnly) { auto *RI = allocateTransient<RecordInfo>(); bool IsInAnonymousNamespace = false; @@ -1164,9 +1164,9 @@ Serializer::emitInfo(const RecordDecl *D, const FullComment *FC, Location Loc, return {std::move(RI), std::move(Parent)}; } -std::pair<OwnedPtr<Info>, OwnedPtr<Info>> -Serializer::emitInfo(const FunctionDecl *D, const FullComment *FC, Location Loc, - bool PublicOnly) { +std::pair<Info *, Info *> Serializer::emitInfo(const FunctionDecl *D, + const FullComment *FC, + Location Loc, bool PublicOnly) { FunctionInfo *Func = allocateTransient<FunctionInfo>(); bool IsInAnonymousNamespace = false; populateFunctionInfo(*Func, D, FC, Loc, IsInAnonymousNamespace); @@ -1178,9 +1178,9 @@ Serializer::emitInfo(const FunctionDecl *D, const FullComment *FC, Location Loc, return {nullptr, makeAndInsertIntoParent(*Func)}; } -std::pair<OwnedPtr<Info>, OwnedPtr<Info>> -Serializer::emitInfo(const CXXMethodDecl *D, const FullComment *FC, - Location Loc, bool PublicOnly) { +std::pair<Info *, Info *> Serializer::emitInfo(const CXXMethodDecl *D, + const FullComment *FC, + Location Loc, bool PublicOnly) { FunctionInfo *Func = allocateTransient<FunctionInfo>(); bool IsInAnonymousNamespace = false; populateFunctionInfo(*Func, D, FC, Loc, IsInAnonymousNamespace); @@ -1222,9 +1222,9 @@ void Serializer::extractCommentFromDecl(const Decl *D, TypedefInfo &Info) { } } -std::pair<OwnedPtr<Info>, OwnedPtr<Info>> -Serializer::emitInfo(const TypedefDecl *D, const FullComment *FC, Location Loc, - bool PublicOnly) { +std::pair<Info *, Info *> Serializer::emitInfo(const TypedefDecl *D, + const FullComment *FC, + Location Loc, bool PublicOnly) { TypedefInfo *Info = allocateTransient<TypedefInfo>(); bool IsInAnonymousNamespace = false; populateInfo(*Info, D, FC, IsInAnonymousNamespace); @@ -1254,9 +1254,9 @@ Serializer::emitInfo(const TypedefDecl *D, const FullComment *FC, Location Loc, // A type alias is a C++ "using" declaration for a type. It gets mapped to a // TypedefInfo with the IsUsing flag set. -std::pair<OwnedPtr<Info>, OwnedPtr<Info>> -Serializer::emitInfo(const TypeAliasDecl *D, const FullComment *FC, - Location Loc, bool PublicOnly) { +std::pair<Info *, Info *> Serializer::emitInfo(const TypeAliasDecl *D, + const FullComment *FC, + Location Loc, bool PublicOnly) { TypedefInfo *Info = allocateTransient<TypedefInfo>(); bool IsInAnonymousNamespace = false; populateInfo(*Info, D, FC, IsInAnonymousNamespace); @@ -1278,9 +1278,9 @@ Serializer::emitInfo(const TypeAliasDecl *D, const FullComment *FC, return {nullptr, makeAndInsertIntoParent(*Info)}; } -std::pair<OwnedPtr<Info>, OwnedPtr<Info>> -Serializer::emitInfo(const EnumDecl *D, const FullComment *FC, Location Loc, - bool PublicOnly) { +std::pair<Info *, Info *> Serializer::emitInfo(const EnumDecl *D, + const FullComment *FC, + Location Loc, bool PublicOnly) { EnumInfo *Enum = allocateTransient<EnumInfo>(); bool IsInAnonymousNamespace = false; populateSymbolInfo(*Enum, D, FC, Loc, IsInAnonymousNamespace); @@ -1299,9 +1299,10 @@ Serializer::emitInfo(const EnumDecl *D, const FullComment *FC, Location Loc, return {nullptr, makeAndInsertIntoParent(*Enum)}; } -std::pair<OwnedPtr<Info>, OwnedPtr<Info>> -Serializer::emitInfo(const ConceptDecl *D, const FullComment *FC, - const Location &Loc, bool PublicOnly) { +std::pair<Info *, Info *> Serializer::emitInfo(const ConceptDecl *D, + const FullComment *FC, + const Location &Loc, + bool PublicOnly) { ConceptInfo *Concept = allocateTransient<ConceptInfo>(); bool IsInAnonymousNamespace = false; @@ -1326,9 +1327,10 @@ Serializer::emitInfo(const ConceptDecl *D, const FullComment *FC, return {nullptr, makeAndInsertIntoParent(*Concept)}; } -std::pair<OwnedPtr<Info>, OwnedPtr<Info>> -Serializer::emitInfo(const VarDecl *D, const FullComment *FC, - const Location &Loc, bool PublicOnly) { +std::pair<Info *, Info *> Serializer::emitInfo(const VarDecl *D, + const FullComment *FC, + const Location &Loc, + bool PublicOnly) { VarInfo *Var = allocateTransient<VarInfo>(); bool IsInAnonymousNamespace = false; populateSymbolInfo(*Var, D, FC, Loc, IsInAnonymousNamespace); diff --git a/clang-tools-extra/clang-doc/Serialize.h b/clang-tools-extra/clang-doc/Serialize.h index fe3a70548e617..a522c605869f7 100644 --- a/clang-tools-extra/clang-doc/Serialize.h +++ b/clang-tools-extra/clang-doc/Serialize.h @@ -37,54 +37,42 @@ class Serializer { public: Serializer() = default; - std::pair<OwnedPtr<Info>, OwnedPtr<Info>> emitInfo(const NamespaceDecl *D, - const FullComment *FC, - Location Loc, - bool PublicOnly); - - std::pair<OwnedPtr<Info>, OwnedPtr<Info>> emitInfo(const RecordDecl *D, - const FullComment *FC, - Location Loc, - bool PublicOnly); - - std::pair<OwnedPtr<Info>, OwnedPtr<Info>> emitInfo(const EnumDecl *D, - const FullComment *FC, - Location Loc, - bool PublicOnly); - - std::pair<OwnedPtr<Info>, OwnedPtr<Info>> emitInfo(const FunctionDecl *D, - const FullComment *FC, - Location Loc, - bool PublicOnly); - - std::pair<OwnedPtr<Info>, OwnedPtr<Info>> - emitInfo(const VarDecl *D, const FullComment *FC, int LineNumber, - StringRef File, bool IsFileInRootDir, bool PublicOnly); - - std::pair<OwnedPtr<Info>, OwnedPtr<Info>> emitInfo(const CXXMethodDecl *D, - const FullComment *FC, - Location Loc, - bool PublicOnly); - - std::pair<OwnedPtr<Info>, OwnedPtr<Info>> emitInfo(const TypedefDecl *D, - const FullComment *FC, - Location Loc, - bool PublicOnly); - - std::pair<OwnedPtr<Info>, OwnedPtr<Info>> emitInfo(const TypeAliasDecl *D, - const FullComment *FC, - Location Loc, - bool PublicOnly); - - std::pair<OwnedPtr<Info>, OwnedPtr<Info>> emitInfo(const ConceptDecl *D, - const FullComment *FC, - const Location &Loc, - bool PublicOnly); - - std::pair<OwnedPtr<Info>, OwnedPtr<Info>> emitInfo(const VarDecl *D, - const FullComment *FC, - const Location &Loc, - bool PublicOnly); + std::pair<Info *, Info *> emitInfo(const NamespaceDecl *D, + const FullComment *FC, Location Loc, + bool PublicOnly); + + std::pair<Info *, Info *> emitInfo(const RecordDecl *D, const FullComment *FC, + Location Loc, bool PublicOnly); + + std::pair<Info *, Info *> emitInfo(const EnumDecl *D, const FullComment *FC, + Location Loc, bool PublicOnly); + + std::pair<Info *, Info *> emitInfo(const FunctionDecl *D, + const FullComment *FC, Location Loc, + bool PublicOnly); + + std::pair<Info *, Info *> emitInfo(const VarDecl *D, const FullComment *FC, + int LineNumber, StringRef File, + bool IsFileInRootDir, bool PublicOnly); + + std::pair<Info *, Info *> emitInfo(const CXXMethodDecl *D, + const FullComment *FC, Location Loc, + bool PublicOnly); + + std::pair<Info *, Info *> emitInfo(const TypedefDecl *D, + const FullComment *FC, Location Loc, + bool PublicOnly); + + std::pair<Info *, Info *> emitInfo(const TypeAliasDecl *D, + const FullComment *FC, Location Loc, + bool PublicOnly); + + std::pair<Info *, Info *> emitInfo(const ConceptDecl *D, + const FullComment *FC, const Location &Loc, + bool PublicOnly); + + std::pair<Info *, Info *> emitInfo(const VarDecl *D, const FullComment *FC, + const Location &Loc, bool PublicOnly); private: void getTemplateParameters(const TemplateParameterList *TemplateParams, @@ -123,8 +111,7 @@ class Serializer { void InsertChild(ScopeChildren &Scope, ConceptInfo &Info); void InsertChild(ScopeChildren &Scope, VarInfo &Info); - template <typename ChildType> - OwnedPtr<Info> makeAndInsertIntoParent(ChildType &Child); + template <typename ChildType> Info *makeAndInsertIntoParent(ChildType &Child); AccessSpecifier getFinalAccessSpecifier(AccessSpecifier FirstAS, AccessSpecifier SecondAS); @@ -193,7 +180,7 @@ class Serializer { // memory (vs storing USRs directly). SymbolID hashUSR(llvm::StringRef USR); -std::string serialize(OwnedPtr<Info> &I, DiagnosticsEngine &Diags); +std::string serialize(const Info &I, DiagnosticsEngine &Diags); } // namespace serialize } // namespace doc diff --git a/clang-tools-extra/clang-doc/YAMLGenerator.cpp b/clang-tools-extra/clang-doc/YAMLGenerator.cpp index a4a15c9599c0a..a16d6342e684e 100644 --- a/clang-tools-extra/clang-doc/YAMLGenerator.cpp +++ b/clang-tools-extra/clang-doc/YAMLGenerator.cpp @@ -28,7 +28,6 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(EnumValueInfo) LLVM_YAML_IS_SEQUENCE_VECTOR(TemplateParamInfo) LLVM_YAML_IS_SEQUENCE_VECTOR(TypedefInfo) LLVM_YAML_IS_SEQUENCE_VECTOR(BaseRecordInfo) -LLVM_YAML_IS_SEQUENCE_VECTOR(OwnedPtr<CommentInfo>) namespace llvm { @@ -520,9 +519,10 @@ class YAMLGenerator : public Generator { public: static const char *Format; - llvm::Error generateDocumentation( - StringRef RootDir, llvm::StringMap<doc::OwnedPtr<doc::Info>> Infos, - const ClangDocContext &CDCtx, std::string DirName) override; + llvm::Error generateDocumentation(StringRef RootDir, + llvm::StringMap<doc::Info *> Infos, + const ClangDocContext &CDCtx, + std::string DirName) override; llvm::Error generateDocForInfo(Info *I, llvm::raw_ostream &OS, const ClangDocContext &CDCtx) override; }; @@ -530,10 +530,10 @@ class YAMLGenerator : public Generator { const char *YAMLGenerator::Format = "yaml"; llvm::Error YAMLGenerator::generateDocumentation( - StringRef RootDir, llvm::StringMap<doc::OwnedPtr<doc::Info>> Infos, + StringRef RootDir, llvm::StringMap<doc::Info *> Infos, const ClangDocContext &CDCtx, std::string DirName) { for (const auto &Group : Infos) { - doc::Info *Info = getPtr(Group.getValue()); + doc::Info *Info = Group.getValue(); // Output file names according to the USR except the global namesapce. // Anonymous namespaces are taken care of in serialization, so here we can diff --git a/clang-tools-extra/clang-doc/benchmarks/ClangDocBenchmark.cpp b/clang-tools-extra/clang-doc/benchmarks/ClangDocBenchmark.cpp index 6372584c98a80..79f5f2315a94a 100644 --- a/clang-tools-extra/clang-doc/benchmarks/ClangDocBenchmark.cpp +++ b/clang-tools-extra/clang-doc/benchmarks/ClangDocBenchmark.cpp @@ -102,10 +102,10 @@ static void BM_SerializeFunctionInfo(benchmark::State &State) { DiagnosticOptions DiagOpts; DiagnosticsEngine Diags(DiagID, DiagOpts, new IgnoringDiagConsumer()); - OwnedPtr<Info> InfoPtr = std::move(I); + Info *InfoPtr = I; for (auto _ : State) { - auto Result = serialize::serialize(InfoPtr, Diags); + auto Result = serialize::serialize(*InfoPtr, Diags); benchmark::DoNotOptimize(Result); } } @@ -200,7 +200,7 @@ static void BM_JSONGenerator_Scale(benchmark::State &State) { for (auto _ : State) { Output.clear(); - auto Err = (*G)->generateDocForInfo(getPtr(NI), OS, CDCtx); + auto Err = (*G)->generateDocForInfo(NI, OS, CDCtx); if (Err) { State.SkipWithError("generateDocForInfo failed"); llvm::consumeError(std::move(Err)); diff --git a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp index 3c38901f4a0f9..c0666bf4effb4 100644 --- a/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp +++ b/clang-tools-extra/clang-doc/tool/ClangDocMain.cpp @@ -224,16 +224,15 @@ static llvm::Error getMdFiles(const char *Argv0, /// Make the output of clang-doc deterministic by sorting the children of /// namespaces and records. -static void -sortUsrToInfo(llvm::StringMap<doc::OwnedPtr<doc::Info>> &USRToInfo) { +static void sortUsrToInfo(llvm::StringMap<doc::Info *> &USRToInfo) { for (auto &I : USRToInfo) { auto &Info = I.second; if (Info->IT == doc::InfoType::IT_namespace) { - auto *Namespace = static_cast<clang::doc::NamespaceInfo *>(getPtr(Info)); + auto *Namespace = static_cast<clang::doc::NamespaceInfo *>(Info); Namespace->Children.sort(); } if (Info->IT == doc::InfoType::IT_record) { - auto *Record = static_cast<clang::doc::RecordInfo *>(getPtr(Info)); + auto *Record = static_cast<clang::doc::RecordInfo *>(Info); Record->Children.sort(); } } @@ -340,7 +339,7 @@ Example usage for a project using a compile commands database: // Collects all Infos according to their unique USR value. This map is added // to from the thread pool below and is protected by the USRToInfoMutex. llvm::sys::Mutex USRToInfoMutex; - llvm::StringMap<doc::OwnedPtr<doc::Info>> USRToInfo; + llvm::StringMap<doc::Info *> USRToInfo; // First reducing phase (reduce all decls into one info per decl). llvm::outs() << "Reducing " << USRToBitcode.size() << " infos...\n"; @@ -368,7 +367,7 @@ Example usage for a project using a compile commands database: if (CDCtx.FTimeTrace) llvm::timeTraceProfilerInitialize(200, "clang-doc"); - doc::OwnedPtr<doc::Info> Reduced = nullptr; + doc::Info *Reduced = nullptr; { llvm::TimeTraceScope Red("decoding and merging bitcode"); for (const auto &Bitcode : Bitcodes) { @@ -402,7 +401,7 @@ Example usage for a project using a compile commands database: { llvm::TimeTraceScope Merge("addInfoToIndex"); std::lock_guard<llvm::sys::Mutex> Guard(IndexMutex); - clang::doc::Generator::addInfoToIndex(CDCtx.Idx, getPtr(Reduced)); + clang::doc::Generator::addInfoToIndex(CDCtx.Idx, Reduced); } // Save in the result map (needs a lock due to threaded access). { diff --git a/clang-tools-extra/unittests/clang-doc/MergeTest.cpp b/clang-tools-extra/unittests/clang-doc/MergeTest.cpp index 0de13ee81f1a8..78e5424e6fbfb 100644 --- a/clang-tools-extra/unittests/clang-doc/MergeTest.cpp +++ b/clang-tools-extra/unittests/clang-doc/MergeTest.cpp @@ -199,7 +199,7 @@ TEST_F(MergeTest, mergeSingleNamespaceInfo) { Expected.Children.Enums.push_back(EE2Node); NamespaceInfo ReducedObj; ReducedObj.IT = InfoType::IT_namespace; - doc::OwnedPtr<doc::Info> Reduced = &ReducedObj; + doc::Info *Reduced = &ReducedObj; Info *PtrOne = &One; auto Err1 = mergeSingleInfo(Reduced, std::move(PtrOne), doc::PersistentArena); @@ -210,9 +210,9 @@ TEST_F(MergeTest, mergeSingleNamespaceInfo) { assert(!Err2); CheckNamespaceInfo(InfoAsNamespace(&Expected), - static_cast<NamespaceInfo *>(getPtr(Reduced))); + static_cast<NamespaceInfo *>(Reduced)); - auto *RedNS = static_cast<NamespaceInfo *>(getPtr(Reduced)); + auto *RedNS = static_cast<NamespaceInfo *>(Reduced); // Check that children functions are NOT the same instances as in One or Two ASSERT_NE(RedNS->Children.Functions.front().Ptr, &F1); ASSERT_NE(RedNS->Children.Functions.back().Ptr, &F2); _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
