@@ -188,7 +188,9 @@ class SerializedDiagnosticConsumer : public DiagnosticConsumer {
188
188
}
189
189
190
190
// Record identifier for the file.
191
- unsigned getEmitFile (StringRef Filename);
191
+ unsigned getEmitFile (
192
+ SourceManager &SM, StringRef Filename, unsigned bufferID
193
+ );
192
194
193
195
// Record identifier for the category.
194
196
unsigned getEmitCategory (StringRef Category);
@@ -217,7 +219,9 @@ namespace serialized_diagnostics {
217
219
} // namespace serialized_diagnostics
218
220
} // namespace swift
219
221
220
- unsigned SerializedDiagnosticConsumer::getEmitFile (StringRef Filename) {
222
+ unsigned SerializedDiagnosticConsumer::getEmitFile (
223
+ SourceManager &SM, StringRef Filename, unsigned bufferID
224
+ ) {
221
225
// NOTE: Using Filename.data() here relies on SourceMgr using
222
226
// const char* as buffer identifiers. This is fast, but may
223
227
// be brittle. We can always switch over to using a StringMap.
@@ -238,6 +242,32 @@ unsigned SerializedDiagnosticConsumer::getEmitFile(StringRef Filename) {
238
242
State->Stream .EmitRecordWithBlob (State->Abbrevs .get (RECORD_FILENAME),
239
243
Record, Filename.data ());
240
244
245
+ // If the buffer contains code that was synthesized by the compiler,
246
+ // emit the contents of the buffer.
247
+ auto generatedInfo = SM.getGeneratedSourceInfo (bufferID);
248
+ if (!generatedInfo)
249
+ return entry;
250
+
251
+ Record.clear ();
252
+ Record.push_back (RECORD_SOURCE_FILE_CONTENTS);
253
+ Record.push_back (entry);
254
+
255
+ // The source range that this buffer was generated from, expressed as
256
+ // offsets into the original buffer.
257
+ auto originalFilename = SM.getDisplayNameForLoc (generatedInfo->originalSourceRange .Start );
258
+ addRangeToRecord (
259
+ Lexer::getCharSourceRangeFromSourceRange (
260
+ SM, generatedInfo->originalSourceRange ),
261
+ SM, originalFilename, Record
262
+ );
263
+
264
+ // Contents of the buffer.
265
+ auto sourceText = SM.getEntireTextForBuffer (bufferID);
266
+ Record.push_back (sourceText.size ());
267
+ State->Stream .EmitRecordWithBlob (
268
+ State->Abbrevs .get (RECORD_SOURCE_FILE_CONTENTS),
269
+ Record, sourceText);
270
+
241
271
return entry;
242
272
}
243
273
@@ -275,7 +305,7 @@ void SerializedDiagnosticConsumer::addLocToRecord(SourceLoc Loc,
275
305
unsigned line, col;
276
306
std::tie (line, col) = SM.getPresumedLineAndColumnForLoc (Loc);
277
307
278
- Record.push_back (getEmitFile (Filename));
308
+ Record.push_back (getEmitFile (SM, Filename, bufferId ));
279
309
Record.push_back (line);
280
310
Record.push_back (col);
281
311
Record.push_back (SM.getLocOffsetInBuffer (Loc, bufferId));
@@ -411,6 +441,8 @@ void SerializedDiagnosticConsumer::emitBlockInfoBlock() {
411
441
emitRecordID (RECORD_DIAG_FLAG, " DiagFlag" , Stream, Record);
412
442
emitRecordID (RECORD_FILENAME, " FileName" , Stream, Record);
413
443
emitRecordID (RECORD_FIXIT, " FixIt" , Stream, Record);
444
+ emitRecordID (
445
+ RECORD_SOURCE_FILE_CONTENTS, " SourceFileContents" , Stream, Record);
414
446
415
447
// Emit abbreviation for RECORD_DIAG.
416
448
Abbrev = std::make_shared<BitCodeAbbrev>();
@@ -467,6 +499,16 @@ void SerializedDiagnosticConsumer::emitBlockInfoBlock() {
467
499
Abbrevs.set (RECORD_FIXIT, Stream.EmitBlockInfoAbbrev (BLOCK_DIAG,
468
500
Abbrev));
469
501
502
+ // Emit the abbreviation for RECORD_SOURCE_FILE_CONTENTS.
503
+ Abbrev = std::make_shared<BitCodeAbbrev>();
504
+ Abbrev->Add (BitCodeAbbrevOp (RECORD_SOURCE_FILE_CONTENTS));
505
+ Abbrev->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::Fixed, 10 )); // File ID.
506
+ addRangeLocationAbbrev (Abbrev);
507
+ Abbrev->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::Fixed, 16 )); // File size.
508
+ Abbrev->Add (BitCodeAbbrevOp (BitCodeAbbrevOp::Blob)); // File contents.
509
+ Abbrevs.set (RECORD_SOURCE_FILE_CONTENTS,
510
+ Stream.EmitBlockInfoAbbrev (BLOCK_DIAG, Abbrev));
511
+
470
512
Stream.ExitBlock ();
471
513
}
472
514
0 commit comments