clang: include/clang/Basic/FileManager.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14#ifndef LLVM_CLANG_BASIC_FILEMANAGER_H

15#define LLVM_CLANG_BASIC_FILEMANAGER_H

16

21#include "llvm/ADT/DenseMap.h"

22#include "llvm/ADT/IntrusiveRefCntPtr.h"

23#include "llvm/ADT/PointerUnion.h"

24#include "llvm/ADT/SmallVector.h"

25#include "llvm/ADT/StringMap.h"

26#include "llvm/ADT/StringRef.h"

27#include "llvm/Support/Allocator.h"

28#include "llvm/Support/ErrorOr.h"

29#include "llvm/Support/FileSystem.h"

30#include "llvm/Support/VirtualFileSystem.h"

31#include

32#include

33#include

34#include

35

36namespace llvm {

37

38class MemoryBuffer;

39

40}

41

43

44class FileSystemStatCache;

45

46

47

48

49

50

51

52

56 llvm::SpecificBumpPtrAllocator FilesAlloc;

57 llvm::SpecificBumpPtrAllocator DirsAlloc;

58

59

60 llvm::DenseMap<llvm::sys::fs::UniqueID, DirectoryEntry *> UniqueRealDirs;

61

62

63 llvm::DenseMap<llvm::sys::fs::UniqueID, FileEntry *> UniqueRealFiles;

64

65

66

67

68

70

72

73

74

76

77

78

79

80

81

82

83

84

85

86 llvm::StringMap<llvm::ErrorOr<DirectoryEntry &>, llvm::BumpPtrAllocator>

87 SeenDirEntries;

88

89

90

91

92

93

94 llvm::StringMap<llvm::ErrorOrFileEntryRef::MapValue, llvm::BumpPtrAllocator>

95 SeenFileEntries;

96

97

98

99

100

101 std::unique_ptr<llvm::StringMap<llvm::ErrorOrFileEntryRef::MapValue>>

102 SeenBypassFileEntries;

103

104

106

107

108 llvm::DenseMap<const void *, llvm::StringRef> CanonicalNames;

109

110

111 llvm::BumpPtrAllocator CanonicalNameStorage;

112

113

114

115 unsigned NextFileUID;

116

117

118 unsigned NumDirLookups = 0;

119 unsigned NumFileLookups = 0;

120 unsigned NumDirCacheMisses = 0;

121 unsigned NumFileCacheMisses = 0;

122

123

124 std::unique_ptr StatCache;

125

126 std::error_code getStatValue(StringRef Path, llvm::vfs::Status &Status,

127 bool isFile, std::unique_ptrllvm::vfs::File *F,

128 bool IsText = true);

129

130

131

132 void addAncestorsAsVirtualDirs(StringRef Path);

133

134

136

137public:

138

139

140

141

145

146

147

148

149

150

151

152

153 void setStatCache(std::unique_ptr statCache);

154

155

157

158

160

161

162

163

164

165

166

167

168

169

170

172 bool CacheFailure = true);

173

174

176 bool CacheFailure = true) {

177 return llvm::expectedToOptional(getDirectoryRef(DirName, CacheFailure));

178 }

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193 LLVM_DEPRECATED("Functions returning DirectoryEntry are deprecated.",

194 "getOptionalDirectoryRef()")

196 getDirectory(StringRef DirName, bool CacheFailure = true);

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

215 getFile(StringRef Filename, bool OpenFile = false, bool CacheFailure = true);

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

232 bool OpenFile = false,

233 bool CacheFailure = true,

234 bool IsText = true);

235

236

237

238

239

240

241

243

244

246 bool OpenFile = false,

247 bool CacheFailure = true) {

248 return llvm::expectedToOptional(

250 }

251

252

255

259 return FS;

260 }

261

262

263

265

267 this->FS = std::move(FS);

268 }

269

270

271

272

273

276

278 "getVirtualFileRef()")

281

282

283

284

285

286

287

288

289

291

292

293

294

295

296

297 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>

299 bool RequiresNullTerminator = true,

300 std::optional<int64_t> MaybeLimit = std::nullopt,

301 bool IsText = true);

302 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>

304 bool RequiresNullTerminator = true,

305 std::optional<int64_t> MaybeLimit = std::nullopt,

306 bool IsText = true) const {

307 return getBufferForFileImpl(Filename,

308 MaybeLimit.value_or(-1),

309 isVolatile, RequiresNullTerminator, IsText);

310 }

311

312private:

313 llvm::ErrorOr<std::unique_ptrllvm::MemoryBuffer>

314 getBufferForFileImpl(StringRef Filename, int64_t FileSize, bool isVolatile,

315 bool RequiresNullTerminator, bool IsText) const;

316

317 DirectoryEntry *&getRealDirEntry(const llvm::vfs::Status &Status);

318

319public:

320

321

322

323

324

325

327 llvm::vfs::Status &Result);

328

329

330

331

332

334

335

336

337

339

340

341

342 void

344

345

346

347

348

349

351

352

353

354

355

356

358

359private:

360

361

362

363 StringRef getCanonicalName(const void *Entry, StringRef Name);

364

365public:

367

368

369

371};

372

373}

374

375#endif

Defines interfaces for clang::DirectoryEntry and clang::DirectoryEntryRef.

Defines interfaces for clang::FileEntry and clang::FileEntryRef.

Defines the clang::FileSystemOptions interface.

Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.

A reference to a DirectoryEntry that includes the name of the directory as it was accessed by the Fil...

Cached information about one directory (either on disk or in the virtual file system).

A reference to a FileEntry that includes the name of the file as it was accessed by the FileManager's...

Cached information about one file (either on disk or in the virtual file system).

Implements support for file system lookup, file system caching, and directory search management.

void AddStats(const FileManager &Other)

Import statistics from a child FileManager and add them to this current FileManager.

void trackVFSUsage(bool Active)

Enable or disable tracking of VFS usage.

void clearStatCache()

Removes the FileSystemStatCache object from the manager.

off_t time_t ModificationTime

llvm::vfs::FileSystem & getVirtualFileSystem() const

llvm::ErrorOr< std::unique_ptr< llvm::MemoryBuffer > > getBufferForFile(FileEntryRef Entry, bool isVolatile=false, bool RequiresNullTerminator=true, std::optional< int64_t > MaybeLimit=std::nullopt, bool IsText=true)

Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...

std::error_code getNoncachedStatValue(StringRef Path, llvm::vfs::Status &Result)

Get the 'stat' information for the given Path.

OptionalFileEntryRef getOptionalFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true)

Get a FileEntryRef if it exists, without doing anything on error.

llvm::Expected< FileEntryRef > getSTDIN()

Get the FileEntryRef for stdin, returning an error if stdin cannot be read.

StringRef getCanonicalName(DirectoryEntryRef Dir)

Retrieve the canonical name for a given directory.

void GetUniqueIDMapping(SmallVectorImpl< OptionalFileEntryRef > &UIDToFiles) const

Produce an array mapping from the unique IDs assigned to each file to the corresponding FileEntryRef.

bool makeAbsolutePath(SmallVectorImpl< char > &Path) const

Makes Path absolute taking into account FileSystemOptions and the working directory option.

LLVM_DEPRECATED("Functions returning FileEntry are deprecated.", "getVirtualFileRef()") const FileEntry *getVirtualFile(StringRef Filename

llvm::Expected< DirectoryEntryRef > getDirectoryRef(StringRef DirName, bool CacheFailure=true)

Lookup, cache, and verify the specified directory (real or virtual).

void setStatCache(std::unique_ptr< FileSystemStatCache > statCache)

Installs the provided FileSystemStatCache object within the FileManager.

FileSystemOptions & getFileSystemOpts()

Returns the current file system options.

llvm::IntrusiveRefCntPtr< llvm::vfs::FileSystem > getVirtualFileSystemPtr() const

const FileSystemOptions & getFileSystemOpts() const

FileEntryRef getVirtualFileRef(StringRef Filename, off_t Size, time_t ModificationTime)

Retrieve a file entry for a "virtual" file that acts as if there were a file with the given name on d...

size_t getNumUniqueRealFiles() const

Returns the number of unique real file entries cached by the file manager.

bool FixupRelativePath(SmallVectorImpl< char > &path) const

If path is not absolute and FileSystemOptions set the working directory, the path is modified to be r...

OptionalFileEntryRef getBypassFile(FileEntryRef VFE)

Retrieve a FileEntry that bypasses VFE, which is expected to be a virtual file entry,...

void setVirtualFileSystem(IntrusiveRefCntPtr< llvm::vfs::FileSystem > FS)

OptionalDirectoryEntryRef getOptionalDirectoryRef(StringRef DirName, bool CacheFailure=true)

Get a DirectoryEntryRef if it exists, without doing anything on error.

LLVM_DEPRECATED("Functions returning DirectoryEntry are deprecated.", "getOptionalDirectoryRef()") llvm LLVM_DEPRECATED("Functions returning FileEntry are deprecated.", "getOptionalFileRef()") llvm llvm::Expected< FileEntryRef > getFileRef(StringRef Filename, bool OpenFile=false, bool CacheFailure=true, bool IsText=true)

Lookup, cache, and verify the specified directory (real or virtual).

Keeps track of options that affect how file operations are performed.

The JSON file list parser is used to communicate input to InstallAPI.

@ Result

The result type of a method or function.

@ Other

Other implicit parameter.

Diagnostic wrappers for TextAPI types for error reporting.