xref: /llvm-project/clang/lib/Serialization/InMemoryModuleCache.cpp (revision 57a2eaf3c1aa1a08e9b474b873064e075c52daef)
18bef5cd4SDuncan P. N. Exon Smith //===- InMemoryModuleCache.cpp - Cache for loaded memory buffers ----------===//
28bef5cd4SDuncan P. N. Exon Smith //
38bef5cd4SDuncan P. N. Exon Smith // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48bef5cd4SDuncan P. N. Exon Smith // See https://llvm.org/LICENSE.txt for license information.
58bef5cd4SDuncan P. N. Exon Smith // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68bef5cd4SDuncan P. N. Exon Smith //
78bef5cd4SDuncan P. N. Exon Smith //===----------------------------------------------------------------------===//
88bef5cd4SDuncan P. N. Exon Smith 
98bef5cd4SDuncan P. N. Exon Smith #include "clang/Serialization/InMemoryModuleCache.h"
108bef5cd4SDuncan P. N. Exon Smith #include "llvm/Support/MemoryBuffer.h"
118bef5cd4SDuncan P. N. Exon Smith 
128bef5cd4SDuncan P. N. Exon Smith using namespace clang;
138bef5cd4SDuncan P. N. Exon Smith 
14*57a2eaf3SRumeet Dhindsa InMemoryModuleCache::State
getPCMState(llvm::StringRef Filename) const15*57a2eaf3SRumeet Dhindsa InMemoryModuleCache::getPCMState(llvm::StringRef Filename) const {
16*57a2eaf3SRumeet Dhindsa   auto I = PCMs.find(Filename);
17*57a2eaf3SRumeet Dhindsa   if (I == PCMs.end())
18*57a2eaf3SRumeet Dhindsa     return Unknown;
19*57a2eaf3SRumeet Dhindsa   if (I->second.IsFinal)
20*57a2eaf3SRumeet Dhindsa     return Final;
21*57a2eaf3SRumeet Dhindsa   return I->second.Buffer ? Tentative : ToBuild;
22*57a2eaf3SRumeet Dhindsa }
23*57a2eaf3SRumeet Dhindsa 
248bef5cd4SDuncan P. N. Exon Smith llvm::MemoryBuffer &
addPCM(llvm::StringRef Filename,std::unique_ptr<llvm::MemoryBuffer> Buffer)250a2be46cSDuncan P. N. Exon Smith InMemoryModuleCache::addPCM(llvm::StringRef Filename,
268bef5cd4SDuncan P. N. Exon Smith                             std::unique_ptr<llvm::MemoryBuffer> Buffer) {
270a2be46cSDuncan P. N. Exon Smith   auto Insertion = PCMs.insert(std::make_pair(Filename, std::move(Buffer)));
280a2be46cSDuncan P. N. Exon Smith   assert(Insertion.second && "Already has a PCM");
298bef5cd4SDuncan P. N. Exon Smith   return *Insertion.first->second.Buffer;
308bef5cd4SDuncan P. N. Exon Smith }
318bef5cd4SDuncan P. N. Exon Smith 
320a2be46cSDuncan P. N. Exon Smith llvm::MemoryBuffer &
addBuiltPCM(llvm::StringRef Filename,std::unique_ptr<llvm::MemoryBuffer> Buffer)33*57a2eaf3SRumeet Dhindsa InMemoryModuleCache::addBuiltPCM(llvm::StringRef Filename,
340a2be46cSDuncan P. N. Exon Smith                                  std::unique_ptr<llvm::MemoryBuffer> Buffer) {
350a2be46cSDuncan P. N. Exon Smith   auto &PCM = PCMs[Filename];
360a2be46cSDuncan P. N. Exon Smith   assert(!PCM.IsFinal && "Trying to override finalized PCM?");
37*57a2eaf3SRumeet Dhindsa   assert(!PCM.Buffer && "Trying to override tentative PCM?");
380a2be46cSDuncan P. N. Exon Smith   PCM.Buffer = std::move(Buffer);
390a2be46cSDuncan P. N. Exon Smith   PCM.IsFinal = true;
400a2be46cSDuncan P. N. Exon Smith   return *PCM.Buffer;
410a2be46cSDuncan P. N. Exon Smith }
420a2be46cSDuncan P. N. Exon Smith 
438bef5cd4SDuncan P. N. Exon Smith llvm::MemoryBuffer *
lookupPCM(llvm::StringRef Filename) const440a2be46cSDuncan P. N. Exon Smith InMemoryModuleCache::lookupPCM(llvm::StringRef Filename) const {
458bef5cd4SDuncan P. N. Exon Smith   auto I = PCMs.find(Filename);
468bef5cd4SDuncan P. N. Exon Smith   if (I == PCMs.end())
478bef5cd4SDuncan P. N. Exon Smith     return nullptr;
488bef5cd4SDuncan P. N. Exon Smith   return I->second.Buffer.get();
498bef5cd4SDuncan P. N. Exon Smith }
508bef5cd4SDuncan P. N. Exon Smith 
isPCMFinal(llvm::StringRef Filename) const510a2be46cSDuncan P. N. Exon Smith bool InMemoryModuleCache::isPCMFinal(llvm::StringRef Filename) const {
52*57a2eaf3SRumeet Dhindsa   return getPCMState(Filename) == Final;
538bef5cd4SDuncan P. N. Exon Smith }
548bef5cd4SDuncan P. N. Exon Smith 
shouldBuildPCM(llvm::StringRef Filename) const55*57a2eaf3SRumeet Dhindsa bool InMemoryModuleCache::shouldBuildPCM(llvm::StringRef Filename) const {
56*57a2eaf3SRumeet Dhindsa   return getPCMState(Filename) == ToBuild;
57*57a2eaf3SRumeet Dhindsa }
58*57a2eaf3SRumeet Dhindsa 
tryToDropPCM(llvm::StringRef Filename)59*57a2eaf3SRumeet Dhindsa bool InMemoryModuleCache::tryToDropPCM(llvm::StringRef Filename) {
608bef5cd4SDuncan P. N. Exon Smith   auto I = PCMs.find(Filename);
610a2be46cSDuncan P. N. Exon Smith   assert(I != PCMs.end() && "PCM to remove is unknown...");
620a2be46cSDuncan P. N. Exon Smith 
630a2be46cSDuncan P. N. Exon Smith   auto &PCM = I->second;
64*57a2eaf3SRumeet Dhindsa   assert(PCM.Buffer && "PCM to remove is scheduled to be built...");
65*57a2eaf3SRumeet Dhindsa 
660a2be46cSDuncan P. N. Exon Smith   if (PCM.IsFinal)
678bef5cd4SDuncan P. N. Exon Smith     return true;
688bef5cd4SDuncan P. N. Exon Smith 
69*57a2eaf3SRumeet Dhindsa   PCM.Buffer.reset();
708bef5cd4SDuncan P. N. Exon Smith   return false;
718bef5cd4SDuncan P. N. Exon Smith }
728bef5cd4SDuncan P. N. Exon Smith 
finalizePCM(llvm::StringRef Filename)730a2be46cSDuncan P. N. Exon Smith void InMemoryModuleCache::finalizePCM(llvm::StringRef Filename) {
740a2be46cSDuncan P. N. Exon Smith   auto I = PCMs.find(Filename);
750a2be46cSDuncan P. N. Exon Smith   assert(I != PCMs.end() && "PCM to finalize is unknown...");
760a2be46cSDuncan P. N. Exon Smith 
770a2be46cSDuncan P. N. Exon Smith   auto &PCM = I->second;
780a2be46cSDuncan P. N. Exon Smith   assert(PCM.Buffer && "Trying to finalize a dropped PCM...");
790a2be46cSDuncan P. N. Exon Smith   PCM.IsFinal = true;
808bef5cd4SDuncan P. N. Exon Smith }
81