@@ -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,6 +171,41 @@ 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
CachedCommand::CachedCommand (driver::Command &Command,
174
210
DiagnosticOptions &DiagOpts,
175
211
ExecuteFnTy &&ExecuteImpl)
@@ -249,35 +285,16 @@ bool CachedCommand::canCache() const {
249
285
250
286
Error CachedCommand::writeExecuteOutput (StringRef CachedBuffer) {
251
287
StringRef OutputFilename = Command.getOutputFilenames ().front ();
252
- std::error_code EC;
253
- raw_fd_ostream Out (OutputFilename, EC);
254
- if (EC) {
255
- Error E = createStringError (EC, Twine (" Failed to open " ) + OutputFilename +
256
- " : " + EC.message () + " \n " );
257
- return E;
258
- }
259
-
260
- Out.write (CachedBuffer.data (), CachedBuffer.size ());
261
- Out.close ();
262
- if (Out.has_error ()) {
263
- Error E = createStringError (EC, Twine (" Failed to write " ) + OutputFilename +
264
- " : " + EC.message () + " \n " );
265
- return E;
266
- }
267
-
268
- return Error::success ();
288
+ return CachedCommandAdaptor::writeUniqueExecuteOutput (OutputFilename,
289
+ CachedBuffer);
269
290
}
270
291
271
292
Expected<StringRef> CachedCommand::readExecuteOutput () {
272
- StringRef OutputFilename = Command.getOutputFilenames ().front ();
273
- ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
274
- MemoryBuffer::getFile (OutputFilename);
275
- if (!MBOrErr) {
276
- std::error_code EC = MBOrErr.getError ();
277
- return createStringError (EC, Twine (" Failed to open " ) + OutputFilename +
278
- " : " + EC.message () + " \n " );
279
- }
280
- Output = std::move (*MBOrErr);
293
+ auto MaybeBuffer = CachedCommandAdaptor::readUniqueExecuteOutput (
294
+ Command.getOutputFilenames ().front ());
295
+ if (!MaybeBuffer)
296
+ return MaybeBuffer.takeError ();
297
+ Output = std::move (*MaybeBuffer);
281
298
return Output->getBuffer ();
282
299
}
283
300
0 commit comments