From: Chris Lattner Date: Wed, 4 Mar 2009 05:35:38 +0000 (+0000) Subject: allocate MultiKeywordSelector's out of a bump pointer allocator instead of malloc. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5f7d2284c4b2f08d155732454002e68dc40c33ef;p=clang allocate MultiKeywordSelector's out of a bump pointer allocator instead of malloc. This has two advantages 1) no more leaking them, 2) fewer calls to malloc. This changes us from calling malloc 3685/1390/883/2974/1185 times respectively on 16/20/24/28/32 byte objects when parsing cocoa.h with pth and -disable-free to calling it 2816/1020/702/2903/1168 times each respectively. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66017 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/IdentifierTable.h b/include/clang/Basic/IdentifierTable.h index c4022b6496..32818a9137 100644 --- a/include/clang/Basic/IdentifierTable.h +++ b/include/clang/Basic/IdentifierTable.h @@ -410,7 +410,7 @@ public: /// SelectorTable - This table allows us to fully hide how we implement /// multi-keyword caching. class SelectorTable { - void *Impl; // Actually a FoldingSet* + void *Impl; // Actually a SelectorTableImpl SelectorTable(const SelectorTable&); // DISABLED: DO NOT IMPLEMENT void operator=(const SelectorTable&); // DISABLED: DO NOT IMPLEMENT public: diff --git a/lib/Basic/IdentifierTable.cpp b/lib/Basic/IdentifierTable.cpp index 0f0b4f9b8c..bd4facd835 100644 --- a/lib/Basic/IdentifierTable.cpp +++ b/lib/Basic/IdentifierTable.cpp @@ -363,38 +363,50 @@ std::string Selector::getAsString() const { } +namespace { + struct SelectorTableImpl { + llvm::FoldingSet Table; + llvm::BumpPtrAllocator Allocator; + }; +} // end anonymous namespace. + +static SelectorTableImpl &getSelectorTableImpl(void *P) { + return *static_cast(P); +} + + Selector SelectorTable::getSelector(unsigned nKeys, IdentifierInfo **IIV) { if (nKeys < 2) return Selector(IIV[0], nKeys); - llvm::FoldingSet *SelTab; - - SelTab = static_cast *>(Impl); + SelectorTableImpl &SelTabImpl = getSelectorTableImpl(Impl); // Unique selector, to guarantee there is one per name. llvm::FoldingSetNodeID ID; MultiKeywordSelector::Profile(ID, IIV, nKeys); void *InsertPos = 0; - if (MultiKeywordSelector *SI = SelTab->FindNodeOrInsertPos(ID, InsertPos)) + if (MultiKeywordSelector *SI = + SelTabImpl.Table.FindNodeOrInsertPos(ID, InsertPos)) return Selector(SI); // MultiKeywordSelector objects are not allocated with new because they have a // variable size array (for parameter types) at the end of them. - MultiKeywordSelector *SI = - (MultiKeywordSelector*)malloc(sizeof(MultiKeywordSelector) + - nKeys*sizeof(IdentifierInfo *)); + unsigned Size = sizeof(MultiKeywordSelector) + nKeys*sizeof(IdentifierInfo *); + MultiKeywordSelector *SI = + (MultiKeywordSelector*)SelTabImpl.Allocator.Allocate(Size, + llvm::alignof()); new (SI) MultiKeywordSelector(nKeys, IIV); - SelTab->InsertNode(SI, InsertPos); + SelTabImpl.Table.InsertNode(SI, InsertPos); return Selector(SI); } SelectorTable::SelectorTable() { - Impl = new llvm::FoldingSet; + Impl = new SelectorTableImpl(); } SelectorTable::~SelectorTable() { - delete static_cast *>(Impl); + delete &getSelectorTableImpl(Impl); } //===----------------------------------------------------------------------===//