Path: blob/main/contrib/llvm-project/clang/lib/Serialization/InMemoryModuleCache.cpp
35232 views
//===- InMemoryModuleCache.cpp - Cache for loaded memory buffers ----------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "clang/Serialization/InMemoryModuleCache.h"9#include "llvm/Support/MemoryBuffer.h"1011using namespace clang;1213InMemoryModuleCache::State14InMemoryModuleCache::getPCMState(llvm::StringRef Filename) const {15auto I = PCMs.find(Filename);16if (I == PCMs.end())17return Unknown;18if (I->second.IsFinal)19return Final;20return I->second.Buffer ? Tentative : ToBuild;21}2223llvm::MemoryBuffer &24InMemoryModuleCache::addPCM(llvm::StringRef Filename,25std::unique_ptr<llvm::MemoryBuffer> Buffer) {26auto Insertion = PCMs.insert(std::make_pair(Filename, std::move(Buffer)));27assert(Insertion.second && "Already has a PCM");28return *Insertion.first->second.Buffer;29}3031llvm::MemoryBuffer &32InMemoryModuleCache::addBuiltPCM(llvm::StringRef Filename,33std::unique_ptr<llvm::MemoryBuffer> Buffer) {34auto &PCM = PCMs[Filename];35assert(!PCM.IsFinal && "Trying to override finalized PCM?");36assert(!PCM.Buffer && "Trying to override tentative PCM?");37PCM.Buffer = std::move(Buffer);38PCM.IsFinal = true;39return *PCM.Buffer;40}4142llvm::MemoryBuffer *43InMemoryModuleCache::lookupPCM(llvm::StringRef Filename) const {44auto I = PCMs.find(Filename);45if (I == PCMs.end())46return nullptr;47return I->second.Buffer.get();48}4950bool InMemoryModuleCache::isPCMFinal(llvm::StringRef Filename) const {51return getPCMState(Filename) == Final;52}5354bool InMemoryModuleCache::shouldBuildPCM(llvm::StringRef Filename) const {55return getPCMState(Filename) == ToBuild;56}5758bool InMemoryModuleCache::tryToDropPCM(llvm::StringRef Filename) {59auto I = PCMs.find(Filename);60assert(I != PCMs.end() && "PCM to remove is unknown...");6162auto &PCM = I->second;63assert(PCM.Buffer && "PCM to remove is scheduled to be built...");6465if (PCM.IsFinal)66return true;6768PCM.Buffer.reset();69return false;70}7172void InMemoryModuleCache::finalizePCM(llvm::StringRef Filename) {73auto I = PCMs.find(Filename);74assert(I != PCMs.end() && "PCM to finalize is unknown...");7576auto &PCM = I->second;77assert(PCM.Buffer && "Trying to finalize a dropped PCM...");78PCM.IsFinal = true;79}808182