aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/ExtractAPI/API.cpp
diff options
context:
space:
mode:
authorDaniel Grumberg <dgrumberg@apple.com>2022-03-23 15:03:02 +0000
committerDaniel Grumberg <dgrumberg@apple.com>2022-03-24 17:44:00 +0000
commit0ee06c31aa57576c05c7ca3e68d2cac9ddf59811 (patch)
treeeeb669c693c50adfd3648fdd229ebf67b104ca7b /clang/lib/ExtractAPI/API.cpp
parent597aefa89c6d99b6cf0daa5aa99ed67ee8da4fdb (diff)
downloadllvm-0ee06c31aa57576c05c7ca3e68d2cac9ddf59811.zip
llvm-0ee06c31aa57576c05c7ca3e68d2cac9ddf59811.tar.gz
llvm-0ee06c31aa57576c05c7ca3e68d2cac9ddf59811.tar.bz2
[clang][extract-api] Stop allocating APIRecords via BumpPtrAllocator
Using a BumpPtrAllocator introduced memory leaks for APIRecords as they contain a std::vector. This meant that we needed to always keep a reference to the records in APISet and arrange for their destructor to get called appropriately. This was further complicated by the need for records to own sub-records as these subrecords would still need to be allocated via the BumpPtrAllocator and the owning record would now need to arrange for the destructor of its subrecords to be called appropriately. Since APIRecords contain a std::vector so whenever elements get added to that there is an associated heap allocation regardless. Since performance isn't currently our main priority it makes sense to use regular unique_ptr to keep track of APIRecords, this way we don't need to arrange for destructors to get called. The BumpPtrAllocator is still used for strings such as USRs so that we can easily de-duplicate them as necessary. Differential Revision: https://reviews.llvm.org/D122331
Diffstat (limited to 'clang/lib/ExtractAPI/API.cpp')
-rw-r--r--clang/lib/ExtractAPI/API.cpp28
1 files changed, 13 insertions, 15 deletions
diff --git a/clang/lib/ExtractAPI/API.cpp b/clang/lib/ExtractAPI/API.cpp
index 7aa8233..6b60d2c 100644
--- a/clang/lib/ExtractAPI/API.cpp
+++ b/clang/lib/ExtractAPI/API.cpp
@@ -17,7 +17,7 @@
#include "clang/AST/CommentLexer.h"
#include "clang/AST/RawCommentList.h"
#include "clang/Index/USRGeneration.h"
-#include "llvm/Support/Allocator.h"
+#include <memory>
using namespace clang::extractapi;
using namespace llvm;
@@ -32,9 +32,9 @@ GlobalRecord *APISet::addGlobal(GVKind Kind, StringRef Name, StringRef USR,
auto Result = Globals.insert({Name, nullptr});
if (Result.second) {
// Create the record if it does not already exist.
- auto Record = APIRecordUniquePtr<GlobalRecord>(new (Allocator) GlobalRecord{
+ auto Record = std::make_unique<GlobalRecord>(
Kind, Name, USR, Loc, Availability, Linkage, Comment, Fragments,
- SubHeading, Signature});
+ SubHeading, Signature);
Result.first->second = std::move(Record);
}
return Result.first->second.get();
@@ -63,9 +63,8 @@ EnumConstantRecord *APISet::addEnumConstant(
EnumRecord *Enum, StringRef Name, StringRef USR, PresumedLoc Loc,
const AvailabilityInfo &Availability, const DocComment &Comment,
DeclarationFragments Declaration, DeclarationFragments SubHeading) {
- auto Record =
- APIRecordUniquePtr<EnumConstantRecord>(new (Allocator) EnumConstantRecord{
- Name, USR, Loc, Availability, Comment, Declaration, SubHeading});
+ auto Record = std::make_unique<EnumConstantRecord>(
+ Name, USR, Loc, Availability, Comment, Declaration, SubHeading);
return Enum->Constants.emplace_back(std::move(Record)).get();
}
@@ -77,8 +76,8 @@ EnumRecord *APISet::addEnum(StringRef Name, StringRef USR, PresumedLoc Loc,
auto Result = Enums.insert({Name, nullptr});
if (Result.second) {
// Create the record if it does not already exist.
- auto Record = APIRecordUniquePtr<EnumRecord>(new (Allocator) EnumRecord{
- Name, USR, Loc, Availability, Comment, Declaration, SubHeading});
+ auto Record = std::make_unique<EnumRecord>(
+ Name, USR, Loc, Availability, Comment, Declaration, SubHeading);
Result.first->second = std::move(Record);
}
return Result.first->second.get();
@@ -90,9 +89,8 @@ StructFieldRecord *APISet::addStructField(StructRecord *Struct, StringRef Name,
const DocComment &Comment,
DeclarationFragments Declaration,
DeclarationFragments SubHeading) {
- auto Record =
- APIRecordUniquePtr<StructFieldRecord>(new (Allocator) StructFieldRecord{
- Name, USR, Loc, Availability, Comment, Declaration, SubHeading});
+ auto Record = std::make_unique<StructFieldRecord>(
+ Name, USR, Loc, Availability, Comment, Declaration, SubHeading);
return Struct->Fields.emplace_back(std::move(Record)).get();
}
@@ -104,8 +102,8 @@ StructRecord *APISet::addStruct(StringRef Name, StringRef USR, PresumedLoc Loc,
auto Result = Structs.insert({Name, nullptr});
if (Result.second) {
// Create the record if it does not already exist.
- auto Record = APIRecordUniquePtr<StructRecord>(new (Allocator) StructRecord{
- Name, USR, Loc, Availability, Comment, Declaration, SubHeading});
+ auto Record = std::make_unique<StructRecord>(
+ Name, USR, Loc, Availability, Comment, Declaration, SubHeading);
Result.first->second = std::move(Record);
}
return Result.first->second.get();
@@ -122,10 +120,10 @@ StringRef APISet::copyString(StringRef String) {
return {};
// No need to allocate memory and copy if the string has already been stored.
- if (Allocator.identifyObject(String.data()))
+ if (StringAllocator.identifyObject(String.data()))
return String;
- void *Ptr = Allocator.Allocate(String.size(), 1);
+ void *Ptr = StringAllocator.Allocate(String.size(), 1);
memcpy(Ptr, String.data(), String.size());
return StringRef(reinterpret_cast<const char *>(Ptr), String.size());
}