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