1*7330f729Sjoerg //===- InMemoryModuleCache.cpp - Cache for loaded memory buffers ----------===// 2*7330f729Sjoerg // 3*7330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*7330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information. 5*7330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*7330f729Sjoerg // 7*7330f729Sjoerg //===----------------------------------------------------------------------===// 8*7330f729Sjoerg 9*7330f729Sjoerg #include "clang/Serialization/InMemoryModuleCache.h" 10*7330f729Sjoerg #include "llvm/Support/MemoryBuffer.h" 11*7330f729Sjoerg 12*7330f729Sjoerg using namespace clang; 13*7330f729Sjoerg 14*7330f729Sjoerg InMemoryModuleCache::State getPCMState(llvm::StringRef Filename) const15*7330f729SjoergInMemoryModuleCache::getPCMState(llvm::StringRef Filename) const { 16*7330f729Sjoerg auto I = PCMs.find(Filename); 17*7330f729Sjoerg if (I == PCMs.end()) 18*7330f729Sjoerg return Unknown; 19*7330f729Sjoerg if (I->second.IsFinal) 20*7330f729Sjoerg return Final; 21*7330f729Sjoerg return I->second.Buffer ? Tentative : ToBuild; 22*7330f729Sjoerg } 23*7330f729Sjoerg 24*7330f729Sjoerg llvm::MemoryBuffer & addPCM(llvm::StringRef Filename,std::unique_ptr<llvm::MemoryBuffer> Buffer)25*7330f729SjoergInMemoryModuleCache::addPCM(llvm::StringRef Filename, 26*7330f729Sjoerg std::unique_ptr<llvm::MemoryBuffer> Buffer) { 27*7330f729Sjoerg auto Insertion = PCMs.insert(std::make_pair(Filename, std::move(Buffer))); 28*7330f729Sjoerg assert(Insertion.second && "Already has a PCM"); 29*7330f729Sjoerg return *Insertion.first->second.Buffer; 30*7330f729Sjoerg } 31*7330f729Sjoerg 32*7330f729Sjoerg llvm::MemoryBuffer & addBuiltPCM(llvm::StringRef Filename,std::unique_ptr<llvm::MemoryBuffer> Buffer)33*7330f729SjoergInMemoryModuleCache::addBuiltPCM(llvm::StringRef Filename, 34*7330f729Sjoerg std::unique_ptr<llvm::MemoryBuffer> Buffer) { 35*7330f729Sjoerg auto &PCM = PCMs[Filename]; 36*7330f729Sjoerg assert(!PCM.IsFinal && "Trying to override finalized PCM?"); 37*7330f729Sjoerg assert(!PCM.Buffer && "Trying to override tentative PCM?"); 38*7330f729Sjoerg PCM.Buffer = std::move(Buffer); 39*7330f729Sjoerg PCM.IsFinal = true; 40*7330f729Sjoerg return *PCM.Buffer; 41*7330f729Sjoerg } 42*7330f729Sjoerg 43*7330f729Sjoerg llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename) const44*7330f729SjoergInMemoryModuleCache::lookupPCM(llvm::StringRef Filename) const { 45*7330f729Sjoerg auto I = PCMs.find(Filename); 46*7330f729Sjoerg if (I == PCMs.end()) 47*7330f729Sjoerg return nullptr; 48*7330f729Sjoerg return I->second.Buffer.get(); 49*7330f729Sjoerg } 50*7330f729Sjoerg isPCMFinal(llvm::StringRef Filename) const51*7330f729Sjoergbool InMemoryModuleCache::isPCMFinal(llvm::StringRef Filename) const { 52*7330f729Sjoerg return getPCMState(Filename) == Final; 53*7330f729Sjoerg } 54*7330f729Sjoerg shouldBuildPCM(llvm::StringRef Filename) const55*7330f729Sjoergbool InMemoryModuleCache::shouldBuildPCM(llvm::StringRef Filename) const { 56*7330f729Sjoerg return getPCMState(Filename) == ToBuild; 57*7330f729Sjoerg } 58*7330f729Sjoerg tryToDropPCM(llvm::StringRef Filename)59*7330f729Sjoergbool InMemoryModuleCache::tryToDropPCM(llvm::StringRef Filename) { 60*7330f729Sjoerg auto I = PCMs.find(Filename); 61*7330f729Sjoerg assert(I != PCMs.end() && "PCM to remove is unknown..."); 62*7330f729Sjoerg 63*7330f729Sjoerg auto &PCM = I->second; 64*7330f729Sjoerg assert(PCM.Buffer && "PCM to remove is scheduled to be built..."); 65*7330f729Sjoerg 66*7330f729Sjoerg if (PCM.IsFinal) 67*7330f729Sjoerg return true; 68*7330f729Sjoerg 69*7330f729Sjoerg PCM.Buffer.reset(); 70*7330f729Sjoerg return false; 71*7330f729Sjoerg } 72*7330f729Sjoerg finalizePCM(llvm::StringRef Filename)73*7330f729Sjoergvoid InMemoryModuleCache::finalizePCM(llvm::StringRef Filename) { 74*7330f729Sjoerg auto I = PCMs.find(Filename); 75*7330f729Sjoerg assert(I != PCMs.end() && "PCM to finalize is unknown..."); 76*7330f729Sjoerg 77*7330f729Sjoerg auto &PCM = I->second; 78*7330f729Sjoerg assert(PCM.Buffer && "Trying to finalize a dropped PCM..."); 79*7330f729Sjoerg PCM.IsFinal = true; 80*7330f729Sjoerg } 81