<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Sep 9, 2015 at 1:08 PM, Mehdi Amini via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mehdi_amini<br>
Date: Wed Sep  9 15:08:51 2015<br>
New Revision: 247179<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=247179&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=247179&view=rev</a><br>
Log:<br>
EmitRecordWith* API change: takes an ArrayRef instead of a SmallVector (NFC)<br>
<br>
From: Mehdi Amini <<a href="mailto:mehdi.amini@apple.com">mehdi.amini@apple.com</a>><br>
<br>
Modified:<br>
  Â  cfe/trunk/include/clang/Serialization/ASTWriter.h<br>
  Â  cfe/trunk/lib/Frontend/SerializedDiagnosticPrinter.cpp<br>
  Â  cfe/trunk/lib/Serialization/ASTWriter.cpp<br>
  Â  cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Serialization/ASTWriter.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=247179&r1=247178&r2=247179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTWriter.h?rev=247179&r1=247178&r2=247179&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Serialization/ASTWriter.h (original)<br>
+++ cfe/trunk/include/clang/Serialization/ASTWriter.h Wed Sep  9 15:08:51 2015<br>
@@ -84,6 +84,7 @@ class ASTWriter : public ASTDeserializat<br>
 public:<br>
  Â typedef SmallVector<uint64_t, 64> RecordData;<br>
  Â typedef SmallVectorImpl<uint64_t> RecordDataImpl;<br>
+  typedef ArrayRef<uint64_t> RecordDataRef;<br>
<br>
  Â friend class ASTDeclWriter;<br>
  Â friend class ASTStmtWriter;<br>
@@ -756,7 +757,7 @@ public:<br>
  Â void AddPath(StringRef Path, RecordDataImpl &Record);<br>
<br>
  Â /// \brief Emit the current record with the given path as a blob.<br>
-  void EmitRecordWithPath(unsigned Abbrev, RecordDataImpl &Record,<br>
+  void EmitRecordWithPath(unsigned Abbrev, const RecordDataRef &Record,<br></blockquote><div><br></div><div>ArrayRefs are generally passed by value, like StringRefs.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â StringRef Path);<br>
<br>
  Â /// \brief Add a version tuple to the given record<br>
<br>
Modified: cfe/trunk/lib/Frontend/SerializedDiagnosticPrinter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/SerializedDiagnosticPrinter.cpp?rev=247179&r1=247178&r2=247179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/SerializedDiagnosticPrinter.cpp?rev=247179&r1=247178&r2=247179&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/SerializedDiagnosticPrinter.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/SerializedDiagnosticPrinter.cpp Wed Sep  9 15:08:51 2015<br>
@@ -51,6 +51,7 @@ public:<br>
<br>
 typedef SmallVector<uint64_t, 64> RecordData;<br>
 typedef SmallVectorImpl<uint64_t> RecordDataImpl;<br>
+typedef ArrayRef<uint64_t> RecordDataRef;<br>
<br>
 class SDiagsWriter;<br>
<br>
@@ -393,13 +394,9 @@ unsigned SDiagsWriter::getEmitFile(const<br>
<br>
  Â // Lazily generate the record for the file.<br>
  Â entry = State->Files.size();<br>
-  RecordData Record;<br>
-  Record.push_back(RECORD_FILENAME);<br>
-  Record.push_back(entry);<br>
-  Record.push_back(0); // For legacy.<br>
-  Record.push_back(0); // For legacy.<br>
  Â StringRef Name(FileName);<br>
-  Record.push_back(Name.size());<br>
+  RecordDataRef Record = {RECORD_FILENAME, entry, 0 /* For legacy */,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  0 /* For legacy */, Name.size()};<br></blockquote><div><br></div><div>I imagine this would produce a dangling reference, maybe? (the temporary initializer_list would go out-of-scope at the end of the full expression?) But I don't fully understand initializer_lists, to be fair.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  Â State->Stream.EmitRecordWithBlob(State->Abbrevs.get(RECORD_FILENAME), Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Name);<br>
<br>
@@ -412,7 +409,7 @@ void SDiagsWriter::EmitCharSourceRange(C<br>
  Â State->Record.push_back(RECORD_SOURCE_RANGE);<br>
  Â AddCharSourceRangeToRecord(R, State->Record, SM);<br>
  Â State->Stream.EmitRecordWithAbbrev(State->Abbrevs.get(RECORD_SOURCE_RANGE),<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â State->Record);<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â makeArrayRef(State->Record));<br></blockquote><div><br></div><div>What type is State->Record & why isn't it implicitly convertible to ArrayRef?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 }<br>
<br>
 /// \brief Emits the preamble of the diagnostics file.<br>
@@ -531,14 +528,11 @@ void SDiagsWriter::EmitBlockInfoBlock()<br>
<br>
 void SDiagsWriter::EmitMetaBlock() {<br>
  Â llvm::BitstreamWriter &Stream = State->Stream;<br>
-  RecordData &Record = State->Record;<br>
  Â AbbreviationMap &Abbrevs = State->Abbrevs;<br>
<br>
  Â Stream.EnterSubblock(BLOCK_META, 3);<br>
-  Record.clear();<br>
-  Record.push_back(RECORD_VERSION);<br>
-  Record.push_back(VersionNumber);<br>
-  Stream.EmitRecordWithAbbrev(Abbrevs.get(RECORD_VERSION), Record);<br>
+  RecordDataRef Record = {RECORD_VERSION, VersionNumber};<br></blockquote><div><br></div><div>Same (possible) lifetime issue here. (and several other cases through this change).<br><br>Even if there isn't a lifetime issue, I'd probably just pass these directly, rather than creating a named variable anyway. Probably.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  Stream.EmitRecordWithAbbrev(Abbrevs.get(RECORD_VERSION), Record);<br>
  Â Stream.ExitBlock();<br>
 }<br>
<br>
@@ -548,11 +542,8 @@ unsigned SDiagsWriter::getEmitCategory(u<br>
<br>
  Â // We use a local version of 'Record' so that we can be generating<br>
  Â // another record when we lazily generate one for the category entry.<br>
-  RecordData Record;<br>
-  Record.push_back(RECORD_CATEGORY);<br>
-  Record.push_back(category);<br>
  Â StringRef catName = DiagnosticIDs::getCategoryNameFromID(category);<br>
-  Record.push_back(catName.size());<br>
+  RecordDataRef Record = {RECORD_CATEGORY, category, catName.size()};<br>
  Â State->Stream.EmitRecordWithBlob(State->Abbrevs.get(RECORD_CATEGORY), Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  catName);<br>
<br>
@@ -581,10 +572,7 @@ unsigned SDiagsWriter::getEmitDiagnostic<br>
  Â  Â entry.second = FlagName;<br>
<br>
  Â  Â // Lazily emit the string in a separate record.<br>
-  Â  RecordData Record;<br>
-  Â  Record.push_back(RECORD_DIAG_FLAG);<br>
-  Â  Record.push_back(entry.first);<br>
-  Â  Record.push_back(FlagName.size());<br>
+  Â  RecordDataRef Record = {RECORD_DIAG_FLAG, entry.first, FlagName.size()};<br>
  Â  Â State->Stream.EmitRecordWithBlob(State->Abbrevs.get(RECORD_DIAG_FLAG),<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Record, FlagName);<br>
  Â }<br>
@@ -682,7 +670,8 @@ void SDiagsWriter::EmitDiagnosticMessage<br>
  Â }<br>
<br>
  Â Record.push_back(Message.size());<br>
-  Stream.EmitRecordWithBlob(Abbrevs.get(RECORD_DIAG), Record, Message);<br>
+  Stream.EmitRecordWithBlob(Abbrevs.get(RECORD_DIAG), makeArrayRef(Record),<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Message);<br>
 }<br>
<br>
 void<br>
@@ -741,7 +730,7 @@ void SDiagsWriter::EmitCodeContext(Small<br>
  Â  Â Record.push_back(RECORD_FIXIT);<br>
  Â  Â AddCharSourceRangeToRecord(Fix.RemoveRange, Record, SM);<br>
  Â  Â Record.push_back(Fix.CodeToInsert.size());<br>
-  Â  Stream.EmitRecordWithBlob(Abbrevs.get(RECORD_FIXIT), Record,<br>
+  Â  Stream.EmitRecordWithBlob(Abbrevs.get(RECORD_FIXIT), makeArrayRef(Record),<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â Fix.CodeToInsert);<br>
  Â }<br>
 }<br>
@@ -844,17 +833,9 @@ std::error_code SDiagsMerger::visitEndOf<br>
 std::error_code<br>
 SDiagsMerger::visitSourceRangeRecord(const serialized_diags::Location &Start,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  const serialized_diags::Location &End) {<br>
-  RecordData Record;<br>
-  Record.push_back(RECORD_SOURCE_RANGE);<br>
-  Record.push_back(FileLookup[Start.FileID]);<br>
-  Record.push_back(Start.Line);<br>
-  Record.push_back(Start.Col);<br>
-  Record.push_back(Start.Offset);<br>
-  Record.push_back(FileLookup[End.FileID]);<br>
-  Record.push_back(End.Line);<br>
-  Record.push_back(End.Col);<br>
-  Record.push_back(End.Offset);<br>
-<br>
+  RecordDataRef Record = {<br>
+  Â  Â  RECORD_SOURCE_RANGE, FileLookup[Start.FileID], Start.Line, Start.Col,<br>
+  Â  Â  Start.Offset, FileLookup[End.FileID], End.Line, End.Col, End.Offset};<br>
  Â Writer.State->Stream.EmitRecordWithAbbrev(<br>
  Â  Â  Â Writer.State->Abbrevs.get(RECORD_SOURCE_RANGE), Record);<br>
  Â return std::error_code();<br>
@@ -863,19 +844,13 @@ SDiagsMerger::visitSourceRangeRecord(con<br>
 std::error_code SDiagsMerger::visitDiagnosticRecord(<br>
  Â  Â unsigned Severity, const serialized_diags::Location &Location,<br>
  Â  Â unsigned Category, unsigned Flag, StringRef Message) {<br>
-  RecordData MergedRecord;<br>
-  MergedRecord.push_back(RECORD_DIAG);<br>
-  MergedRecord.push_back(Severity);<br>
-  MergedRecord.push_back(FileLookup[Location.FileID]);<br>
-  MergedRecord.push_back(Location.Line);<br>
-  MergedRecord.push_back(Location.Col);<br>
-  MergedRecord.push_back(Location.Offset);<br>
-  MergedRecord.push_back(CategoryLookup[Category]);<br>
-  MergedRecord.push_back(Flag ? DiagFlagLookup[Flag] : 0);<br>
-  MergedRecord.push_back(Message.size());<br>
+  RecordDataRef Record = {RECORD_DIAG, Severity, FileLookup[Location.FileID],<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Location.Line, Location.Col, Location.Offset,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  CategoryLookup[Category],<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Flag ? DiagFlagLookup[Flag] : 0, Message.size()};<br>
<br>
  Â Writer.State->Stream.EmitRecordWithBlob(<br>
-  Â  Â  Writer.State->Abbrevs.get(RECORD_DIAG), MergedRecord, Message);<br>
+  Â  Â  Writer.State->Abbrevs.get(RECORD_DIAG), Record, Message);<br>
  Â return std::error_code();<br>
 }<br>
<br>
@@ -883,17 +858,9 @@ std::error_code<br>
 SDiagsMerger::visitFixitRecord(const serialized_diags::Location &Start,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  const serialized_diags::Location &End,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  StringRef Text) {<br>
-  RecordData Record;<br>
-  Record.push_back(RECORD_FIXIT);<br>
-  Record.push_back(FileLookup[Start.FileID]);<br>
-  Record.push_back(Start.Line);<br>
-  Record.push_back(Start.Col);<br>
-  Record.push_back(Start.Offset);<br>
-  Record.push_back(FileLookup[End.FileID]);<br>
-  Record.push_back(End.Line);<br>
-  Record.push_back(End.Col);<br>
-  Record.push_back(End.Offset);<br>
-  Record.push_back(Text.size());<br>
+  RecordDataRef Record = {RECORD_FIXIT, FileLookup[Start.FileID], Start.Line,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Start.Col, Start.Offset, FileLookup[End.FileID],<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  End.Line, End.Col, End.Offset, Text.size()};<br>
<br>
  Â Writer.State->Stream.EmitRecordWithBlob(<br>
  Â  Â  Â Writer.State->Abbrevs.get(RECORD_FIXIT), Record, Text);<br>
<br>
Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=247179&r1=247178&r2=247179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=247179&r1=247178&r2=247179&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Wed Sep  9 15:08:51 2015<br>
@@ -1171,8 +1171,7 @@ void ASTWriter::WriteControlBlock(Prepro<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â const std::string &OutputFile) {<br>
  Â using namespace llvm;<br>
  Â Stream.EnterSubblock(CONTROL_BLOCK_ID, 5);<br>
-  RecordData Record;<br>
-<br>
+<br>
  Â // Metadata<br>
  Â BitCodeAbbrev *MetadataAbbrev = new BitCodeAbbrev();<br>
  Â MetadataAbbrev->Add(BitCodeAbbrevOp(METADATA));<br>
@@ -1185,27 +1184,23 @@ void ASTWriter::WriteControlBlock(Prepro<br>
  Â MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Errors<br>
  Â MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // SVN branch/tag<br>
  Â unsigned MetadataAbbrevCode = Stream.EmitAbbrev(MetadataAbbrev);<br>
-  Record.push_back(METADATA);<br>
-  Record.push_back(VERSION_MAJOR);<br>
-  Record.push_back(VERSION_MINOR);<br>
-  Record.push_back(CLANG_VERSION_MAJOR);<br>
-  Record.push_back(CLANG_VERSION_MINOR);<br>
  Â assert((!WritingModule || isysroot.empty()) &&<br>
  Â  Â  Â  Â  "writing module as a relocatable PCH?");<br>
-  Record.push_back(!isysroot.empty());<br>
-  Record.push_back(IncludeTimestamps);<br>
-  Record.push_back(ASTHasCompilerErrors);<br>
-  Stream.EmitRecordWithBlob(MetadataAbbrevCode, Record,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  getClangFullRepositoryVersion());<br>
-<br>
+  {<br>
+  Â  RecordDataRef Record = {METADATA, VERSION_MAJOR, VERSION_MINOR,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  CLANG_VERSION_MAJOR, CLANG_VERSION_MINOR,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  !isysroot.empty(), IncludeTimestamps,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  ASTHasCompilerErrors};<br>
+  Â  Stream.EmitRecordWithBlob(MetadataAbbrevCode, Record,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  getClangFullRepositoryVersion());<br>
+  }<br>
  Â if (WritingModule) {<br>
  Â  Â // For implicit modules we output a signature that we can use to ensure<br>
  Â  Â // duplicate module builds don't collide in the cache as their output order<br>
  Â  Â // is non-deterministic.<br>
  Â  Â // FIXME: Remove this when output is deterministic.<br>
  Â  Â if (Context.getLangOpts().ImplicitModules) {<br>
-  Â  Â  Record.clear();<br>
-  Â  Â  Record.push_back(getSignature());<br>
+  Â  Â  RecordData Record = {getSignature()};<br>
  Â  Â  Â Stream.EmitRecord(SIGNATURE, Record);<br>
  Â  Â }<br>
<br>
@@ -1214,8 +1209,7 @@ void ASTWriter::WriteControlBlock(Prepro<br>
  Â  Â Abbrev->Add(BitCodeAbbrevOp(MODULE_NAME));<br>
  Â  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name<br>
  Â  Â unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev);<br>
-  Â  RecordData Record;<br>
-  Â  Record.push_back(MODULE_NAME);<br>
+  Â  RecordDataRef Record = {MODULE_NAME};<br>
  Â  Â Stream.EmitRecordWithBlob(AbbrevCode, Record, WritingModule->Name);<br>
  Â }<br>
<br>
@@ -1236,8 +1230,7 @@ void ASTWriter::WriteControlBlock(Prepro<br>
  Â  Â  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Directory<br>
  Â  Â  Â unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev);<br>
<br>
-  Â  Â  RecordData Record;<br>
-  Â  Â  Record.push_back(MODULE_DIRECTORY);<br>
+  Â  Â  RecordDataRef Record = {MODULE_DIRECTORY};<br>
  Â  Â  Â Stream.EmitRecordWithBlob(AbbrevCode, Record, BaseDir);<br>
  Â  Â }<br>
<br>
@@ -1250,7 +1243,7 @@ void ASTWriter::WriteControlBlock(Prepro<br>
<br>
  Â // Module map file<br>
  Â if (WritingModule) {<br>
-  Â  Record.clear();<br>
+  Â  RecordData Record;<br>
<br>
  Â  Â auto &Map = PP.getHeaderSearchInfo().getModuleMap();<br>
<br>
@@ -1273,7 +1266,7 @@ void ASTWriter::WriteControlBlock(Prepro<br>
  Â // Imports<br>
  Â if (Chain) {<br>
  Â  Â serialization::ModuleManager &Mgr = Chain->getModuleManager();<br>
-  Â  Record.clear();<br>
+  Â  RecordData Record;<br>
<br>
  Â  Â for (auto *M : Mgr) {<br>
  Â  Â  Â // Skip modules that weren't directly imported.<br>
@@ -1294,7 +1287,7 @@ void ASTWriter::WriteControlBlock(Prepro<br>
  Â Stream.EnterSubblock(OPTIONS_BLOCK_ID, 4);<br>
<br>
  Â // Language options.<br>
-  Record.clear();<br>
+  RecordData Record;<br>
  Â const LangOptions &LangOpts = Context.getLangOpts();<br>
 #define LANGOPT(Name, Bits, Default, Description) \<br>
  Â Record.push_back(LangOpts.Name);<br>
@@ -1466,8 +1459,7 @@ void ASTWriter::WriteControlBlock(Prepro<br>
  Â  Â SM.getFileManager().makeAbsolutePath(OutputPath);<br>
  Â  Â StringRef origDir = llvm::sys::path::parent_path(OutputPath);<br>
<br>
-  Â  RecordData Record;<br>
-  Â  Record.push_back(ORIGINAL_PCH_DIR);<br>
+  Â  RecordDataRef Record = {ORIGINAL_PCH_DIR};<br>
  Â  Â Stream.EmitRecordWithBlob(AbbrevCode, Record, origDir);<br>
  Â }<br>
<br>
@@ -1491,8 +1483,7 @@ void ASTWriter::WriteInputFiles(SourceMa<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â bool Modules) {<br>
  Â using namespace llvm;<br>
  Â Stream.EnterSubblock(INPUT_FILES_BLOCK_ID, 4);<br>
-  RecordData Record;<br>
-<br>
+<br>
  Â // Create input-file abbreviation.<br>
  Â BitCodeAbbrev *IFAbbrev = new BitCodeAbbrev();<br>
  Â IFAbbrev->Add(BitCodeAbbrevOp(INPUT_FILE));<br>
@@ -1547,16 +1538,11 @@ void ASTWriter::WriteInputFiles(SourceMa<br>
  Â  Â if (!Entry.IsSystemFile)<br>
  Â  Â  Â ++UserFilesNum;<br>
<br>
-  Â  Record.clear();<br>
-  Â  Record.push_back(INPUT_FILE);<br>
-  Â  Record.push_back(InputFileOffsets.size());<br>
-<br>
  Â  Â // Emit size/modification time for this file.<br>
-  Â  Record.push_back(Entry.File->getSize());<br>
-  Â  Record.push_back(getTimestampForOutput(Entry.File));<br>
-<br>
-  Â  // Whether this file was overridden.<br>
-  Â  Record.push_back(Entry.BufferOverridden);<br>
+  Â  // And whether this file was overridden.<br>
+  Â  RecordDataRef Record = {<br>
+  Â  Â  Â  INPUT_FILE, InputFileOffsets.size(), (uint64_t)Entry.File->getSize(),<br>
+  Â  Â  Â  (uint64_t)getTimestampForOutput(Entry.File), Entry.BufferOverridden};<br>
<br>
  Â  Â EmitRecordWithPath(IFAbbrevCode, Record, Entry.File->getName());<br>
  Â }<br>
@@ -1573,10 +1559,8 @@ void ASTWriter::WriteInputFiles(SourceMa<br>
  Â unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(OffsetsAbbrev);<br>
<br>
  Â // Write input file offsets.<br>
-  Record.clear();<br>
-  Record.push_back(INPUT_FILE_OFFSETS);<br>
-  Record.push_back(InputFileOffsets.size());<br>
-  Record.push_back(UserFilesNum);<br>
+  RecordDataRef Record = {INPUT_FILE_OFFSETS, InputFileOffsets.size(),<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  UserFilesNum};<br>
  Â Stream.EmitRecordWithBlob(OffsetsAbbrevCode, Record, bytes(InputFileOffsets));<br>
 }<br>
<br>
@@ -1818,11 +1802,8 @@ void ASTWriter::WriteHeaderSearch(const<br>
  Â unsigned TableAbbrev = Stream.EmitAbbrev(Abbrev);<br>
<br>
  Â // Write the header search table<br>
-  RecordData Record;<br>
-  Record.push_back(HEADER_SEARCH_TABLE);<br>
-  Record.push_back(BucketOffset);<br>
-  Record.push_back(NumHeaderSearchEntries);<br>
-  Record.push_back(TableData.size());<br>
+  RecordDataRef Record = {HEADER_SEARCH_TABLE, BucketOffset,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  NumHeaderSearchEntries, TableData.size()};<br>
  Â TableData.append(GeneratorTrait.strings_begin(),GeneratorTrait.strings_end());<br>
  Â Stream.EmitRecordWithBlob(TableAbbrev, Record, TableData);<br>
<br>
@@ -1907,12 +1888,11 @@ void ASTWriter::WriteSourceManagerBlock(<br>
  Â  Â  Â  Â  Â Record.push_back(0);<br>
  Â  Â  Â  Â  Â Record.push_back(0);<br>
  Â  Â  Â  Â }<br>
-<br>
-  Â  Â  Â  Stream.EmitRecordWithAbbrev(SLocFileAbbrv, Record);<br>
-<br>
+<br>
+  Â  Â  Â  Stream.EmitRecordWithAbbrev(SLocFileAbbrv, makeArrayRef(Record));<br>
+<br>
  Â  Â  Â  Â if (Content->BufferOverridden) {<br>
-  Â  Â  Â  Â  Record.clear();<br>
-  Â  Â  Â  Â  Record.push_back(SM_SLOC_BUFFER_BLOB);<br>
+  Â  Â  Â  Â  RecordDataRef Record = {SM_SLOC_BUFFER_BLOB};<br>
  Â  Â  Â  Â  Â const llvm::MemoryBuffer *Buffer<br>
  Â  Â  Â  Â  Â  Â = Content->getBuffer(PP.getDiagnostics(), PP.getSourceManager());<br>
  Â  Â  Â  Â  Â Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv, Record,<br>
@@ -1929,10 +1909,9 @@ void ASTWriter::WriteSourceManagerBlock(<br>
  Â  Â  Â  Â const llvm::MemoryBuffer *Buffer<br>
  Â  Â  Â  Â  Â = Content->getBuffer(PP.getDiagnostics(), PP.getSourceManager());<br>
  Â  Â  Â  Â const char *Name = Buffer->getBufferIdentifier();<br>
-  Â  Â  Â  Stream.EmitRecordWithBlob(SLocBufferAbbrv, Record,<br>
+  Â  Â  Â  Stream.EmitRecordWithBlob(SLocBufferAbbrv, makeArrayRef(Record),<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â StringRef(Name, strlen(Name) + 1));<br>
-  Â  Â  Â  Record.clear();<br>
-  Â  Â  Â  Record.push_back(SM_SLOC_BUFFER_BLOB);<br>
+  Â  Â  Â  RecordDataRef Record = {SM_SLOC_BUFFER_BLOB};<br>
  Â  Â  Â  Â Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv, Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â StringRef(Buffer->getBufferStart(),<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â Buffer->getBufferSize() + 1));<br>
@@ -1954,7 +1933,7 @@ void ASTWriter::WriteSourceManagerBlock(<br>
  Â  Â  Â if (I + 1 != N)<br>
  Â  Â  Â  Â NextOffset = SourceMgr.getLocalSLocEntry(I + 1).getOffset();<br>
  Â  Â  Â Record.push_back(NextOffset - SLoc->getOffset() - 1);<br>
-  Â  Â  Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv, Record);<br>
+  Â  Â  Stream.EmitRecordWithAbbrev(SLocExpansionAbbrv, makeArrayRef(Record));<br>
  Â  Â }<br>
  Â }<br>
<br>
@@ -1972,13 +1951,13 @@ void ASTWriter::WriteSourceManagerBlock(<br>
  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // total size<br>
  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // offsets<br>
  Â unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(Abbrev);<br>
-<br>
-  Record.clear();<br>
-  Record.push_back(SOURCE_LOCATION_OFFSETS);<br>
-  Record.push_back(SLocEntryOffsets.size());<br>
-  Record.push_back(SourceMgr.getNextLocalOffset() - 1); // skip dummy<br>
-  Stream.EmitRecordWithBlob(SLocOffsetsAbbrev, Record, bytes(SLocEntryOffsets));<br>
-<br>
+  {<br>
+  Â  RecordDataRef Record = {SOURCE_LOCATION_OFFSETS, SLocEntryOffsets.size(),<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  SourceMgr.getNextLocalOffset() -<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  1 /* skip dummy */};<br>
+  Â  Stream.EmitRecordWithBlob(SLocOffsetsAbbrev, Record,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bytes(SLocEntryOffsets));<br>
+  }<br>
  Â // Write the source location entry preloads array, telling the AST<br>
  Â // reader which source locations entries it should load eagerly.<br>
  Â Stream.EmitRecord(SOURCE_LOCATION_PRELOADS, PreloadSLocs);<br>
@@ -2232,12 +2211,11 @@ void ASTWriter::WritePreprocessor(const<br>
  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));<br>
<br>
  Â unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(Abbrev);<br>
-  Record.clear();<br>
-  Record.push_back(MACRO_OFFSET);<br>
-  Record.push_back(MacroOffsets.size());<br>
-  Record.push_back(FirstMacroID - NUM_PREDEF_MACRO_IDS);<br>
-  Stream.EmitRecordWithBlob(MacroOffsetAbbrev, Record,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bytes(MacroOffsets));<br>
+  {<br>
+  Â  RecordDataRef Record = {MACRO_OFFSET, MacroOffsets.size(),<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  FirstMacroID - NUM_PREDEF_MACRO_IDS};<br>
+  Â  Stream.EmitRecordWithBlob(MacroOffsetAbbrev, Record, bytes(MacroOffsets));<br>
+  }<br>
 }<br>
<br>
 void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec) {<br>
@@ -2311,7 +2289,7 @@ void ASTWriter::WritePreprocessorDetail(<br>
  Â  Â  Â // we create a PCH even with compiler errors.<br>
  Â  Â  Â if (ID->getFile())<br>
  Â  Â  Â  Â Buffer += ID->getFile()->getName();<br>
-  Â  Â  Stream.EmitRecordWithBlob(InclusionAbbrev, Record, Buffer);<br>
+  Â  Â  Stream.EmitRecordWithBlob(InclusionAbbrev, makeArrayRef(Record), Buffer);<br>
  Â  Â  Â continue;<br>
  Â  Â }<br>
<br>
@@ -2331,9 +2309,8 @@ void ASTWriter::WritePreprocessorDetail(<br>
  Â  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));<br>
  Â  Â unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(Abbrev);<br>
<br>
-  Â  Record.clear();<br>
-  Â  Record.push_back(PPD_ENTITIES_OFFSETS);<br>
-  Â  Record.push_back(FirstPreprocessorEntityID - NUM_PREDEF_PP_ENTITY_IDS);<br>
+  Â  RecordDataRef Record = {PPD_ENTITIES_OFFSETS, FirstPreprocessorEntityID -<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  NUM_PREDEF_PP_ENTITY_IDS};<br>
  Â  Â Stream.EmitRecordWithBlob(PPEOffsetAbbrev, Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â bytes(PreprocessedEntityOffsets));<br>
  Â }<br>
@@ -2472,45 +2449,37 @@ void ASTWriter::WriteSubmodules(Module *<br>
  Â  Â Module *Mod = Q.front();<br>
  Â  Â Q.pop();<br>
  Â  Â unsigned ID = getSubmoduleID(Mod);<br>
-<br>
-  Â  // Emit the definition of the block.<br>
-  Â  Record.clear();<br>
-  Â  Record.push_back(SUBMODULE_DEFINITION);<br>
-  Â  Record.push_back(ID);<br>
+<br>
+  Â  uint64_t ParentID = 0;<br>
  Â  Â if (Mod->Parent) {<br>
  Â  Â  Â assert(SubmoduleIDs[Mod->Parent] && "Submodule parent not written?");<br>
-  Â  Â  Record.push_back(SubmoduleIDs[Mod->Parent]);<br>
-  Â  } else {<br>
-  Â  Â  Record.push_back(0);<br>
+  Â  Â  ParentID = SubmoduleIDs[Mod->Parent];<br>
  Â  Â }<br>
-  Â  Record.push_back(Mod->IsFramework);<br>
-  Â  Record.push_back(Mod->IsExplicit);<br>
-  Â  Record.push_back(Mod->IsSystem);<br>
-  Â  Record.push_back(Mod->IsExternC);<br>
-  Â  Record.push_back(Mod->InferSubmodules);<br>
-  Â  Record.push_back(Mod->InferExplicitSubmodules);<br>
-  Â  Record.push_back(Mod->InferExportWildcard);<br>
-  Â  Record.push_back(Mod->ConfigMacrosExhaustive);<br>
-  Â  Stream.EmitRecordWithBlob(DefinitionAbbrev, Record, Mod->Name);<br>
-<br>
+<br>
+  Â  // Emit the definition of the block.<br>
+  Â  {<br>
+  Â  Â  RecordDataRef Record = {<br>
+  Â  Â  Â  Â  SUBMODULE_DEFINITION, ID, ParentID, Mod->IsFramework, Mod->IsExplicit,<br>
+  Â  Â  Â  Â  Mod->IsSystem, Mod->IsExternC, Mod->InferSubmodules,<br>
+  Â  Â  Â  Â  Mod->InferExplicitSubmodules, Mod->InferExportWildcard,<br>
+  Â  Â  Â  Â  Mod->ConfigMacrosExhaustive};<br>
+  Â  Â  Stream.EmitRecordWithBlob(DefinitionAbbrev, Record, Mod->Name);<br>
+  Â  }<br>
+<br>
  Â  Â // Emit the requirements.<br>
  Â  Â for (const auto &R : Mod->Requirements) {<br>
-  Â  Â  Record.clear();<br>
-  Â  Â  Record.push_back(SUBMODULE_REQUIRES);<br>
-  Â  Â  Record.push_back(R.second);<br>
+  Â  Â  RecordDataRef Record = {SUBMODULE_REQUIRES, R.second};<br>
  Â  Â  Â Stream.EmitRecordWithBlob(RequiresAbbrev, Record, R.first);<br>
  Â  Â }<br>
<br>
  Â  Â // Emit the umbrella header, if there is one.<br>
  Â  Â if (auto UmbrellaHeader = Mod->getUmbrellaHeader()) {<br>
-  Â  Â  Record.clear();<br>
-  Â  Â  Record.push_back(SUBMODULE_UMBRELLA_HEADER);<br>
+  Â  Â  RecordDataRef Record = {SUBMODULE_UMBRELLA_HEADER};<br>
  Â  Â  Â Stream.EmitRecordWithBlob(UmbrellaAbbrev, Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â UmbrellaHeader.NameAsWritten);<br>
  Â  Â } else if (auto UmbrellaDir = Mod->getUmbrellaDir()) {<br>
-  Â  Â  Record.clear();<br>
-  Â  Â  Record.push_back(SUBMODULE_UMBRELLA_DIR);<br>
-  Â  Â  Stream.EmitRecordWithBlob(UmbrellaDirAbbrev, Record,<br>
+  Â  Â  RecordDataRef Record = {SUBMODULE_UMBRELLA_DIR};<br>
+  Â  Â  Stream.EmitRecordWithBlob(UmbrellaDirAbbrev, Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â UmbrellaDir.NameAsWritten);<br>
  Â  Â }<br>
<br>
@@ -2528,8 +2497,7 @@ void ASTWriter::WriteSubmodules(Module *<br>
  Â  Â  Â {SUBMODULE_EXCLUDED_HEADER, ExcludedHeaderAbbrev, Module::HK_Excluded}<br>
  Â  Â };<br>
  Â  Â for (auto &HL : HeaderLists) {<br>
-  Â  Â  Record.clear();<br>
-  Â  Â  Record.push_back(HL.RecordKind);<br>
+  Â  Â  RecordDataRef Record = {HL.RecordKind};<br>
  Â  Â  Â for (auto &H : Mod->Headers[HL.HeaderKind])<br>
  Â  Â  Â  Â Stream.EmitRecordWithBlob(HL.Abbrev, Record, H.NameAsWritten);<br>
  Â  Â }<br>
@@ -2537,15 +2505,14 @@ void ASTWriter::WriteSubmodules(Module *<br>
  Â  Â // Emit the top headers.<br>
  Â  Â {<br>
  Â  Â  Â auto TopHeaders = Mod->getTopHeaders(PP->getFileManager());<br>
-  Â  Â  Record.clear();<br>
-  Â  Â  Record.push_back(SUBMODULE_TOPHEADER);<br>
+  Â  Â  RecordDataRef Record = {SUBMODULE_TOPHEADER};<br>
  Â  Â  Â for (auto *H : TopHeaders)<br>
  Â  Â  Â  Â Stream.EmitRecordWithBlob(TopHeaderAbbrev, Record, H->getName());<br>
  Â  Â }<br>
<br>
  Â  Â // Emit the imports.<br>
  Â  Â if (!Mod->Imports.empty()) {<br>
-  Â  Â  Record.clear();<br>
+  Â  Â  RecordData Record;<br>
  Â  Â  Â for (auto *I : Mod->Imports)<br>
  Â  Â  Â  Â Record.push_back(getSubmoduleID(I));<br>
  Â  Â  Â Stream.EmitRecord(SUBMODULE_IMPORTS, Record);<br>
@@ -2553,7 +2520,7 @@ void ASTWriter::WriteSubmodules(Module *<br>
<br>
  Â  Â // Emit the exports.<br>
  Â  Â if (!Mod->Exports.empty()) {<br>
-  Â  Â  Record.clear();<br>
+  Â  Â  RecordData Record;<br>
  Â  Â  Â for (const auto &E : Mod->Exports) {<br>
  Â  Â  Â  Â // FIXME: This may fail; we don't require that all exported modules<br>
  Â  Â  Â  Â // are local or imported.<br>
@@ -2569,26 +2536,21 @@ void ASTWriter::WriteSubmodules(Module *<br>
<br>
  Â  Â // Emit the link libraries.<br>
  Â  Â for (const auto &LL : Mod->LinkLibraries) {<br>
-  Â  Â  Record.clear();<br>
-  Â  Â  Record.push_back(SUBMODULE_LINK_LIBRARY);<br>
-  Â  Â  Record.push_back(LL.IsFramework);<br>
+  Â  Â  RecordDataRef Record = {SUBMODULE_LINK_LIBRARY, LL.IsFramework};<br>
  Â  Â  Â Stream.EmitRecordWithBlob(LinkLibraryAbbrev, Record, LL.Library);<br>
  Â  Â }<br>
<br>
  Â  Â // Emit the conflicts.<br>
  Â  Â for (const auto &C : Mod->Conflicts) {<br>
-  Â  Â  Record.clear();<br>
-  Â  Â  Record.push_back(SUBMODULE_CONFLICT);<br>
  Â  Â  Â // FIXME: This may fail; we don't require that all conflicting modules<br>
  Â  Â  Â // are local or imported.<br>
-  Â  Â  Record.push_back(getSubmoduleID(C.Other));<br>
+  Â  Â  RecordDataRef Record = {SUBMODULE_CONFLICT, getSubmoduleID(C.Other)};<br>
  Â  Â  Â Stream.EmitRecordWithBlob(ConflictAbbrev, Record, C.Message);<br>
  Â  Â }<br>
<br>
  Â  Â // Emit the configuration macros.<br>
  Â  Â for (const auto &CM : Mod->ConfigMacros) {<br>
-  Â  Â  Record.clear();<br>
-  Â  Â  Record.push_back(SUBMODULE_CONFIG_MACRO);<br>
+  Â  Â  RecordDataRef Record = {SUBMODULE_CONFIG_MACRO};<br>
  Â  Â  Â Stream.EmitRecordWithBlob(ConfigMacroAbbrev, Record, CM);<br>
  Â  Â }<br>
<br>
@@ -2670,8 +2632,6 @@ void ASTWriter::WriteCXXCtorInitializers<br>
  Â if (CXXCtorInitializersOffsets.empty())<br>
  Â  Â return;<br>
<br>
-  RecordData Record;<br>
-<br>
  Â // Create a blob abbreviation for the C++ ctor initializer offsets.<br>
  Â using namespace llvm;<br>
<br>
@@ -2682,9 +2642,8 @@ void ASTWriter::WriteCXXCtorInitializers<br>
  Â unsigned CtorInitializersOffsetAbbrev = Stream.EmitAbbrev(Abbrev);<br>
<br>
  Â // Write the base specifier offsets table.<br>
-  Record.clear();<br>
-  Record.push_back(CXX_CTOR_INITIALIZERS_OFFSETS);<br>
-  Record.push_back(CXXCtorInitializersOffsets.size());<br>
+  RecordDataRef Record = {CXX_CTOR_INITIALIZERS_OFFSETS,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  CXXCtorInitializersOffsets.size()};<br>
  Â Stream.EmitRecordWithBlob(CtorInitializersOffsetAbbrev, Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â bytes(CXXCtorInitializersOffsets));<br>
 }<br>
@@ -2693,8 +2652,6 @@ void ASTWriter::WriteCXXBaseSpecifiersOf<br>
  Â if (CXXBaseSpecifiersOffsets.empty())<br>
  Â  Â return;<br>
<br>
-  RecordData Record;<br>
-<br>
  Â // Create a blob abbreviation for the C++ base specifiers offsets.<br>
  Â using namespace llvm;<br>
<br>
@@ -2705,9 +2662,8 @@ void ASTWriter::WriteCXXBaseSpecifiersOf<br>
  Â unsigned BaseSpecifierOffsetAbbrev = Stream.EmitAbbrev(Abbrev);<br>
<br>
  Â // Write the base specifier offsets table.<br>
-  Record.clear();<br>
-  Record.push_back(CXX_BASE_SPECIFIER_OFFSETS);<br>
-  Record.push_back(CXXBaseSpecifiersOffsets.size());<br>
+  RecordDataRef Record = {CXX_BASE_SPECIFIER_OFFSETS,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  CXXBaseSpecifiersOffsets.size()};<br>
  Â Stream.EmitRecordWithBlob(BaseSpecifierOffsetAbbrev, Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â bytes(CXXBaseSpecifiersOffsets));<br>
 }<br>
@@ -2778,8 +2734,6 @@ uint64_t ASTWriter::WriteDeclContextLexi<br>
  Â  Â return 0;<br>
<br>
  Â uint64_t Offset = Stream.GetCurrentBitNo();<br>
-  RecordData Record;<br>
-  Record.push_back(DECL_CONTEXT_LEXICAL);<br>
  Â SmallVector<uint32_t, 128> KindDeclPairs;<br>
  Â for (const auto *D : DC->decls()) {<br>
  Â  Â KindDeclPairs.push_back(D->getKind());<br>
@@ -2787,6 +2741,7 @@ uint64_t ASTWriter::WriteDeclContextLexi<br>
  Â }<br>
<br>
  Â ++NumLexicalDeclContexts;<br>
+  RecordDataRef Record = {DECL_CONTEXT_LEXICAL};<br>
  Â Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev, Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â bytes(KindDeclPairs));<br>
  Â return Offset;<br>
@@ -2794,7 +2749,6 @@ uint64_t ASTWriter::WriteDeclContextLexi<br>
<br>
 void ASTWriter::WriteTypeDeclOffsets() {<br>
  Â using namespace llvm;<br>
-  RecordData Record;<br>
<br>
  Â // Write the type offsets array<br>
  Â BitCodeAbbrev *Abbrev = new BitCodeAbbrev();<br>
@@ -2803,11 +2757,11 @@ void ASTWriter::WriteTypeDeclOffsets() {<br>
  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base type index<br>
  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // types block<br>
  Â unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(Abbrev);<br>
-  Record.clear();<br>
-  Record.push_back(TYPE_OFFSET);<br>
-  Record.push_back(TypeOffsets.size());<br>
-  Record.push_back(FirstTypeID - NUM_PREDEF_TYPE_IDS);<br>
-  Stream.EmitRecordWithBlob(TypeOffsetAbbrev, Record, bytes(TypeOffsets));<br>
+  {<br>
+  Â  RecordDataRef Record = {TYPE_OFFSET, TypeOffsets.size(),<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  FirstTypeID - NUM_PREDEF_TYPE_IDS};<br>
+  Â  Stream.EmitRecordWithBlob(TypeOffsetAbbrev, Record, bytes(TypeOffsets));<br>
+  }<br>
<br>
  Â // Write the declaration offsets array<br>
  Â Abbrev = new BitCodeAbbrev();<br>
@@ -2816,16 +2770,15 @@ void ASTWriter::WriteTypeDeclOffsets() {<br>
  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base decl ID<br>
  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // declarations block<br>
  Â unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(Abbrev);<br>
-  Record.clear();<br>
-  Record.push_back(DECL_OFFSET);<br>
-  Record.push_back(DeclOffsets.size());<br>
-  Record.push_back(FirstDeclID - NUM_PREDEF_DECL_IDS);<br>
-  Stream.EmitRecordWithBlob(DeclOffsetAbbrev, Record, bytes(DeclOffsets));<br>
+  {<br>
+  Â  RecordDataRef Record = {DECL_OFFSET, DeclOffsets.size(),<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  FirstDeclID - NUM_PREDEF_DECL_IDS};<br>
+  Â  Stream.EmitRecordWithBlob(DeclOffsetAbbrev, Record, bytes(DeclOffsets));<br>
+  }<br>
 }<br>
<br>
 void ASTWriter::WriteFileDeclIDsMap() {<br>
  Â using namespace llvm;<br>
-  RecordData Record;<br>
<br>
  Â SmallVector<std::pair<FileID, DeclIDInFileInfo *>, 64> SortedFileDeclIDs(<br>
  Â  Â  Â FileDeclIDs.begin(), FileDeclIDs.end());<br>
@@ -2846,8 +2799,7 @@ void ASTWriter::WriteFileDeclIDsMap() {<br>
  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));<br>
  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));<br>
  Â unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev);<br>
-  Record.push_back(FILE_SORTED_DECLS);<br>
-  Record.push_back(FileGroupedDeclIDs.size());<br>
+  RecordDataRef Record = {FILE_SORTED_DECLS, FileGroupedDeclIDs.size()};<br>
  Â Stream.EmitRecordWithBlob(AbbrevCode, Record, bytes(FileGroupedDeclIDs));<br>
 }<br>
<br>
@@ -3057,11 +3009,10 @@ void ASTWriter::WriteSelectors(Sema &Sem<br>
  Â  Â unsigned MethodPoolAbbrev = Stream.EmitAbbrev(Abbrev);<br>
<br>
  Â  Â // Write the method pool<br>
-  Â  RecordData Record;<br>
-  Â  Record.push_back(METHOD_POOL);<br>
-  Â  Record.push_back(BucketOffset);<br>
-  Â  Record.push_back(NumTableEntries);<br>
-  Â  Stream.EmitRecordWithBlob(MethodPoolAbbrev, Record, MethodPool);<br>
+  Â  {<br>
+  Â  Â  RecordDataRef Record = {METHOD_POOL, BucketOffset, NumTableEntries};<br>
+  Â  Â  Stream.EmitRecordWithBlob(MethodPoolAbbrev, Record, MethodPool);<br>
+  Â  }<br>
<br>
  Â  Â // Create a blob abbreviation for the selector table offsets.<br>
  Â  Â Abbrev = new BitCodeAbbrev();<br>
@@ -3072,12 +3023,12 @@ void ASTWriter::WriteSelectors(Sema &Sem<br>
  Â  Â unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(Abbrev);<br>
<br>
  Â  Â // Write the selector offsets table.<br>
-  Â  Record.clear();<br>
-  Â  Record.push_back(SELECTOR_OFFSETS);<br>
-  Â  Record.push_back(SelectorOffsets.size());<br>
-  Â  Record.push_back(FirstSelectorID - NUM_PREDEF_SELECTOR_IDS);<br>
-  Â  Stream.EmitRecordWithBlob(SelectorOffsetAbbrev, Record,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bytes(SelectorOffsets));<br>
+  Â  {<br>
+  Â  Â  RecordDataRef Record = {SELECTOR_OFFSETS, SelectorOffsets.size(),<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  FirstSelectorID - NUM_PREDEF_SELECTOR_IDS};<br>
+  Â  Â  Stream.EmitRecordWithBlob(SelectorOffsetAbbrev, Record,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bytes(SelectorOffsets));<br>
+  Â  }<br>
  Â }<br>
 }<br>
<br>
@@ -3347,9 +3298,7 @@ void ASTWriter::WriteIdentifierTable(Pre<br>
  Â  Â unsigned IDTableAbbrev = Stream.EmitAbbrev(Abbrev);<br>
<br>
  Â  Â // Write the identifier table<br>
-  Â  RecordData Record;<br>
-  Â  Record.push_back(IDENTIFIER_TABLE);<br>
-  Â  Record.push_back(BucketOffset);<br>
+  Â  RecordDataRef Record = {IDENTIFIER_TABLE, BucketOffset};<br>
  Â  Â Stream.EmitRecordWithBlob(IDTableAbbrev, Record, IdentifierTable);<br>
  Â }<br>
<br>
@@ -3365,11 +3314,9 @@ void ASTWriter::WriteIdentifierTable(Pre<br>
  Â for (unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I)<br>
  Â  Â assert(IdentifierOffsets[I] && "Missing identifier offset?");<br>
 #endif<br>
-<br>
-  RecordData Record;<br>
-  Record.push_back(IDENTIFIER_OFFSET);<br>
-  Record.push_back(IdentifierOffsets.size());<br>
-  Record.push_back(FirstIdentID - NUM_PREDEF_IDENT_IDS);<br>
+<br>
+  RecordDataRef Record = {IDENTIFIER_OFFSET, IdentifierOffsets.size(),<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  FirstIdentID - NUM_PREDEF_IDENT_IDS};<br>
  Â Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev, Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â bytes(IdentifierOffsets));<br>
<br>
@@ -3785,8 +3732,7 @@ uint64_t ASTWriter::WriteDeclContextVisi<br>
  Â GenerateNameLookupTable(DC, LookupTable);<br>
<br>
  Â // Write the lookup table<br>
-  RecordData Record;<br>
-  Record.push_back(DECL_CONTEXT_VISIBLE);<br>
+  RecordDataRef Record = {DECL_CONTEXT_VISIBLE};<br>
  Â Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev, Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â LookupTable);<br>
  Â ++NumVisibleDeclContexts;<br>
@@ -3817,9 +3763,7 @@ void ASTWriter::WriteDeclContextVisibleU<br>
  Â  Â DC = cast<DeclContext>(Chain->getKeyDeclaration(cast<Decl>(DC)));<br>
<br>
  Â // Write the lookup table<br>
-  RecordData Record;<br>
-  Record.push_back(UPDATE_VISIBLE);<br>
-  Record.push_back(getDeclID(cast<Decl>(DC)));<br>
+  RecordDataRef Record = {UPDATE_VISIBLE, getDeclID(cast<Decl>(DC))};<br>
  Â Stream.EmitRecordWithBlob(UpdateVisibleAbbrev, Record, LookupTable);<br>
 }<br>
<br>
@@ -3883,14 +3827,12 @@ void ASTWriter::WriteObjCCategories() {<br>
  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of entries<br>
  Â Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));<br>
  Â unsigned AbbrevID = Stream.EmitAbbrev(Abbrev);<br>
-<br>
-  RecordData Record;<br>
-  Record.push_back(OBJC_CATEGORIES_MAP);<br>
-  Record.push_back(CategoriesMap.size());<br>
-  Stream.EmitRecordWithBlob(AbbrevID, Record,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  reinterpret_cast<char*>(CategoriesMap.data()),<br>
+<br>
+  RecordDataRef Record = {OBJC_CATEGORIES_MAP, CategoriesMap.size()};<br>
+  Stream.EmitRecordWithBlob(AbbrevID, Record,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  reinterpret_cast<char *>(CategoriesMap.data()),<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â CategoriesMap.size() * sizeof(ObjCCategoriesInfo));<br>
-<br>
+<br>
  Â // Emit the category lists.<br>
  Â Stream.EmitRecord(OBJC_CATEGORIES, Categories);<br>
 }<br>
@@ -3987,7 +3929,7 @@ void ASTWriter::AddPath(StringRef Path,<br>
  Â AddString(FilePath, Record);<br>
 }<br>
<br>
-void ASTWriter::EmitRecordWithPath(unsigned Abbrev, RecordDataImpl &Record,<br>
+void ASTWriter::EmitRecordWithPath(unsigned Abbrev, const RecordDataRef &Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  StringRef Path) {<br>
  Â SmallString<128> FilePath(Path);<br>
  Â PreparePathForOutput(FilePath);<br>
@@ -4250,14 +4192,14 @@ void ASTWriter::WriteASTCore(Sema &SemaR<br>
  Â WriteControlBlock(PP, Context, isysroot, OutputFile);<br>
<br>
  Â // Write the remaining AST contents.<br>
-  RecordData Record;<br>
  Â Stream.EnterSubblock(AST_BLOCK_ID, 5);<br>
<br>
  Â // This is so that older clang versions, before the introduction<br>
  Â // of the control block, can read and reject the newer PCH format.<br>
-  Record.clear();<br>
-  Record.push_back(VERSION_MAJOR);<br>
-  Stream.EmitRecord(METADATA_OLD_FORMAT, Record);<br>
+  {<br>
+  Â  RecordData Record = {VERSION_MAJOR};<br>
+  Â  Stream.EmitRecord(METADATA_OLD_FORMAT, Record);<br>
+  }<br>
<br>
  Â // Create a lexical update block containing all of the declarations in the<br>
  Â // translation unit that do not come from other AST files.<br>
@@ -4274,11 +4216,12 @@ void ASTWriter::WriteASTCore(Sema &SemaR<br>
  Â Abv->Add(llvm::BitCodeAbbrevOp(TU_UPDATE_LEXICAL));<br>
  Â Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob));<br>
  Â unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(Abv);<br>
-  Record.clear();<br>
-  Record.push_back(TU_UPDATE_LEXICAL);<br>
-  Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev, Record,<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bytes(NewGlobalKindDeclPairs));<br>
-<br>
+  {<br>
+  Â  RecordDataRef Record = {TU_UPDATE_LEXICAL};<br>
+  Â  Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev, Record,<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  bytes(NewGlobalKindDeclPairs));<br>
+  }<br>
+<br>
  Â // And a visible updates block for the translation unit.<br>
  Â Abv = new llvm::BitCodeAbbrev();<br>
  Â Abv->Add(llvm::BitCodeAbbrevOp(UPDATE_VISIBLE));<br>
@@ -4408,8 +4351,7 @@ void ASTWriter::WriteASTCore(Sema &SemaR<br>
  Â  Â  Â  Â writeBaseIDOrNone(M->BaseTypeIndex, M->LocalNumTypes);<br>
  Â  Â  Â }<br>
  Â  Â }<br>
-  Â  Record.clear();<br>
-  Â  Record.push_back(MODULE_OFFSET_MAP);<br>
+  Â  RecordDataRef Record = {MODULE_OFFSET_MAP};<br>
  Â  Â Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev, Record,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â Buffer.data(), Buffer.size());<br>
  Â }<br>
@@ -4573,7 +4515,7 @@ void ASTWriter::WriteASTCore(Sema &SemaR<br>
  Â  Â WriteOptimizePragmaOptions(SemaRef);<br>
<br>
  Â // Some simple statistics<br>
-  Record.clear();<br>
+  RecordData Record;<br>
  Â Record.push_back(NumStatements);<br>
  Â Record.push_back(NumMacros);<br>
  Â Record.push_back(NumLexicalDeclContexts);<br>
<br>
Modified: cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp?rev=247179&r1=247178&r2=247179&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp?rev=247179&r1=247178&r2=247179&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/GlobalModuleIndex.cpp Wed Sep  9 15:08:51 2015<br>
@@ -757,9 +757,7 @@ void GlobalModuleIndexBuilder::writeInde<br>
  Â  Â unsigned IDTableAbbrev = Stream.EmitAbbrev(Abbrev);<br>
<br>
  Â  Â // Write the identifier table<br>
-  Â  Record.clear();<br>
-  Â  Record.push_back(IDENTIFIER_INDEX);<br>
-  Â  Record.push_back(BucketOffset);<br>
+  Â  ArrayRef<uint64_t> Record = {IDENTIFIER_INDEX, BucketOffset};<br>
  Â  Â Stream.EmitRecordWithBlob(IDTableAbbrev, Record, IdentifierTable);<br>
  Â }<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>