forked from OSchip/llvm-project
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. llvm-svn: 66017
This commit is contained in:
parent
7b26b29351
commit
1a84994c46
|
@ -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<MultiKeywordSelector>*
|
||||
void *Impl; // Actually a SelectorTableImpl
|
||||
SelectorTable(const SelectorTable&); // DISABLED: DO NOT IMPLEMENT
|
||||
void operator=(const SelectorTable&); // DISABLED: DO NOT IMPLEMENT
|
||||
public:
|
||||
|
|
|
@ -363,38 +363,50 @@ std::string Selector::getAsString() const {
|
|||
}
|
||||
|
||||
|
||||
namespace {
|
||||
struct SelectorTableImpl {
|
||||
llvm::FoldingSet<MultiKeywordSelector> Table;
|
||||
llvm::BumpPtrAllocator Allocator;
|
||||
};
|
||||
} // end anonymous namespace.
|
||||
|
||||
static SelectorTableImpl &getSelectorTableImpl(void *P) {
|
||||
return *static_cast<SelectorTableImpl*>(P);
|
||||
}
|
||||
|
||||
|
||||
Selector SelectorTable::getSelector(unsigned nKeys, IdentifierInfo **IIV) {
|
||||
if (nKeys < 2)
|
||||
return Selector(IIV[0], nKeys);
|
||||
|
||||
llvm::FoldingSet<MultiKeywordSelector> *SelTab;
|
||||
|
||||
SelTab = static_cast<llvm::FoldingSet<MultiKeywordSelector> *>(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<MultiKeywordSelector>());
|
||||
new (SI) MultiKeywordSelector(nKeys, IIV);
|
||||
SelTab->InsertNode(SI, InsertPos);
|
||||
SelTabImpl.Table.InsertNode(SI, InsertPos);
|
||||
return Selector(SI);
|
||||
}
|
||||
|
||||
SelectorTable::SelectorTable() {
|
||||
Impl = new llvm::FoldingSet<MultiKeywordSelector>;
|
||||
Impl = new SelectorTableImpl();
|
||||
}
|
||||
|
||||
SelectorTable::~SelectorTable() {
|
||||
delete static_cast<llvm::FoldingSet<MultiKeywordSelector> *>(Impl);
|
||||
delete &getSelectorTableImpl(Impl);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
Loading…
Reference in New Issue