Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- FileSystemStatCache.h - Caching for 'stat' calls ---------*- C++ -*-===//
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
/// \file
10
/// Defines the FileSystemStatCache interface.
11
//
12
//===----------------------------------------------------------------------===//
13
 
14
#ifndef LLVM_CLANG_BASIC_FILESYSTEMSTATCACHE_H
15
#define LLVM_CLANG_BASIC_FILESYSTEMSTATCACHE_H
16
 
17
#include "clang/Basic/LLVM.h"
18
#include "llvm/ADT/StringMap.h"
19
#include "llvm/ADT/StringRef.h"
20
#include "llvm/Support/Allocator.h"
21
#include "llvm/Support/FileSystem.h"
22
#include "llvm/Support/VirtualFileSystem.h"
23
#include <cstdint>
24
#include <ctime>
25
#include <memory>
26
#include <optional>
27
#include <string>
28
#include <utility>
29
 
30
namespace clang {
31
 
32
/// Abstract interface for introducing a FileManager cache for 'stat'
33
/// system calls, which is used by precompiled and pretokenized headers to
34
/// improve performance.
35
class FileSystemStatCache {
36
  virtual void anchor();
37
 
38
public:
39
  virtual ~FileSystemStatCache() = default;
40
 
41
  /// Get the 'stat' information for the specified path, using the cache
42
  /// to accelerate it if possible.
43
  ///
44
  /// \returns \c true if the path does not exist or \c false if it exists.
45
  ///
46
  /// If isFile is true, then this lookup should only return success for files
47
  /// (not directories).  If it is false this lookup should only return
48
  /// success for directories (not files).  On a successful file lookup, the
49
  /// implementation can optionally fill in \p F with a valid \p File object and
50
  /// the client guarantees that it will close it.
51
  static std::error_code
52
  get(StringRef Path, llvm::vfs::Status &Status, bool isFile,
53
      std::unique_ptr<llvm::vfs::File> *F,
54
      FileSystemStatCache *Cache, llvm::vfs::FileSystem &FS);
55
 
56
protected:
57
  // FIXME: The pointer here is a non-owning/optional reference to the
58
  // unique_ptr. std::optional<unique_ptr<vfs::File>&> might be nicer, but
59
  // Optional needs some work to support references so this isn't possible yet.
60
  virtual std::error_code getStat(StringRef Path, llvm::vfs::Status &Status,
61
                                  bool isFile,
62
                                  std::unique_ptr<llvm::vfs::File> *F,
63
                                  llvm::vfs::FileSystem &FS) = 0;
64
};
65
 
66
/// A stat "cache" that can be used by FileManager to keep
67
/// track of the results of stat() calls that occur throughout the
68
/// execution of the front end.
69
class MemorizeStatCalls : public FileSystemStatCache {
70
public:
71
  /// The set of stat() calls that have been seen.
72
  llvm::StringMap<llvm::vfs::Status, llvm::BumpPtrAllocator> StatCalls;
73
 
74
  using iterator =
75
      llvm::StringMap<llvm::vfs::Status,
76
                      llvm::BumpPtrAllocator>::const_iterator;
77
 
78
  iterator begin() const { return StatCalls.begin(); }
79
  iterator end() const { return StatCalls.end(); }
80
 
81
  std::error_code getStat(StringRef Path, llvm::vfs::Status &Status,
82
                          bool isFile,
83
                          std::unique_ptr<llvm::vfs::File> *F,
84
                          llvm::vfs::FileSystem &FS) override;
85
};
86
 
87
} // namespace clang
88
 
89
#endif // LLVM_CLANG_BASIC_FILESYSTEMSTATCACHE_H