[llvm-branch-commits] [clang-tools-extra] [clang-doc] Removed OwnedPtr alias (PR #190427)
Paul Kirth via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon May 18 08:45:59 PDT 2026
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 <paulkirth at google.com>
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);
More information about the llvm-branch-commits
mailing list