1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00
llvm-mirror/include/llvm/Support/FileCollector.h
Alex Lorenz 1931cc5829 [FileCollector] Add a VFS that records FS accesses using the FileCollector
This patch adds a VFS that can be overlaid on top of another VFS
to record file system accesses using the FileCollector.
This can help to gather files that are needed for reproducers.

Differential Revision: https://reviews.llvm.org/D65411

llvm-svn: 367278
2019-07-29 23:38:30 +00:00

80 lines
2.4 KiB
C++

//===-- FileCollector.h -----------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SUPPORT_FILE_COLLECTOR_H
#define LLVM_SUPPORT_FILE_COLLECTOR_H
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringSet.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/VirtualFileSystem.h"
#include <mutex>
namespace llvm {
/// Collects files into a directory and generates a mapping that can be used by
/// the VFS.
class FileCollector {
public:
FileCollector(std::string Root, std::string OverlayRoot);
void addFile(const Twine &file);
/// Write the yaml mapping (for the VFS) to the given file.
std::error_code writeMapping(StringRef mapping_file);
/// Copy the files into the root directory.
///
/// When StopOnError is true (the default) we abort as soon as one file
/// cannot be copied. This is relatively common, for example when a file was
/// removed after it was added to the mapping.
std::error_code copyFiles(bool StopOnError = true);
/// Create a VFS that collects all the paths that might be looked at by the
/// file system accesses.
static IntrusiveRefCntPtr<vfs::FileSystem>
createCollectorVFS(IntrusiveRefCntPtr<vfs::FileSystem> BaseFS,
std::shared_ptr<FileCollector> Collector);
private:
void addFileImpl(StringRef SrcPath);
bool markAsSeen(StringRef Path) { return Seen.insert(Path).second; }
bool getRealPath(StringRef SrcPath, SmallVectorImpl<char> &Result);
void addFileToMapping(StringRef VirtualPath, StringRef RealPath) {
VFSWriter.addFileMapping(VirtualPath, RealPath);
}
protected:
/// Synchronizes adding files.
std::mutex Mutex;
/// The root directory where files are copied.
std::string Root;
/// The root directory where the VFS overlay lives.
std::string OverlayRoot;
/// Tracks already seen files so they can be skipped.
StringSet<> Seen;
/// The yaml mapping writer.
vfs::YAMLVFSWriter VFSWriter;
/// Caches RealPath calls when resolving symlinks.
StringMap<std::string> SymlinkMap;
};
} // end namespace llvm
#endif // LLVM_SUPPORT_FILE_COLLECTOR_H