Duncan P. N. Exon Smith | 030d7d6 | 2017-03-20 17:58:26 +0000 | [diff] [blame] | 1 | //===- MemoryBufferCache.cpp - Cache for loaded memory buffers ------------===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
| 10 | #include "clang/Basic/MemoryBufferCache.h" |
| 11 | #include "llvm/Support/MemoryBuffer.h" |
| 12 | |
| 13 | using namespace clang; |
| 14 | |
| 15 | llvm::MemoryBuffer & |
| 16 | MemoryBufferCache::addBuffer(llvm::StringRef Filename, |
| 17 | std::unique_ptr<llvm::MemoryBuffer> Buffer) { |
| 18 | auto Insertion = |
| 19 | Buffers.insert({Filename, BufferEntry{std::move(Buffer), NextIndex++}}); |
| 20 | assert(Insertion.second && "Already has a buffer"); |
| 21 | return *Insertion.first->second.Buffer; |
| 22 | } |
| 23 | |
| 24 | llvm::MemoryBuffer *MemoryBufferCache::lookupBuffer(llvm::StringRef Filename) { |
| 25 | auto I = Buffers.find(Filename); |
| 26 | if (I == Buffers.end()) |
| 27 | return nullptr; |
| 28 | return I->second.Buffer.get(); |
| 29 | } |
| 30 | |
| 31 | bool MemoryBufferCache::isBufferFinal(llvm::StringRef Filename) { |
| 32 | auto I = Buffers.find(Filename); |
| 33 | if (I == Buffers.end()) |
| 34 | return false; |
| 35 | return I->second.Index < FirstRemovableIndex; |
| 36 | } |
| 37 | |
| 38 | bool MemoryBufferCache::tryToRemoveBuffer(llvm::StringRef Filename) { |
| 39 | auto I = Buffers.find(Filename); |
| 40 | assert(I != Buffers.end() && "No buffer to remove..."); |
| 41 | if (I->second.Index < FirstRemovableIndex) |
| 42 | return true; |
| 43 | |
| 44 | Buffers.erase(I); |
| 45 | return false; |
| 46 | } |
| 47 | |
| 48 | void MemoryBufferCache::finalizeCurrentBuffers() { FirstRemovableIndex = NextIndex; } |