xref: /src/contrib/llvm-project/clang/lib/Serialization/InMemoryModuleCache.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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 Andric InMemoryModuleCache::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 Andric InMemoryModuleCache::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 Andric InMemoryModuleCache::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 Andric InMemoryModuleCache::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 Andric bool InMemoryModuleCache::isPCMFinal(llvm::StringRef Filename) const {
5222989816SDimitry Andric   return getPCMState(Filename) == Final;
5322989816SDimitry Andric }
5422989816SDimitry Andric 
shouldBuildPCM(llvm::StringRef Filename) const5522989816SDimitry Andric bool InMemoryModuleCache::shouldBuildPCM(llvm::StringRef Filename) const {
5622989816SDimitry Andric   return getPCMState(Filename) == ToBuild;
5722989816SDimitry Andric }
5822989816SDimitry Andric 
tryToDropPCM(llvm::StringRef Filename)5922989816SDimitry Andric bool 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 Andric void 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