13#ifndef LLVM_CLANG_FRONTEND_PRECOMPILEDPREAMBLE_H
14#define LLVM_CLANG_FRONTEND_PRECOMPILEDPREAMBLE_H
18#include "llvm/ADT/IntrusiveRefCntPtr.h"
19#include "llvm/ADT/StringRef.h"
20#include "llvm/Support/MD5.h"
23#include <system_error>
35class CompilerInstance;
36class CompilerInvocation;
39class PCHContainerOperations;
43 const llvm::MemoryBufferRef &Buffer,
46class PreambleCallbacks;
53 struct PreambleFileHash;
84 static llvm::ErrorOr<PrecompiledPreamble>
89 std::shared_ptr<PCHContainerOperations> PCHContainerOps,
90 bool StoreInMemory, StringRef StoragePath,
107 return {PreambleBytes.data(), PreambleBytes.size()};
113 const llvm::MemoryBufferRef &MainFileBuffer,
126 llvm::MemoryBuffer *MainFileBuffer)
const;
133 llvm::MemoryBuffer *MainFileBuffer)
const;
137 std::vector<char> PreambleBytes,
138 bool PreambleEndsAtStartOfLine,
139 llvm::StringMap<PreambleFileHash> FilesInPreamble,
140 llvm::StringSet<> MissingFiles);
143 struct PreambleFileHash {
154 llvm::MD5::MD5Result MD5 = {};
156 static PreambleFileHash createForFile(off_t Size, time_t ModTime);
157 static PreambleFileHash
158 createForMemoryBuffer(
const llvm::MemoryBufferRef &Buffer);
160 friend bool operator==(
const PreambleFileHash &LHS,
161 const PreambleFileHash &RHS) {
162 return LHS.Size == RHS.Size && LHS.ModTime == RHS.ModTime &&
165 friend bool operator!=(
const PreambleFileHash &LHS,
166 const PreambleFileHash &RHS) {
167 return !(LHS == RHS);
173 void configurePreamble(PreambleBounds Bounds, CompilerInvocation &CI,
174 IntrusiveRefCntPtr<llvm::vfs::FileSystem> &VFS,
175 llvm::MemoryBuffer *MainFileBuffer)
const;
181 setupPreambleStorage(
const PCHStorage &Storage,
182 PreprocessorOptions &PreprocessorOpts,
183 IntrusiveRefCntPtr<llvm::vfs::FileSystem> &VFS);
186 std::unique_ptr<PCHStorage> Storage;
192 llvm::StringMap<PreambleFileHash> FilesInPreamble;
201 llvm::StringSet<> MissingFiles;
205 std::vector<char> PreambleBytes;
207 bool PreambleEndsAtStartOfLine;