122989816SDimitry Andric //===- InMemoryModuleCache.cpp - Cache for loaded memory buffers ----------===// 222989816SDimitry Andric // 322989816SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 422989816SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 522989816SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 622989816SDimitry Andric // 722989816SDimitry Andric //===----------------------------------------------------------------------===// 822989816SDimitry Andric 922989816SDimitry Andric #include "clang/Serialization/InMemoryModuleCache.h" 1022989816SDimitry Andric #include "llvm/Support/MemoryBuffer.h" 1122989816SDimitry Andric 1222989816SDimitry Andric using namespace clang; 1322989816SDimitry Andric 1422989816SDimitry Andric InMemoryModuleCache::State getPCMState(llvm::StringRef Filename) const1522989816SDimitry AndricInMemoryModuleCache::getPCMState(llvm::StringRef Filename) const { 1622989816SDimitry Andric auto I = PCMs.find(Filename); 1722989816SDimitry Andric if (I == PCMs.end()) 1822989816SDimitry Andric return Unknown; 1922989816SDimitry Andric if (I->second.IsFinal) 2022989816SDimitry Andric return Final; 2122989816SDimitry Andric return I->second.Buffer ? Tentative : ToBuild; 2222989816SDimitry Andric } 2322989816SDimitry Andric 2422989816SDimitry Andric llvm::MemoryBuffer & addPCM(llvm::StringRef Filename,std::unique_ptr<llvm::MemoryBuffer> Buffer)2522989816SDimitry AndricInMemoryModuleCache::addPCM(llvm::StringRef Filename, 2622989816SDimitry Andric std::unique_ptr<llvm::MemoryBuffer> Buffer) { 2722989816SDimitry Andric auto Insertion = PCMs.insert(std::make_pair(Filename, std::move(Buffer))); 2822989816SDimitry Andric assert(Insertion.second && "Already has a PCM"); 2922989816SDimitry Andric return *Insertion.first->second.Buffer; 3022989816SDimitry Andric } 3122989816SDimitry Andric 3222989816SDimitry Andric llvm::MemoryBuffer & addBuiltPCM(llvm::StringRef Filename,std::unique_ptr<llvm::MemoryBuffer> Buffer)3322989816SDimitry AndricInMemoryModuleCache::addBuiltPCM(llvm::StringRef Filename, 3422989816SDimitry Andric std::unique_ptr<llvm::MemoryBuffer> Buffer) { 3522989816SDimitry Andric auto &PCM = PCMs[Filename]; 3622989816SDimitry Andric assert(!PCM.IsFinal && "Trying to override finalized PCM?"); 3722989816SDimitry Andric assert(!PCM.Buffer && "Trying to override tentative PCM?"); 3822989816SDimitry Andric PCM.Buffer = std::move(Buffer); 3922989816SDimitry Andric PCM.IsFinal = true; 4022989816SDimitry Andric return *PCM.Buffer; 4122989816SDimitry Andric } 4222989816SDimitry Andric 4322989816SDimitry Andric llvm::MemoryBuffer * lookupPCM(llvm::StringRef Filename) const4422989816SDimitry AndricInMemoryModuleCache::lookupPCM(llvm::StringRef Filename) const { 4522989816SDimitry Andric auto I = PCMs.find(Filename); 4622989816SDimitry Andric if (I == PCMs.end()) 4722989816SDimitry Andric return nullptr; 4822989816SDimitry Andric return I->second.Buffer.get(); 4922989816SDimitry Andric } 5022989816SDimitry Andric isPCMFinal(llvm::StringRef Filename) const5122989816SDimitry Andricbool InMemoryModuleCache::isPCMFinal(llvm::StringRef Filename) const { 5222989816SDimitry Andric return getPCMState(Filename) == Final; 5322989816SDimitry Andric } 5422989816SDimitry Andric shouldBuildPCM(llvm::StringRef Filename) const5522989816SDimitry Andricbool InMemoryModuleCache::shouldBuildPCM(llvm::StringRef Filename) const { 5622989816SDimitry Andric return getPCMState(Filename) == ToBuild; 5722989816SDimitry Andric } 5822989816SDimitry Andric tryToDropPCM(llvm::StringRef Filename)5922989816SDimitry Andricbool InMemoryModuleCache::tryToDropPCM(llvm::StringRef Filename) { 6022989816SDimitry Andric auto I = PCMs.find(Filename); 6122989816SDimitry Andric assert(I != PCMs.end() && "PCM to remove is unknown..."); 6222989816SDimitry Andric 6322989816SDimitry Andric auto &PCM = I->second; 6422989816SDimitry Andric assert(PCM.Buffer && "PCM to remove is scheduled to be built..."); 6522989816SDimitry Andric 6622989816SDimitry Andric if (PCM.IsFinal) 6722989816SDimitry Andric return true; 6822989816SDimitry Andric 6922989816SDimitry Andric PCM.Buffer.reset(); 7022989816SDimitry Andric return false; 7122989816SDimitry Andric } 7222989816SDimitry Andric finalizePCM(llvm::StringRef Filename)7322989816SDimitry Andricvoid InMemoryModuleCache::finalizePCM(llvm::StringRef Filename) { 7422989816SDimitry Andric auto I = PCMs.find(Filename); 7522989816SDimitry Andric assert(I != PCMs.end() && "PCM to finalize is unknown..."); 7622989816SDimitry Andric 7722989816SDimitry Andric auto &PCM = I->second; 7822989816SDimitry Andric assert(PCM.Buffer && "Trying to finalize a dropped PCM..."); 7922989816SDimitry Andric PCM.IsFinal = true; 8022989816SDimitry Andric } 81