Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 1 | //===--- SerializablePathCollection.h -- Index of paths ---------*- 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 | #ifndef LLVM_CLANG_INDEXSERIALIZATION_SERIALIZABLEPATHCOLLECTION_H | ||
| 10 | #define LLVM_CLANG_INDEXSERIALIZATION_SERIALIZABLEPATHCOLLECTION_H | ||
| 11 | |||
| 12 | #include "clang/Basic/FileManager.h" | ||
| 13 | #include "llvm/ADT/APInt.h" | ||
| 14 | #include "llvm/ADT/DenseMap.h" | ||
| 15 | #include "llvm/ADT/SmallString.h" | ||
| 16 | #include "llvm/ADT/StringMap.h" | ||
| 17 | #include "llvm/ADT/StringRef.h" | ||
| 18 | #include "llvm/ADT/iterator.h" | ||
| 19 | |||
| 20 | #include <string> | ||
| 21 | #include <vector> | ||
| 22 | |||
| 23 | namespace clang { | ||
| 24 | namespace index { | ||
| 25 | |||
| 26 | /// Pool of strings | ||
| 27 | class StringPool { | ||
| 28 | llvm::SmallString<512> Buffer; | ||
| 29 | |||
| 30 | public: | ||
| 31 | struct StringOffsetSize { | ||
| 32 | std::size_t Offset; | ||
| 33 | std::size_t Size; | ||
| 34 | |||
| 35 | StringOffsetSize(size_t Offset, size_t Size) : Offset(Offset), Size(Size) {} | ||
| 36 | }; | ||
| 37 | |||
| 38 | StringOffsetSize add(StringRef Str); | ||
| 39 | StringRef getBuffer() const { return Buffer; } | ||
| 40 | }; | ||
| 41 | |||
| 42 | /// Pool of filesystem paths backed by a StringPool | ||
| 43 | class PathPool { | ||
| 44 | public: | ||
| 45 |   /// Special root directory of a filesystem path. | ||
| 46 | enum class RootDirKind { | ||
| 47 | Regular = 0, | ||
| 48 | CurrentWorkDir = 1, | ||
| 49 | SysRoot = 2, | ||
| 50 | }; | ||
| 51 | |||
| 52 | struct DirPath { | ||
| 53 |     RootDirKind Root; | ||
| 54 | StringPool::StringOffsetSize Path; | ||
| 55 | |||
| 56 | DirPath(RootDirKind Root, const StringPool::StringOffsetSize &Path) | ||
| 57 | : Root(Root), Path(Path) {} | ||
| 58 | }; | ||
| 59 | |||
| 60 | struct FilePath { | ||
| 61 |     DirPath Dir; | ||
| 62 | StringPool::StringOffsetSize Filename; | ||
| 63 | |||
| 64 | FilePath(const DirPath &Dir, const StringPool::StringOffsetSize &Filename) | ||
| 65 | : Dir(Dir), Filename(Filename) {} | ||
| 66 | }; | ||
| 67 | |||
| 68 |   /// \returns index of the newly added file in FilePaths. | ||
| 69 | size_t addFilePath(RootDirKind Root, const StringPool::StringOffsetSize &Dir, | ||
| 70 | StringRef Filename); | ||
| 71 | |||
| 72 |   /// \returns offset in Paths and size of newly added directory. | ||
| 73 | StringPool::StringOffsetSize addDirPath(StringRef Dir); | ||
| 74 | |||
| 75 | llvm::ArrayRef<FilePath> getFilePaths() const; | ||
| 76 | |||
| 77 | StringRef getPaths() const; | ||
| 78 | |||
| 79 | private: | ||
| 80 |   StringPool Paths; | ||
| 81 | std::vector<FilePath> FilePaths; | ||
| 82 | }; | ||
| 83 | |||
| 84 | /// Stores file paths and produces serialization-friendly representation. | ||
| 85 | class SerializablePathCollection { | ||
| 86 | std::string WorkDir; | ||
| 87 | std::string SysRoot; | ||
| 88 | |||
| 89 |   PathPool Paths; | ||
| 90 | llvm::DenseMap<const clang::FileEntry *, std::size_t> UniqueFiles; | ||
| 91 | llvm::StringMap<PathPool::DirPath, llvm::BumpPtrAllocator> UniqueDirs; | ||
| 92 | |||
| 93 | public: | ||
| 94 | const StringPool::StringOffsetSize WorkDirPath; | ||
| 95 | const StringPool::StringOffsetSize SysRootPath; | ||
| 96 | const StringPool::StringOffsetSize OutputFilePath; | ||
| 97 | |||
| 98 | SerializablePathCollection(llvm::StringRef CurrentWorkDir, | ||
| 99 | llvm::StringRef SysRoot, | ||
| 100 | llvm::StringRef OutputFile); | ||
| 101 | |||
| 102 |   /// \returns buffer containing all the paths. | ||
| 103 | llvm::StringRef getPathsBuffer() const { return Paths.getPaths(); } | ||
| 104 | |||
| 105 |   /// \returns file paths (no directories) backed by buffer exposed in | ||
| 106 |   /// getPathsBuffer. | ||
| 107 | ArrayRef<PathPool::FilePath> getFilePaths() const { | ||
| 108 | return Paths.getFilePaths(); | ||
| 109 |   } | ||
| 110 | |||
| 111 |   /// Stores path to \p FE if it hasn't been stored yet. | ||
| 112 |   /// \returns index to array exposed by getPathsBuffer(). | ||
| 113 | size_t tryStoreFilePath(const clang::FileEntry &FE); | ||
| 114 | |||
| 115 | private: | ||
| 116 |   /// Stores \p Path if it is non-empty. | ||
| 117 |   /// Warning: this method doesn't check for uniqueness. | ||
| 118 |   /// \returns offset of \p Path value begin in buffer with stored paths. | ||
| 119 | StringPool::StringOffsetSize storePath(llvm::StringRef Path); | ||
| 120 | |||
| 121 |   /// Stores \p dirStr path if it hasn't been stored yet. | ||
| 122 | PathPool::DirPath tryStoreDirPath(llvm::StringRef dirStr); | ||
| 123 | }; | ||
| 124 | |||
| 125 | } // namespace index | ||
| 126 | } // namespace clang | ||
| 127 | |||
| 128 | #endif // LLVM_CLANG_INDEXSERIALIZATION_SERIALIZABLEPATHCOLLECTION_H |