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