diff options
| author | John McCall <rjmccall@apple.com> | 2010-02-15 19:38:00 +0000 |
|---|---|---|
| committer | John McCall <rjmccall@apple.com> | 2010-02-15 19:38:00 +0000 |
| commit | 5f5cbf5d1d3e1d533743945207dfaa2c0c2e2191 (patch) | |
| tree | a79acfc9e4f00af20f98da2ea8fb2f76912d1cab /clang | |
| parent | c837209b8104c5a00bb75a813b26f8fafa4f137c (diff) | |
| download | bcm5719-llvm-5f5cbf5d1d3e1d533743945207dfaa2c0c2e2191.tar.gz bcm5719-llvm-5f5cbf5d1d3e1d533743945207dfaa2c0c2e2191.zip | |
Optimize the implementation of IdDeclInfo pooling in the IdentifierResolver.
llvm-svn: 96253
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/IdentifierResolver.cpp | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/clang/lib/Sema/IdentifierResolver.cpp b/clang/lib/Sema/IdentifierResolver.cpp index bff47519a74..b09526e097b 100644 --- a/clang/lib/Sema/IdentifierResolver.cpp +++ b/clang/lib/Sema/IdentifierResolver.cpp @@ -14,8 +14,6 @@ #include "IdentifierResolver.h" #include "clang/Basic/LangOptions.h" -#include <list> -#include <vector> using namespace clang; @@ -27,14 +25,31 @@ using namespace clang; /// Allocates 'pools' (vectors of IdDeclInfos) to avoid allocating each /// individual IdDeclInfo to heap. class IdentifierResolver::IdDeclInfoMap { - static const unsigned int VECTOR_SIZE = 512; - // Holds vectors of IdDeclInfos that serve as 'pools'. - // New vectors are added when the current one is full. - std::list< std::vector<IdDeclInfo> > IDIVecs; + static const unsigned int POOL_SIZE = 512; + + /// We use our own linked-list implementation because it is sadly + /// impossible to add something to a pre-C++0x STL container without + /// a completely unnecessary copy. + struct IdDeclInfoPool { + IdDeclInfoPool(IdDeclInfoPool *Next) : Next(Next) {} + + IdDeclInfoPool *Next; + IdDeclInfo Pool[POOL_SIZE]; + }; + + IdDeclInfoPool *CurPool; unsigned int CurIndex; public: - IdDeclInfoMap() : CurIndex(VECTOR_SIZE) {} + IdDeclInfoMap() : CurPool(0), CurIndex(POOL_SIZE) {} + + ~IdDeclInfoMap() { + IdDeclInfoPool *Cur = CurPool; + while (IdDeclInfoPool *P = Cur) { + Cur = Cur->Next; + delete P; + } + } /// Returns the IdDeclInfo associated to the DeclarationName. /// It creates a new IdDeclInfo if one was not created before for this id. @@ -235,14 +250,11 @@ IdentifierResolver::IdDeclInfoMap::operator[](DeclarationName Name) { if (Ptr) return *toIdDeclInfo(Ptr); - if (CurIndex == VECTOR_SIZE) { - // Add a IdDeclInfo vector 'pool' - IDIVecs.push_back(std::vector<IdDeclInfo>()); - // Fill the vector - IDIVecs.back().resize(VECTOR_SIZE); + if (CurIndex == POOL_SIZE) { + CurPool = new IdDeclInfoPool(CurPool); CurIndex = 0; } - IdDeclInfo *IDI = &IDIVecs.back()[CurIndex]; + IdDeclInfo *IDI = &CurPool->Pool[CurIndex]; Name.setFETokenInfo(reinterpret_cast<void*>( reinterpret_cast<uintptr_t>(IDI) | 0x1) ); |

