diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-04-20 07:08:21 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-04-20 07:08:21 +0000 |
| commit | 52289d3343476af6a27a9ac0e677b615b4cd3841 (patch) | |
| tree | 43cf04ccd3780303313d2bf1128d77d66c8b877a /clang/tools/clang-cc/CacheTokens.cpp | |
| parent | f5c18461e37487868f86c56b6ccb07b124514955 (diff) | |
| download | bcm5719-llvm-52289d3343476af6a27a9ac0e677b615b4cd3841.tar.gz bcm5719-llvm-52289d3343476af6a27a9ac0e677b615b4cd3841.zip | |
Move the on-disk hash table code into its own header. No functionality change.
llvm-svn: 69580
Diffstat (limited to 'clang/tools/clang-cc/CacheTokens.cpp')
| -rw-r--r-- | clang/tools/clang-cc/CacheTokens.cpp | 162 |
1 files changed, 2 insertions, 160 deletions
diff --git a/clang/tools/clang-cc/CacheTokens.cpp b/clang/tools/clang-cc/CacheTokens.cpp index 2b08818f8f6..a886ba135a1 100644 --- a/clang/tools/clang-cc/CacheTokens.cpp +++ b/clang/tools/clang-cc/CacheTokens.cpp @@ -17,6 +17,7 @@ #include "clang/Basic/SourceManager.h" #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/Diagnostic.h" +#include "clang/Basic/OnDiskHashTable.h" #include "clang/Lex/Lexer.h" #include "clang/Lex/Preprocessor.h" #include "llvm/ADT/StringMap.h" @@ -32,166 +33,7 @@ #endif using namespace clang; - -typedef uint32_t Offset; - -static void Emit8(llvm::raw_ostream& Out, uint32_t V) { - Out << (unsigned char)(V); -} - -static void Emit16(llvm::raw_ostream& Out, uint32_t V) { - Out << (unsigned char)(V); - Out << (unsigned char)(V >> 8); - assert((V >> 16) == 0); -} - -static void Emit32(llvm::raw_ostream& Out, uint32_t V) { - Out << (unsigned char)(V); - Out << (unsigned char)(V >> 8); - Out << (unsigned char)(V >> 16); - Out << (unsigned char)(V >> 24); -} - -static void Emit64(llvm::raw_ostream& Out, uint64_t V) { - Out << (unsigned char)(V); - Out << (unsigned char)(V >> 8); - Out << (unsigned char)(V >> 16); - Out << (unsigned char)(V >> 24); - Out << (unsigned char)(V >> 32); - Out << (unsigned char)(V >> 40); - Out << (unsigned char)(V >> 48); - Out << (unsigned char)(V >> 56); -} - -static void Pad(llvm::raw_fd_ostream& Out, unsigned A) { - Offset off = (Offset) Out.tell(); - uint32_t n = ((uintptr_t)(off+A-1) & ~(uintptr_t)(A-1)) - off; - for (; n ; --n) - Emit8(Out, 0); -} - -// Bernstein hash function: -// This is basically copy-and-paste from StringMap. This likely won't -// stay here, which is why I didn't both to expose this function from -// String Map. -static unsigned BernsteinHash(const char* x) { - unsigned int R = 0; - for ( ; *x != '\0' ; ++x) R = R * 33 + *x; - return R + (R >> 5); -} - -//===----------------------------------------------------------------------===// -// On Disk Hashtable Logic. This will eventually get refactored and put -// elsewhere. -//===----------------------------------------------------------------------===// - -template<typename Info> -class OnDiskChainedHashTableGenerator { - unsigned NumBuckets; - unsigned NumEntries; - llvm::BumpPtrAllocator BA; - - class Item { - public: - typename Info::key_type key; - typename Info::data_type data; - Item *next; - const uint32_t hash; - - Item(typename Info::key_type_ref k, typename Info::data_type_ref d) - : key(k), data(d), next(0), hash(Info::ComputeHash(k)) {} - }; - - class Bucket { - public: - Offset off; - Item* head; - unsigned length; - - Bucket() {} - }; - - Bucket* Buckets; - -private: - void insert(Bucket* b, size_t size, Item* E) { - unsigned idx = E->hash & (size - 1); - Bucket& B = b[idx]; - E->next = B.head; - ++B.length; - B.head = E; - } - - void resize(size_t newsize) { - Bucket* newBuckets = (Bucket*) calloc(newsize, sizeof(Bucket)); - // Populate newBuckets with the old entries. - for (unsigned i = 0; i < NumBuckets; ++i) - for (Item* E = Buckets[i].head; E ; ) { - Item* N = E->next; - E->next = 0; - insert(newBuckets, newsize, E); - E = N; - } - - free(Buckets); - NumBuckets = newsize; - Buckets = newBuckets; - } - -public: - - void insert(typename Info::key_type_ref key, - typename Info::data_type_ref data) { - - ++NumEntries; - if (4*NumEntries >= 3*NumBuckets) resize(NumBuckets*2); - insert(Buckets, NumBuckets, new (BA.Allocate<Item>()) Item(key, data)); - } - - Offset Emit(llvm::raw_fd_ostream& out) { - // Emit the payload of the table. - for (unsigned i = 0; i < NumBuckets; ++i) { - Bucket& B = Buckets[i]; - if (!B.head) continue; - - // Store the offset for the data of this bucket. - B.off = out.tell(); - - // Write out the number of items in the bucket. - Emit16(out, B.length); - - // Write out the entries in the bucket. - for (Item *I = B.head; I ; I = I->next) { - Emit32(out, I->hash); - const std::pair<unsigned, unsigned>& Len = - Info::EmitKeyDataLength(out, I->key, I->data); - Info::EmitKey(out, I->key, Len.first); - Info::EmitData(out, I->key, I->data, Len.second); - } - } - - // Emit the hashtable itself. - Pad(out, 4); - Offset TableOff = out.tell(); - Emit32(out, NumBuckets); - Emit32(out, NumEntries); - for (unsigned i = 0; i < NumBuckets; ++i) Emit32(out, Buckets[i].off); - - return TableOff; - } - - OnDiskChainedHashTableGenerator() { - NumEntries = 0; - NumBuckets = 64; - // Note that we do not need to run the constructors of the individual - // Bucket objects since 'calloc' returns bytes that are all 0. - Buckets = (Bucket*) calloc(NumBuckets, sizeof(Bucket)); - } - - ~OnDiskChainedHashTableGenerator() { - free(Buckets); - } -}; +using namespace clang::io; //===----------------------------------------------------------------------===// // PTH-specific stuff. |

