annotate llvm/tools/dsymutil/BinaryHolder.cpp @ 236:c4bab56944e8 llvm-original

LLVM 16
author kono
date Wed, 09 Nov 2022 17:45:10 +0900
parents 79ff65ed7e25
children 1f2b6ac9f198
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-- BinaryHolder.cpp --------------------------------------------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 //
anatofuz
parents:
diff changeset
9 // This program is a utility that aims to be a dropin replacement for
anatofuz
parents:
diff changeset
10 // Darwin's dsymutil.
anatofuz
parents:
diff changeset
11 //
anatofuz
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
13
anatofuz
parents:
diff changeset
14 #include "BinaryHolder.h"
anatofuz
parents:
diff changeset
15 #include "llvm/Object/MachO.h"
anatofuz
parents:
diff changeset
16 #include "llvm/Support/WithColor.h"
anatofuz
parents:
diff changeset
17 #include "llvm/Support/raw_ostream.h"
anatofuz
parents:
diff changeset
18
anatofuz
parents:
diff changeset
19 namespace llvm {
anatofuz
parents:
diff changeset
20 namespace dsymutil {
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 static std::pair<StringRef, StringRef>
anatofuz
parents:
diff changeset
23 getArchiveAndObjectName(StringRef Filename) {
anatofuz
parents:
diff changeset
24 StringRef Archive = Filename.substr(0, Filename.rfind('('));
anatofuz
parents:
diff changeset
25 StringRef Object = Filename.substr(Archive.size() + 1).drop_back();
anatofuz
parents:
diff changeset
26 return {Archive, Object};
anatofuz
parents:
diff changeset
27 }
anatofuz
parents:
diff changeset
28
anatofuz
parents:
diff changeset
29 static bool isArchive(StringRef Filename) { return Filename.endswith(")"); }
anatofuz
parents:
diff changeset
30
anatofuz
parents:
diff changeset
31 static std::vector<MemoryBufferRef>
anatofuz
parents:
diff changeset
32 getMachOFatMemoryBuffers(StringRef Filename, MemoryBuffer &Mem,
anatofuz
parents:
diff changeset
33 object::MachOUniversalBinary &Fat) {
anatofuz
parents:
diff changeset
34 std::vector<MemoryBufferRef> Buffers;
anatofuz
parents:
diff changeset
35 StringRef FatData = Fat.getData();
anatofuz
parents:
diff changeset
36 for (auto It = Fat.begin_objects(), End = Fat.end_objects(); It != End;
anatofuz
parents:
diff changeset
37 ++It) {
anatofuz
parents:
diff changeset
38 StringRef ObjData = FatData.substr(It->getOffset(), It->getSize());
anatofuz
parents:
diff changeset
39 Buffers.emplace_back(ObjData, Filename);
anatofuz
parents:
diff changeset
40 }
anatofuz
parents:
diff changeset
41 return Buffers;
anatofuz
parents:
diff changeset
42 }
anatofuz
parents:
diff changeset
43
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
44 Error BinaryHolder::ArchiveEntry::load(IntrusiveRefCntPtr<vfs::FileSystem> VFS,
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
45 StringRef Filename,
150
anatofuz
parents:
diff changeset
46 TimestampTy Timestamp, bool Verbose) {
anatofuz
parents:
diff changeset
47 StringRef ArchiveFilename = getArchiveAndObjectName(Filename).first;
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 // Try to load archive and force it to be memory mapped.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
50 auto ErrOrBuff = (ArchiveFilename == "-")
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
51 ? MemoryBuffer::getSTDIN()
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
52 : VFS->getBufferForFile(ArchiveFilename, -1, false);
150
anatofuz
parents:
diff changeset
53 if (auto Err = ErrOrBuff.getError())
anatofuz
parents:
diff changeset
54 return errorCodeToError(Err);
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 MemBuffer = std::move(*ErrOrBuff);
anatofuz
parents:
diff changeset
57
anatofuz
parents:
diff changeset
58 if (Verbose)
anatofuz
parents:
diff changeset
59 WithColor::note() << "loaded archive '" << ArchiveFilename << "'\n";
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 // Load one or more archive buffers, depending on whether we're dealing with
anatofuz
parents:
diff changeset
62 // a fat binary.
anatofuz
parents:
diff changeset
63 std::vector<MemoryBufferRef> ArchiveBuffers;
anatofuz
parents:
diff changeset
64
anatofuz
parents:
diff changeset
65 auto ErrOrFat =
anatofuz
parents:
diff changeset
66 object::MachOUniversalBinary::create(MemBuffer->getMemBufferRef());
anatofuz
parents:
diff changeset
67 if (!ErrOrFat) {
anatofuz
parents:
diff changeset
68 consumeError(ErrOrFat.takeError());
anatofuz
parents:
diff changeset
69 ArchiveBuffers.push_back(MemBuffer->getMemBufferRef());
anatofuz
parents:
diff changeset
70 } else {
anatofuz
parents:
diff changeset
71 FatBinary = std::move(*ErrOrFat);
anatofuz
parents:
diff changeset
72 FatBinaryName = std::string(ArchiveFilename);
anatofuz
parents:
diff changeset
73 ArchiveBuffers =
anatofuz
parents:
diff changeset
74 getMachOFatMemoryBuffers(FatBinaryName, *MemBuffer, *FatBinary);
anatofuz
parents:
diff changeset
75 }
anatofuz
parents:
diff changeset
76
anatofuz
parents:
diff changeset
77 // Finally, try to load the archives.
anatofuz
parents:
diff changeset
78 Archives.reserve(ArchiveBuffers.size());
anatofuz
parents:
diff changeset
79 for (auto MemRef : ArchiveBuffers) {
anatofuz
parents:
diff changeset
80 auto ErrOrArchive = object::Archive::create(MemRef);
anatofuz
parents:
diff changeset
81 if (!ErrOrArchive)
anatofuz
parents:
diff changeset
82 return ErrOrArchive.takeError();
anatofuz
parents:
diff changeset
83 Archives.push_back(std::move(*ErrOrArchive));
anatofuz
parents:
diff changeset
84 }
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 return Error::success();
anatofuz
parents:
diff changeset
87 }
anatofuz
parents:
diff changeset
88
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
89 Error BinaryHolder::ObjectEntry::load(IntrusiveRefCntPtr<vfs::FileSystem> VFS,
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
90 StringRef Filename, TimestampTy Timestamp,
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
91 bool Verbose) {
150
anatofuz
parents:
diff changeset
92 // Try to load regular binary and force it to be memory mapped.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
93 auto ErrOrBuff = (Filename == "-")
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
94 ? MemoryBuffer::getSTDIN()
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
95 : VFS->getBufferForFile(Filename, -1, false);
150
anatofuz
parents:
diff changeset
96 if (auto Err = ErrOrBuff.getError())
anatofuz
parents:
diff changeset
97 return errorCodeToError(Err);
anatofuz
parents:
diff changeset
98
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
99 if (Filename != "-" && Timestamp != sys::TimePoint<>()) {
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
100 llvm::ErrorOr<vfs::Status> Stat = VFS->status(Filename);
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
101 if (!Stat)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
102 return errorCodeToError(Stat.getError());
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
103 if (Timestamp != std::chrono::time_point_cast<std::chrono::seconds>(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
104 Stat->getLastModificationTime()))
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
105 WithColor::warning() << Filename
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
106 << ": timestamp mismatch between object file ("
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
107 << Stat->getLastModificationTime()
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
108 << ") and debug map (" << Timestamp << ")\n";
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
109 }
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
110
150
anatofuz
parents:
diff changeset
111 MemBuffer = std::move(*ErrOrBuff);
anatofuz
parents:
diff changeset
112
anatofuz
parents:
diff changeset
113 if (Verbose)
anatofuz
parents:
diff changeset
114 WithColor::note() << "loaded object.\n";
anatofuz
parents:
diff changeset
115
anatofuz
parents:
diff changeset
116 // Load one or more object buffers, depending on whether we're dealing with a
anatofuz
parents:
diff changeset
117 // fat binary.
anatofuz
parents:
diff changeset
118 std::vector<MemoryBufferRef> ObjectBuffers;
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 auto ErrOrFat =
anatofuz
parents:
diff changeset
121 object::MachOUniversalBinary::create(MemBuffer->getMemBufferRef());
anatofuz
parents:
diff changeset
122 if (!ErrOrFat) {
anatofuz
parents:
diff changeset
123 consumeError(ErrOrFat.takeError());
anatofuz
parents:
diff changeset
124 ObjectBuffers.push_back(MemBuffer->getMemBufferRef());
anatofuz
parents:
diff changeset
125 } else {
anatofuz
parents:
diff changeset
126 FatBinary = std::move(*ErrOrFat);
anatofuz
parents:
diff changeset
127 FatBinaryName = std::string(Filename);
anatofuz
parents:
diff changeset
128 ObjectBuffers =
anatofuz
parents:
diff changeset
129 getMachOFatMemoryBuffers(FatBinaryName, *MemBuffer, *FatBinary);
anatofuz
parents:
diff changeset
130 }
anatofuz
parents:
diff changeset
131
anatofuz
parents:
diff changeset
132 Objects.reserve(ObjectBuffers.size());
anatofuz
parents:
diff changeset
133 for (auto MemRef : ObjectBuffers) {
anatofuz
parents:
diff changeset
134 auto ErrOrObjectFile = object::ObjectFile::createObjectFile(MemRef);
anatofuz
parents:
diff changeset
135 if (!ErrOrObjectFile)
anatofuz
parents:
diff changeset
136 return ErrOrObjectFile.takeError();
anatofuz
parents:
diff changeset
137 Objects.push_back(std::move(*ErrOrObjectFile));
anatofuz
parents:
diff changeset
138 }
anatofuz
parents:
diff changeset
139
anatofuz
parents:
diff changeset
140 return Error::success();
anatofuz
parents:
diff changeset
141 }
anatofuz
parents:
diff changeset
142
anatofuz
parents:
diff changeset
143 std::vector<const object::ObjectFile *>
anatofuz
parents:
diff changeset
144 BinaryHolder::ObjectEntry::getObjects() const {
anatofuz
parents:
diff changeset
145 std::vector<const object::ObjectFile *> Result;
anatofuz
parents:
diff changeset
146 Result.reserve(Objects.size());
anatofuz
parents:
diff changeset
147 for (auto &Object : Objects) {
anatofuz
parents:
diff changeset
148 Result.push_back(Object.get());
anatofuz
parents:
diff changeset
149 }
anatofuz
parents:
diff changeset
150 return Result;
anatofuz
parents:
diff changeset
151 }
anatofuz
parents:
diff changeset
152 Expected<const object::ObjectFile &>
anatofuz
parents:
diff changeset
153 BinaryHolder::ObjectEntry::getObject(const Triple &T) const {
anatofuz
parents:
diff changeset
154 for (const auto &Obj : Objects) {
anatofuz
parents:
diff changeset
155 if (const auto *MachO = dyn_cast<object::MachOObjectFile>(Obj.get())) {
anatofuz
parents:
diff changeset
156 if (MachO->getArchTriple().str() == T.str())
anatofuz
parents:
diff changeset
157 return *MachO;
anatofuz
parents:
diff changeset
158 } else if (Obj->getArch() == T.getArch())
anatofuz
parents:
diff changeset
159 return *Obj;
anatofuz
parents:
diff changeset
160 }
anatofuz
parents:
diff changeset
161 return errorCodeToError(object::object_error::arch_not_found);
anatofuz
parents:
diff changeset
162 }
anatofuz
parents:
diff changeset
163
anatofuz
parents:
diff changeset
164 Expected<const BinaryHolder::ObjectEntry &>
anatofuz
parents:
diff changeset
165 BinaryHolder::ArchiveEntry::getObjectEntry(StringRef Filename,
anatofuz
parents:
diff changeset
166 TimestampTy Timestamp,
anatofuz
parents:
diff changeset
167 bool Verbose) {
anatofuz
parents:
diff changeset
168 StringRef ArchiveFilename;
anatofuz
parents:
diff changeset
169 StringRef ObjectFilename;
anatofuz
parents:
diff changeset
170 std::tie(ArchiveFilename, ObjectFilename) = getArchiveAndObjectName(Filename);
anatofuz
parents:
diff changeset
171 KeyTy Key = {ObjectFilename, Timestamp};
anatofuz
parents:
diff changeset
172
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
173 // Try the cache first.
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
174 std::lock_guard<std::mutex> Lock(MemberCacheMutex);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
175 if (MemberCache.count(Key))
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
176 return *MemberCache[Key].get();
150
anatofuz
parents:
diff changeset
177
anatofuz
parents:
diff changeset
178 // Create a new ObjectEntry, but don't add it to the cache yet. Loading of
anatofuz
parents:
diff changeset
179 // the archive members might fail and we don't want to lock the whole archive
anatofuz
parents:
diff changeset
180 // during this operation.
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
181 auto OE = std::make_unique<ObjectEntry>();
150
anatofuz
parents:
diff changeset
182
anatofuz
parents:
diff changeset
183 for (const auto &Archive : Archives) {
anatofuz
parents:
diff changeset
184 Error Err = Error::success();
anatofuz
parents:
diff changeset
185 for (auto Child : Archive->children(Err)) {
anatofuz
parents:
diff changeset
186 if (auto NameOrErr = Child.getName()) {
anatofuz
parents:
diff changeset
187 if (*NameOrErr == ObjectFilename) {
anatofuz
parents:
diff changeset
188 auto ModTimeOrErr = Child.getLastModified();
anatofuz
parents:
diff changeset
189 if (!ModTimeOrErr)
anatofuz
parents:
diff changeset
190 return ModTimeOrErr.takeError();
anatofuz
parents:
diff changeset
191
anatofuz
parents:
diff changeset
192 if (Timestamp != sys::TimePoint<>() &&
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
193 Timestamp != std::chrono::time_point_cast<std::chrono::seconds>(
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
194 ModTimeOrErr.get())) {
150
anatofuz
parents:
diff changeset
195 if (Verbose)
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
196 WithColor::warning()
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
197 << *NameOrErr
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
198 << ": timestamp mismatch between archive member ("
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
199 << ModTimeOrErr.get() << ") and debug map (" << Timestamp
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 173
diff changeset
200 << ")\n";
150
anatofuz
parents:
diff changeset
201 continue;
anatofuz
parents:
diff changeset
202 }
anatofuz
parents:
diff changeset
203
anatofuz
parents:
diff changeset
204 if (Verbose)
anatofuz
parents:
diff changeset
205 WithColor::note() << "found member in archive.\n";
anatofuz
parents:
diff changeset
206
anatofuz
parents:
diff changeset
207 auto ErrOrMem = Child.getMemoryBufferRef();
anatofuz
parents:
diff changeset
208 if (!ErrOrMem)
anatofuz
parents:
diff changeset
209 return ErrOrMem.takeError();
anatofuz
parents:
diff changeset
210
anatofuz
parents:
diff changeset
211 auto ErrOrObjectFile =
anatofuz
parents:
diff changeset
212 object::ObjectFile::createObjectFile(*ErrOrMem);
anatofuz
parents:
diff changeset
213 if (!ErrOrObjectFile)
anatofuz
parents:
diff changeset
214 return ErrOrObjectFile.takeError();
anatofuz
parents:
diff changeset
215
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
216 OE->Objects.push_back(std::move(*ErrOrObjectFile));
150
anatofuz
parents:
diff changeset
217 }
anatofuz
parents:
diff changeset
218 }
anatofuz
parents:
diff changeset
219 }
anatofuz
parents:
diff changeset
220 if (Err)
anatofuz
parents:
diff changeset
221 return std::move(Err);
anatofuz
parents:
diff changeset
222 }
anatofuz
parents:
diff changeset
223
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
224 if (OE->Objects.empty())
150
anatofuz
parents:
diff changeset
225 return errorCodeToError(errc::no_such_file_or_directory);
anatofuz
parents:
diff changeset
226
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
227 MemberCache[Key] = std::move(OE);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
228 return *MemberCache[Key];
150
anatofuz
parents:
diff changeset
229 }
anatofuz
parents:
diff changeset
230
anatofuz
parents:
diff changeset
231 Expected<const BinaryHolder::ObjectEntry &>
anatofuz
parents:
diff changeset
232 BinaryHolder::getObjectEntry(StringRef Filename, TimestampTy Timestamp) {
anatofuz
parents:
diff changeset
233 if (Verbose)
anatofuz
parents:
diff changeset
234 WithColor::note() << "trying to open '" << Filename << "'\n";
anatofuz
parents:
diff changeset
235
anatofuz
parents:
diff changeset
236 // If this is an archive, we might have either the object or the archive
anatofuz
parents:
diff changeset
237 // cached. In this case we can load it without accessing the file system.
anatofuz
parents:
diff changeset
238 if (isArchive(Filename)) {
anatofuz
parents:
diff changeset
239 StringRef ArchiveFilename = getArchiveAndObjectName(Filename).first;
anatofuz
parents:
diff changeset
240 std::lock_guard<std::mutex> Lock(ArchiveCacheMutex);
anatofuz
parents:
diff changeset
241 if (ArchiveCache.count(ArchiveFilename)) {
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
242 return ArchiveCache[ArchiveFilename]->getObjectEntry(Filename, Timestamp,
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
243 Verbose);
150
anatofuz
parents:
diff changeset
244 } else {
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
245 auto AE = std::make_unique<ArchiveEntry>();
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
246 auto Err = AE->load(VFS, Filename, Timestamp, Verbose);
150
anatofuz
parents:
diff changeset
247 if (Err) {
anatofuz
parents:
diff changeset
248 // Don't return the error here: maybe the file wasn't an archive.
anatofuz
parents:
diff changeset
249 llvm::consumeError(std::move(Err));
anatofuz
parents:
diff changeset
250 } else {
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
251 ArchiveCache[ArchiveFilename] = std::move(AE);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
252 return ArchiveCache[ArchiveFilename]->getObjectEntry(
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
253 Filename, Timestamp, Verbose);
150
anatofuz
parents:
diff changeset
254 }
anatofuz
parents:
diff changeset
255 }
anatofuz
parents:
diff changeset
256 }
anatofuz
parents:
diff changeset
257
anatofuz
parents:
diff changeset
258 // If this is an object, we might have it cached. If not we'll have to load
anatofuz
parents:
diff changeset
259 // it from the file system and cache it now.
anatofuz
parents:
diff changeset
260 std::lock_guard<std::mutex> Lock(ObjectCacheMutex);
anatofuz
parents:
diff changeset
261 if (!ObjectCache.count(Filename)) {
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
262 auto OE = std::make_unique<ObjectEntry>();
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
263 auto Err = OE->load(VFS, Filename, Timestamp, Verbose);
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
264 if (Err)
150
anatofuz
parents:
diff changeset
265 return std::move(Err);
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
266 ObjectCache[Filename] = std::move(OE);
150
anatofuz
parents:
diff changeset
267 }
anatofuz
parents:
diff changeset
268
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
269 return *ObjectCache[Filename];
150
anatofuz
parents:
diff changeset
270 }
anatofuz
parents:
diff changeset
271
anatofuz
parents:
diff changeset
272 void BinaryHolder::clear() {
anatofuz
parents:
diff changeset
273 std::lock_guard<std::mutex> ArchiveLock(ArchiveCacheMutex);
anatofuz
parents:
diff changeset
274 std::lock_guard<std::mutex> ObjectLock(ObjectCacheMutex);
anatofuz
parents:
diff changeset
275 ArchiveCache.clear();
anatofuz
parents:
diff changeset
276 ObjectCache.clear();
anatofuz
parents:
diff changeset
277 }
anatofuz
parents:
diff changeset
278
anatofuz
parents:
diff changeset
279 } // namespace dsymutil
anatofuz
parents:
diff changeset
280 } // namespace llvm