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