1*8bef5cd4SDuncan P. N. Exon Smith //===- InMemoryModuleCache.cpp - Cache for loaded memory buffers ----------===// 2*8bef5cd4SDuncan P. N. Exon Smith // 3*8bef5cd4SDuncan P. N. Exon Smith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*8bef5cd4SDuncan P. N. Exon Smith // See https://llvm.org/LICENSE.txt for license information. 5*8bef5cd4SDuncan P. N. Exon Smith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*8bef5cd4SDuncan P. N. Exon Smith // 7*8bef5cd4SDuncan P. N. Exon Smith //===----------------------------------------------------------------------===// 8*8bef5cd4SDuncan P. N. Exon Smith 9*8bef5cd4SDuncan P. N. Exon Smith #include "clang/Serialization/InMemoryModuleCache.h" 10*8bef5cd4SDuncan P. N. Exon Smith #include "llvm/Support/MemoryBuffer.h" 11*8bef5cd4SDuncan P. N. Exon Smith 12*8bef5cd4SDuncan P. N. Exon Smith using namespace clang; 13*8bef5cd4SDuncan P. N. Exon Smith 14*8bef5cd4SDuncan P. N. Exon Smith llvm::MemoryBuffer & 15*8bef5cd4SDuncan P. N. Exon Smith InMemoryModuleCache::addBuffer(llvm::StringRef Filename, 16*8bef5cd4SDuncan P. N. Exon Smith std::unique_ptr<llvm::MemoryBuffer> Buffer) { 17*8bef5cd4SDuncan P. N. Exon Smith auto Insertion = PCMs.insert({Filename, PCM{std::move(Buffer), NextIndex++}}); 18*8bef5cd4SDuncan P. N. Exon Smith assert(Insertion.second && "Already has a buffer"); 19*8bef5cd4SDuncan P. N. Exon Smith return *Insertion.first->second.Buffer; 20*8bef5cd4SDuncan P. N. Exon Smith } 21*8bef5cd4SDuncan P. N. Exon Smith 22*8bef5cd4SDuncan P. N. Exon Smith llvm::MemoryBuffer * 23*8bef5cd4SDuncan P. N. Exon Smith InMemoryModuleCache::lookupBuffer(llvm::StringRef Filename) { 24*8bef5cd4SDuncan P. N. Exon Smith auto I = PCMs.find(Filename); 25*8bef5cd4SDuncan P. N. Exon Smith if (I == PCMs.end()) 26*8bef5cd4SDuncan P. N. Exon Smith return nullptr; 27*8bef5cd4SDuncan P. N. Exon Smith return I->second.Buffer.get(); 28*8bef5cd4SDuncan P. N. Exon Smith } 29*8bef5cd4SDuncan P. N. Exon Smith 30*8bef5cd4SDuncan P. N. Exon Smith bool InMemoryModuleCache::isBufferFinal(llvm::StringRef Filename) { 31*8bef5cd4SDuncan P. N. Exon Smith auto I = PCMs.find(Filename); 32*8bef5cd4SDuncan P. N. Exon Smith if (I == PCMs.end()) 33*8bef5cd4SDuncan P. N. Exon Smith return false; 34*8bef5cd4SDuncan P. N. Exon Smith return I->second.Index < FirstRemovableIndex; 35*8bef5cd4SDuncan P. N. Exon Smith } 36*8bef5cd4SDuncan P. N. Exon Smith 37*8bef5cd4SDuncan P. N. Exon Smith bool InMemoryModuleCache::tryToRemoveBuffer(llvm::StringRef Filename) { 38*8bef5cd4SDuncan P. N. Exon Smith auto I = PCMs.find(Filename); 39*8bef5cd4SDuncan P. N. Exon Smith assert(I != PCMs.end() && "No buffer to remove..."); 40*8bef5cd4SDuncan P. N. Exon Smith if (I->second.Index < FirstRemovableIndex) 41*8bef5cd4SDuncan P. N. Exon Smith return true; 42*8bef5cd4SDuncan P. N. Exon Smith 43*8bef5cd4SDuncan P. N. Exon Smith PCMs.erase(I); 44*8bef5cd4SDuncan P. N. Exon Smith return false; 45*8bef5cd4SDuncan P. N. Exon Smith } 46*8bef5cd4SDuncan P. N. Exon Smith 47*8bef5cd4SDuncan P. N. Exon Smith void InMemoryModuleCache::finalizeCurrentBuffers() { 48*8bef5cd4SDuncan P. N. Exon Smith FirstRemovableIndex = NextIndex; 49*8bef5cd4SDuncan P. N. Exon Smith } 50