xref: /netbsd-src/external/apache2/llvm/dist/clang/lib/Serialization/InMemoryModuleCache.cpp (revision 7330f729ccf0bd976a06f95fad452fe774fc7fd1)
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*7330f729Sjoerg InMemoryModuleCache::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*7330f729Sjoerg InMemoryModuleCache::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*7330f729Sjoerg InMemoryModuleCache::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*7330f729Sjoerg InMemoryModuleCache::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*7330f729Sjoerg bool InMemoryModuleCache::isPCMFinal(llvm::StringRef Filename) const {
52*7330f729Sjoerg   return getPCMState(Filename) == Final;
53*7330f729Sjoerg }
54*7330f729Sjoerg 
shouldBuildPCM(llvm::StringRef Filename) const55*7330f729Sjoerg bool InMemoryModuleCache::shouldBuildPCM(llvm::StringRef Filename) const {
56*7330f729Sjoerg   return getPCMState(Filename) == ToBuild;
57*7330f729Sjoerg }
58*7330f729Sjoerg 
tryToDropPCM(llvm::StringRef Filename)59*7330f729Sjoerg bool 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*7330f729Sjoerg void 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