@@ -68,14 +68,6 @@ bool hasDebugOrProfileInfo(ArrayRef<const char *> Args) {
68
68
return false ;
69
69
}
70
70
71
- void addString (CachedCommandAdaptor::HashAlgorithm &H, StringRef S) {
72
- // hash size + contents to avoid collisions
73
- // for example, we have to ensure that the result of hashing "AA" "BB" is
74
- // different from "A" "ABB"
75
- H.update (S.size ());
76
- H.update (S);
77
- }
78
-
79
71
Error addFile (CachedCommandAdaptor::HashAlgorithm &H, StringRef Path) {
80
72
auto BufOrError = MemoryBuffer::getFile (Path);
81
73
if (std::error_code EC = BufOrError.getError ()) {
@@ -151,6 +143,15 @@ void CachedCommandAdaptor::addFileContents(
151
143
}
152
144
}
153
145
146
+ void CachedCommandAdaptor::addString (CachedCommandAdaptor::HashAlgorithm &H,
147
+ StringRef S) {
148
+ // hash size + contents to avoid collisions
149
+ // for example, we have to ensure that the result of hashing "AA" "BB" is
150
+ // different from "A" "ABB"
151
+ H.update (S.size ());
152
+ H.update (S);
153
+ }
154
+
154
155
Expected<CachedCommandAdaptor::Identifier>
155
156
CachedCommandAdaptor::getIdentifier () const {
156
157
CachedCommandAdaptor::HashAlgorithm H;
@@ -170,10 +171,45 @@ CachedCommandAdaptor::getIdentifier() const {
170
171
return Id;
171
172
}
172
173
174
+ llvm::Error
175
+ CachedCommandAdaptor::writeUniqueExecuteOutput (StringRef OutputFilename,
176
+ StringRef CachedBuffer) {
177
+ std::error_code EC;
178
+ raw_fd_ostream Out (OutputFilename, EC);
179
+ if (EC) {
180
+ Error E = createStringError (EC, Twine (" Failed to open " ) + OutputFilename +
181
+ " : " + EC.message () + " \n " );
182
+ return E;
183
+ }
184
+
185
+ Out.write (CachedBuffer.data (), CachedBuffer.size ());
186
+ Out.close ();
187
+ if (Out.has_error ()) {
188
+ Error E = createStringError (EC, Twine (" Failed to write " ) + OutputFilename +
189
+ " : " + EC.message () + " \n " );
190
+ return E;
191
+ }
192
+
193
+ return Error::success ();
194
+ }
195
+
196
+ Expected<std::unique_ptr<MemoryBuffer>>
197
+ CachedCommandAdaptor::readUniqueExecuteOutput (StringRef OutputFilename) {
198
+ ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
199
+ MemoryBuffer::getFile (OutputFilename);
200
+ if (!MBOrErr) {
201
+ std::error_code EC = MBOrErr.getError ();
202
+ return createStringError (EC, Twine (" Failed to open " ) + OutputFilename +
203
+ " : " + EC.message () + " \n " );
204
+ }
205
+
206
+ return std::move (*MBOrErr);
207
+ }
208
+
173
209
ClangCommand::ClangCommand (driver::Command &Command,
174
- DiagnosticOptions &DiagOpts,
175
- llvm::vfs::FileSystem &VFS,
176
- ExecuteFnTy &&ExecuteImpl)
210
+ DiagnosticOptions &DiagOpts,
211
+ llvm::vfs::FileSystem &VFS,
212
+ ExecuteFnTy &&ExecuteImpl)
177
213
: Command(Command), DiagOpts(DiagOpts), VFS(VFS),
178
214
ExecuteImpl (std::move(ExecuteImpl)) {}
179
215
@@ -250,35 +286,16 @@ bool ClangCommand::canCache() const {
250
286
251
287
Error ClangCommand::writeExecuteOutput (StringRef CachedBuffer) {
252
288
StringRef OutputFilename = Command.getOutputFilenames ().front ();
253
- std::error_code EC;
254
- raw_fd_ostream Out (OutputFilename, EC);
255
- if (EC) {
256
- Error E = createStringError (EC, Twine (" Failed to open " ) + OutputFilename +
257
- " : " + EC.message () + " \n " );
258
- return E;
259
- }
260
-
261
- Out.write (CachedBuffer.data (), CachedBuffer.size ());
262
- Out.close ();
263
- if (Out.has_error ()) {
264
- Error E = createStringError (EC, Twine (" Failed to write " ) + OutputFilename +
265
- " : " + EC.message () + " \n " );
266
- return E;
267
- }
268
-
269
- return Error::success ();
289
+ return CachedCommandAdaptor::writeUniqueExecuteOutput (OutputFilename,
290
+ CachedBuffer);
270
291
}
271
292
272
293
Expected<StringRef> ClangCommand::readExecuteOutput () {
273
- StringRef OutputFilename = Command.getOutputFilenames ().front ();
274
- ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
275
- MemoryBuffer::getFile (OutputFilename);
276
- if (!MBOrErr) {
277
- std::error_code EC = MBOrErr.getError ();
278
- return createStringError (EC, Twine (" Failed to open " ) + OutputFilename +
279
- " : " + EC.message () + " \n " );
280
- }
281
- Output = std::move (*MBOrErr);
294
+ auto MaybeBuffer = CachedCommandAdaptor::readUniqueExecuteOutput (
295
+ Command.getOutputFilenames ().front ());
296
+ if (!MaybeBuffer)
297
+ return MaybeBuffer.takeError ();
298
+ Output = std::move (*MaybeBuffer);
282
299
return Output->getBuffer ();
283
300
}
284
301
0 commit comments