/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/include/lldb/Target/PathMappingList.h
Line | Count | Source |
1 | | //===-- PathMappingList.h ---------------------------------------*- 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 LLDB_TARGET_PATHMAPPINGLIST_H |
10 | | #define LLDB_TARGET_PATHMAPPINGLIST_H |
11 | | |
12 | | #include <map> |
13 | | #include <vector> |
14 | | #include "lldb/Utility/ConstString.h" |
15 | | #include "lldb/Utility/Status.h" |
16 | | |
17 | | namespace lldb_private { |
18 | | |
19 | | class PathMappingList { |
20 | | public: |
21 | | typedef void (*ChangedCallback)(const PathMappingList &path_list, |
22 | | void *baton); |
23 | | |
24 | | // Constructors and Destructors |
25 | | PathMappingList(); |
26 | | |
27 | | PathMappingList(ChangedCallback callback, void *callback_baton); |
28 | | |
29 | | PathMappingList(const PathMappingList &rhs); |
30 | | |
31 | | ~PathMappingList(); |
32 | | |
33 | | const PathMappingList &operator=(const PathMappingList &rhs); |
34 | | |
35 | | void Append(llvm::StringRef path, llvm::StringRef replacement, bool notify); |
36 | | |
37 | | void Append(const PathMappingList &rhs, bool notify); |
38 | | |
39 | | void Clear(bool notify); |
40 | | |
41 | | // By default, dump all pairs. |
42 | | void Dump(Stream *s, int pair_index = -1); |
43 | | |
44 | 1.34k | bool IsEmpty() const { return m_pairs.empty(); } |
45 | | |
46 | 417k | size_t GetSize() const { return m_pairs.size(); } |
47 | | |
48 | | bool GetPathsAtIndex(uint32_t idx, ConstString &path, |
49 | | ConstString &new_path) const; |
50 | | |
51 | | void Insert(llvm::StringRef path, llvm::StringRef replacement, |
52 | | uint32_t insert_idx, bool notify); |
53 | | |
54 | | bool Remove(size_t index, bool notify); |
55 | | |
56 | | bool Remove(ConstString path, bool notify); |
57 | | |
58 | | bool Replace(llvm::StringRef path, llvm::StringRef replacement, bool notify); |
59 | | |
60 | | bool Replace(llvm::StringRef path, llvm::StringRef replacement, |
61 | | uint32_t index, bool notify); |
62 | | bool RemapPath(ConstString path, ConstString &new_path) const; |
63 | | |
64 | | /// Remaps a source file given \a path into \a new_path. |
65 | | /// |
66 | | /// Remaps \a path if any source remappings match. This function |
67 | | /// does NOT stat the file system so it can be used in tight loops |
68 | | /// where debug info is being parsed. |
69 | | /// |
70 | | /// \param[in] path |
71 | | /// The original source file path to try and remap. |
72 | | /// |
73 | | /// \param[in] only_if_exists |
74 | | /// If \b true, besides matching \p path with the remapping rules, this |
75 | | /// tries to check with the filesystem that the remapped file exists. If |
76 | | /// no valid file is found, \b None is returned. This might be expensive, |
77 | | /// specially on a network. |
78 | | /// |
79 | | /// If \b false, then the existence of the returned remapping is not |
80 | | /// checked. |
81 | | /// |
82 | | /// \return |
83 | | /// The remapped filespec that may or may not exist on disk. |
84 | | llvm::Optional<FileSpec> RemapPath(llvm::StringRef path, |
85 | | bool only_if_exists = false) const; |
86 | | bool RemapPath(const char *, std::string &) const = delete; |
87 | | |
88 | | bool ReverseRemapPath(const FileSpec &file, FileSpec &fixed) const; |
89 | | |
90 | | /// Finds a source file given a file spec using the path remappings. |
91 | | /// |
92 | | /// Tries to resolve \a orig_spec by checking the path remappings. |
93 | | /// It makes sure the file exists by checking with the file system, |
94 | | /// so this call can be expensive if the remappings are on a network |
95 | | /// or are even on the local file system, so use this function |
96 | | /// sparingly (not in a tight debug info parsing loop). |
97 | | /// |
98 | | /// \param[in] orig_spec |
99 | | /// The original source file path to try and remap. |
100 | | /// |
101 | | /// \return |
102 | | /// The newly remapped filespec that is guaranteed to exist. |
103 | | llvm::Optional<FileSpec> FindFile(const FileSpec &orig_spec) const; |
104 | | |
105 | | uint32_t FindIndexForPath(llvm::StringRef path) const; |
106 | | |
107 | 16.3k | uint32_t GetModificationID() const { return m_mod_id; } |
108 | | |
109 | | protected: |
110 | | typedef std::pair<ConstString, ConstString> pair; |
111 | | typedef std::vector<pair> collection; |
112 | | typedef collection::iterator iterator; |
113 | | typedef collection::const_iterator const_iterator; |
114 | | |
115 | | iterator FindIteratorForPath(ConstString path); |
116 | | |
117 | | const_iterator FindIteratorForPath(ConstString path) const; |
118 | | |
119 | | collection m_pairs; |
120 | | ChangedCallback m_callback = nullptr; |
121 | | void *m_callback_baton = nullptr; |
122 | | uint32_t m_mod_id = 0; // Incremented anytime anything is added or removed. |
123 | | }; |
124 | | |
125 | | } // namespace lldb_private |
126 | | |
127 | | #endif // LLDB_TARGET_PATHMAPPINGLIST_H |