From 57a41913edf328cc155806639d2f33e10d3b6a6d Mon Sep 17 00:00:00 2001 From: Mehdi Amini Date: Thu, 10 Sep 2015 01:46:39 +0000 Subject: [PATCH] EmitRecord* API change: accepts ArrayRef instead of a SmallVector (NFC) This reapply a variant commit r247179 after post-commit review from D.Blaikie. Hopefully I got it right this time: lifetime of initializer list ends as with any expression, which make invalid the pattern: ArrayRef Arr = { 1, 2, 3, 4}; Just like StringRef, ArrayRef shouldn't be used to initialize local variable but only as function argument. From: Mehdi Amini llvm-svn: 247233 --- clang/include/clang/Serialization/ASTWriter.h | 3 +- .../Frontend/SerializedDiagnosticPrinter.cpp | 72 ++--- clang/lib/Serialization/ASTWriter.cpp | 305 +++++++----------- clang/lib/Serialization/GlobalModuleIndex.cpp | 4 +- 4 files changed, 148 insertions(+), 236 deletions(-) diff --git a/clang/include/clang/Serialization/ASTWriter.h b/clang/include/clang/Serialization/ASTWriter.h index 1c045c26b7ea..d505bee6b0f4 100644 --- a/clang/include/clang/Serialization/ASTWriter.h +++ b/clang/include/clang/Serialization/ASTWriter.h @@ -84,6 +84,7 @@ class ASTWriter : public ASTDeserializationListener, public: typedef SmallVector RecordData; typedef SmallVectorImpl RecordDataImpl; + typedef ArrayRef RecordDataRef; friend class ASTDeclWriter; friend class ASTStmtWriter; @@ -756,7 +757,7 @@ public: void AddPath(StringRef Path, RecordDataImpl &Record); /// \brief Emit the current record with the given path as a blob. - void EmitRecordWithPath(unsigned Abbrev, RecordDataImpl &Record, + void EmitRecordWithPath(unsigned Abbrev, RecordDataRef Record, StringRef Path); /// \brief Add a version tuple to the given record diff --git a/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp b/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp index f63f9ef44ca7..1bf10d276945 100644 --- a/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp +++ b/clang/lib/Frontend/SerializedDiagnosticPrinter.cpp @@ -51,6 +51,7 @@ public: typedef SmallVector RecordData; typedef SmallVectorImpl RecordDataImpl; +typedef ArrayRef RecordDataRef; class SDiagsWriter; @@ -393,13 +394,9 @@ unsigned SDiagsWriter::getEmitFile(const char *FileName){ // Lazily generate the record for the file. entry = State->Files.size(); - RecordData Record; - Record.push_back(RECORD_FILENAME); - Record.push_back(entry); - Record.push_back(0); // For legacy. - Record.push_back(0); // For legacy. StringRef Name(FileName); - Record.push_back(Name.size()); + RecordData::value_type Record[] = {RECORD_FILENAME, entry, 0 /* For legacy */, + 0 /* For legacy */, Name.size()}; State->Stream.EmitRecordWithBlob(State->Abbrevs.get(RECORD_FILENAME), Record, Name); @@ -531,14 +528,11 @@ void SDiagsWriter::EmitBlockInfoBlock() { void SDiagsWriter::EmitMetaBlock() { llvm::BitstreamWriter &Stream = State->Stream; - RecordData &Record = State->Record; AbbreviationMap &Abbrevs = State->Abbrevs; Stream.EnterSubblock(BLOCK_META, 3); - Record.clear(); - Record.push_back(RECORD_VERSION); - Record.push_back(VersionNumber); - Stream.EmitRecordWithAbbrev(Abbrevs.get(RECORD_VERSION), Record); + RecordData::value_type Record[] = {RECORD_VERSION, VersionNumber}; + Stream.EmitRecordWithAbbrev(Abbrevs.get(RECORD_VERSION), Record); Stream.ExitBlock(); } @@ -548,11 +542,8 @@ unsigned SDiagsWriter::getEmitCategory(unsigned int category) { // We use a local version of 'Record' so that we can be generating // another record when we lazily generate one for the category entry. - RecordData Record; - Record.push_back(RECORD_CATEGORY); - Record.push_back(category); StringRef catName = DiagnosticIDs::getCategoryNameFromID(category); - Record.push_back(catName.size()); + RecordData::value_type Record[] = {RECORD_CATEGORY, category, catName.size()}; State->Stream.EmitRecordWithBlob(State->Abbrevs.get(RECORD_CATEGORY), Record, catName); @@ -581,10 +572,8 @@ unsigned SDiagsWriter::getEmitDiagnosticFlag(StringRef FlagName) { entry.second = FlagName; // Lazily emit the string in a separate record. - RecordData Record; - Record.push_back(RECORD_DIAG_FLAG); - Record.push_back(entry.first); - Record.push_back(FlagName.size()); + RecordData::value_type Record[] = {RECORD_DIAG_FLAG, entry.first, + FlagName.size()}; State->Stream.EmitRecordWithBlob(State->Abbrevs.get(RECORD_DIAG_FLAG), Record, FlagName); } @@ -844,17 +833,9 @@ std::error_code SDiagsMerger::visitEndOfDiagnostic() { std::error_code SDiagsMerger::visitSourceRangeRecord(const serialized_diags::Location &Start, const serialized_diags::Location &End) { - RecordData Record; - Record.push_back(RECORD_SOURCE_RANGE); - Record.push_back(FileLookup[Start.FileID]); - Record.push_back(Start.Line); - Record.push_back(Start.Col); - Record.push_back(Start.Offset); - Record.push_back(FileLookup[End.FileID]); - Record.push_back(End.Line); - Record.push_back(End.Col); - Record.push_back(End.Offset); - + RecordData::value_type Record[] = { + RECORD_SOURCE_RANGE, FileLookup[Start.FileID], Start.Line, Start.Col, + Start.Offset, FileLookup[End.FileID], End.Line, End.Col, End.Offset}; Writer.State->Stream.EmitRecordWithAbbrev( Writer.State->Abbrevs.get(RECORD_SOURCE_RANGE), Record); return std::error_code(); @@ -863,19 +844,13 @@ SDiagsMerger::visitSourceRangeRecord(const serialized_diags::Location &Start, std::error_code SDiagsMerger::visitDiagnosticRecord( unsigned Severity, const serialized_diags::Location &Location, unsigned Category, unsigned Flag, StringRef Message) { - RecordData MergedRecord; - MergedRecord.push_back(RECORD_DIAG); - MergedRecord.push_back(Severity); - MergedRecord.push_back(FileLookup[Location.FileID]); - MergedRecord.push_back(Location.Line); - MergedRecord.push_back(Location.Col); - MergedRecord.push_back(Location.Offset); - MergedRecord.push_back(CategoryLookup[Category]); - MergedRecord.push_back(Flag ? DiagFlagLookup[Flag] : 0); - MergedRecord.push_back(Message.size()); + RecordData::value_type Record[] = { + RECORD_DIAG, Severity, FileLookup[Location.FileID], Location.Line, + Location.Col, Location.Offset, CategoryLookup[Category], + Flag ? DiagFlagLookup[Flag] : 0, Message.size()}; Writer.State->Stream.EmitRecordWithBlob( - Writer.State->Abbrevs.get(RECORD_DIAG), MergedRecord, Message); + Writer.State->Abbrevs.get(RECORD_DIAG), Record, Message); return std::error_code(); } @@ -883,17 +858,10 @@ std::error_code SDiagsMerger::visitFixitRecord(const serialized_diags::Location &Start, const serialized_diags::Location &End, StringRef Text) { - RecordData Record; - Record.push_back(RECORD_FIXIT); - Record.push_back(FileLookup[Start.FileID]); - Record.push_back(Start.Line); - Record.push_back(Start.Col); - Record.push_back(Start.Offset); - Record.push_back(FileLookup[End.FileID]); - Record.push_back(End.Line); - Record.push_back(End.Col); - Record.push_back(End.Offset); - Record.push_back(Text.size()); + RecordData::value_type Record[] = {RECORD_FIXIT, FileLookup[Start.FileID], + Start.Line, Start.Col, Start.Offset, + FileLookup[End.FileID], End.Line, End.Col, + End.Offset, Text.size()}; Writer.State->Stream.EmitRecordWithBlob( Writer.State->Abbrevs.get(RECORD_FIXIT), Record, Text); diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index dfcc539284bb..67a7eeaa59fd 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1185,27 +1185,23 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context, MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // Errors MetadataAbbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // SVN branch/tag unsigned MetadataAbbrevCode = Stream.EmitAbbrev(MetadataAbbrev); - Record.push_back(METADATA); - Record.push_back(VERSION_MAJOR); - Record.push_back(VERSION_MINOR); - Record.push_back(CLANG_VERSION_MAJOR); - Record.push_back(CLANG_VERSION_MINOR); assert((!WritingModule || isysroot.empty()) && "writing module as a relocatable PCH?"); - Record.push_back(!isysroot.empty()); - Record.push_back(IncludeTimestamps); - Record.push_back(ASTHasCompilerErrors); - Stream.EmitRecordWithBlob(MetadataAbbrevCode, Record, - getClangFullRepositoryVersion()); - + { + RecordData::value_type Record[] = {METADATA, VERSION_MAJOR, VERSION_MINOR, + CLANG_VERSION_MAJOR, CLANG_VERSION_MINOR, + !isysroot.empty(), IncludeTimestamps, + ASTHasCompilerErrors}; + Stream.EmitRecordWithBlob(MetadataAbbrevCode, Record, + getClangFullRepositoryVersion()); + } if (WritingModule) { // For implicit modules we output a signature that we can use to ensure // duplicate module builds don't collide in the cache as their output order // is non-deterministic. // FIXME: Remove this when output is deterministic. if (Context.getLangOpts().ImplicitModules) { - Record.clear(); - Record.push_back(getSignature()); + RecordData::value_type Record[] = {getSignature()}; Stream.EmitRecord(SIGNATURE, Record); } @@ -1214,8 +1210,7 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context, Abbrev->Add(BitCodeAbbrevOp(MODULE_NAME)); Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Name unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev); - RecordData Record; - Record.push_back(MODULE_NAME); + RecordData::value_type Record[] = {MODULE_NAME}; Stream.EmitRecordWithBlob(AbbrevCode, Record, WritingModule->Name); } @@ -1236,8 +1231,7 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context, Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // Directory unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev); - RecordData Record; - Record.push_back(MODULE_DIRECTORY); + RecordData::value_type Record[] = {MODULE_DIRECTORY}; Stream.EmitRecordWithBlob(AbbrevCode, Record, BaseDir); } @@ -1466,8 +1460,7 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context, SM.getFileManager().makeAbsolutePath(OutputPath); StringRef origDir = llvm::sys::path::parent_path(OutputPath); - RecordData Record; - Record.push_back(ORIGINAL_PCH_DIR); + RecordData::value_type Record[] = {ORIGINAL_PCH_DIR}; Stream.EmitRecordWithBlob(AbbrevCode, Record, origDir); } @@ -1491,8 +1484,7 @@ void ASTWriter::WriteInputFiles(SourceManager &SourceMgr, bool Modules) { using namespace llvm; Stream.EnterSubblock(INPUT_FILES_BLOCK_ID, 4); - RecordData Record; - + // Create input-file abbreviation. BitCodeAbbrev *IFAbbrev = new BitCodeAbbrev(); IFAbbrev->Add(BitCodeAbbrevOp(INPUT_FILE)); @@ -1547,16 +1539,11 @@ void ASTWriter::WriteInputFiles(SourceManager &SourceMgr, if (!Entry.IsSystemFile) ++UserFilesNum; - Record.clear(); - Record.push_back(INPUT_FILE); - Record.push_back(InputFileOffsets.size()); - // Emit size/modification time for this file. - Record.push_back(Entry.File->getSize()); - Record.push_back(getTimestampForOutput(Entry.File)); - - // Whether this file was overridden. - Record.push_back(Entry.BufferOverridden); + // And whether this file was overridden. + RecordData::value_type Record[] = { + INPUT_FILE, InputFileOffsets.size(), (uint64_t)Entry.File->getSize(), + (uint64_t)getTimestampForOutput(Entry.File), Entry.BufferOverridden}; EmitRecordWithPath(IFAbbrevCode, Record, Entry.File->getName()); } @@ -1573,10 +1560,8 @@ void ASTWriter::WriteInputFiles(SourceManager &SourceMgr, unsigned OffsetsAbbrevCode = Stream.EmitAbbrev(OffsetsAbbrev); // Write input file offsets. - Record.clear(); - Record.push_back(INPUT_FILE_OFFSETS); - Record.push_back(InputFileOffsets.size()); - Record.push_back(UserFilesNum); + RecordData::value_type Record[] = {INPUT_FILE_OFFSETS, + InputFileOffsets.size(), UserFilesNum}; Stream.EmitRecordWithBlob(OffsetsAbbrevCode, Record, bytes(InputFileOffsets)); } @@ -1818,11 +1803,8 @@ void ASTWriter::WriteHeaderSearch(const HeaderSearch &HS) { unsigned TableAbbrev = Stream.EmitAbbrev(Abbrev); // Write the header search table - RecordData Record; - Record.push_back(HEADER_SEARCH_TABLE); - Record.push_back(BucketOffset); - Record.push_back(NumHeaderSearchEntries); - Record.push_back(TableData.size()); + RecordData::value_type Record[] = {HEADER_SEARCH_TABLE, BucketOffset, + NumHeaderSearchEntries, TableData.size()}; TableData.append(GeneratorTrait.strings_begin(),GeneratorTrait.strings_end()); Stream.EmitRecordWithBlob(TableAbbrev, Record, TableData); @@ -1911,8 +1893,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, Stream.EmitRecordWithAbbrev(SLocFileAbbrv, Record); if (Content->BufferOverridden) { - Record.clear(); - Record.push_back(SM_SLOC_BUFFER_BLOB); + RecordData::value_type Record[] = {SM_SLOC_BUFFER_BLOB}; const llvm::MemoryBuffer *Buffer = Content->getBuffer(PP.getDiagnostics(), PP.getSourceManager()); Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv, Record, @@ -1931,8 +1912,7 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, const char *Name = Buffer->getBufferIdentifier(); Stream.EmitRecordWithBlob(SLocBufferAbbrv, Record, StringRef(Name, strlen(Name) + 1)); - Record.clear(); - Record.push_back(SM_SLOC_BUFFER_BLOB); + RecordData::value_type Record[] = {SM_SLOC_BUFFER_BLOB}; Stream.EmitRecordWithBlob(SLocBufferBlobAbbrv, Record, StringRef(Buffer->getBufferStart(), Buffer->getBufferSize() + 1)); @@ -1972,13 +1952,13 @@ void ASTWriter::WriteSourceManagerBlock(SourceManager &SourceMgr, Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 16)); // total size Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // offsets unsigned SLocOffsetsAbbrev = Stream.EmitAbbrev(Abbrev); - - Record.clear(); - Record.push_back(SOURCE_LOCATION_OFFSETS); - Record.push_back(SLocEntryOffsets.size()); - Record.push_back(SourceMgr.getNextLocalOffset() - 1); // skip dummy - Stream.EmitRecordWithBlob(SLocOffsetsAbbrev, Record, bytes(SLocEntryOffsets)); - + { + RecordData::value_type Record[] = { + SOURCE_LOCATION_OFFSETS, SLocEntryOffsets.size(), + SourceMgr.getNextLocalOffset() - 1 /* skip dummy */}; + Stream.EmitRecordWithBlob(SLocOffsetsAbbrev, Record, + bytes(SLocEntryOffsets)); + } // Write the source location entry preloads array, telling the AST // reader which source locations entries it should load eagerly. Stream.EmitRecord(SOURCE_LOCATION_PRELOADS, PreloadSLocs); @@ -2064,9 +2044,8 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) { // If the preprocessor __COUNTER__ value has been bumped, remember it. if (PP.getCounterValue() != 0) { - Record.push_back(PP.getCounterValue()); + RecordData::value_type Record[] = {PP.getCounterValue()}; Stream.EmitRecord(PP_COUNTER_VALUE, Record); - Record.clear(); } // Enter the preprocessor block. @@ -2232,12 +2211,11 @@ void ASTWriter::WritePreprocessor(const Preprocessor &PP, bool IsModule) { Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); unsigned MacroOffsetAbbrev = Stream.EmitAbbrev(Abbrev); - Record.clear(); - Record.push_back(MACRO_OFFSET); - Record.push_back(MacroOffsets.size()); - Record.push_back(FirstMacroID - NUM_PREDEF_MACRO_IDS); - Stream.EmitRecordWithBlob(MacroOffsetAbbrev, Record, - bytes(MacroOffsets)); + { + RecordData::value_type Record[] = {MACRO_OFFSET, MacroOffsets.size(), + FirstMacroID - NUM_PREDEF_MACRO_IDS}; + Stream.EmitRecordWithBlob(MacroOffsetAbbrev, Record, bytes(MacroOffsets)); + } } void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec) { @@ -2331,9 +2309,9 @@ void ASTWriter::WritePreprocessorDetail(PreprocessingRecord &PPRec) { Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); unsigned PPEOffsetAbbrev = Stream.EmitAbbrev(Abbrev); - Record.clear(); - Record.push_back(PPD_ENTITIES_OFFSETS); - Record.push_back(FirstPreprocessorEntityID - NUM_PREDEF_PP_ENTITY_IDS); + RecordData::value_type Record[] = {PPD_ENTITIES_OFFSETS, + FirstPreprocessorEntityID - + NUM_PREDEF_PP_ENTITY_IDS}; Stream.EmitRecordWithBlob(PPEOffsetAbbrev, Record, bytes(PreprocessedEntityOffsets)); } @@ -2460,9 +2438,9 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) { unsigned ConflictAbbrev = Stream.EmitAbbrev(Abbrev); // Write the submodule metadata block. - RecordData Record; - Record.push_back(getNumberOfModules(WritingModule)); - Record.push_back(FirstSubmoduleID - NUM_PREDEF_SUBMODULE_IDS); + RecordData::value_type Record[] = {getNumberOfModules(WritingModule), + FirstSubmoduleID - + NUM_PREDEF_SUBMODULE_IDS}; Stream.EmitRecord(SUBMODULE_METADATA, Record); // Write all of the submodules. @@ -2472,45 +2450,37 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) { Module *Mod = Q.front(); Q.pop(); unsigned ID = getSubmoduleID(Mod); - - // Emit the definition of the block. - Record.clear(); - Record.push_back(SUBMODULE_DEFINITION); - Record.push_back(ID); + + uint64_t ParentID = 0; if (Mod->Parent) { assert(SubmoduleIDs[Mod->Parent] && "Submodule parent not written?"); - Record.push_back(SubmoduleIDs[Mod->Parent]); - } else { - Record.push_back(0); + ParentID = SubmoduleIDs[Mod->Parent]; } - Record.push_back(Mod->IsFramework); - Record.push_back(Mod->IsExplicit); - Record.push_back(Mod->IsSystem); - Record.push_back(Mod->IsExternC); - Record.push_back(Mod->InferSubmodules); - Record.push_back(Mod->InferExplicitSubmodules); - Record.push_back(Mod->InferExportWildcard); - Record.push_back(Mod->ConfigMacrosExhaustive); - Stream.EmitRecordWithBlob(DefinitionAbbrev, Record, Mod->Name); - + + // Emit the definition of the block. + { + RecordData::value_type Record[] = { + SUBMODULE_DEFINITION, ID, ParentID, Mod->IsFramework, Mod->IsExplicit, + Mod->IsSystem, Mod->IsExternC, Mod->InferSubmodules, + Mod->InferExplicitSubmodules, Mod->InferExportWildcard, + Mod->ConfigMacrosExhaustive}; + Stream.EmitRecordWithBlob(DefinitionAbbrev, Record, Mod->Name); + } + // Emit the requirements. for (const auto &R : Mod->Requirements) { - Record.clear(); - Record.push_back(SUBMODULE_REQUIRES); - Record.push_back(R.second); + RecordData::value_type Record[] = {SUBMODULE_REQUIRES, R.second}; Stream.EmitRecordWithBlob(RequiresAbbrev, Record, R.first); } // Emit the umbrella header, if there is one. if (auto UmbrellaHeader = Mod->getUmbrellaHeader()) { - Record.clear(); - Record.push_back(SUBMODULE_UMBRELLA_HEADER); + RecordData::value_type Record[] = {SUBMODULE_UMBRELLA_HEADER}; Stream.EmitRecordWithBlob(UmbrellaAbbrev, Record, UmbrellaHeader.NameAsWritten); } else if (auto UmbrellaDir = Mod->getUmbrellaDir()) { - Record.clear(); - Record.push_back(SUBMODULE_UMBRELLA_DIR); - Stream.EmitRecordWithBlob(UmbrellaDirAbbrev, Record, + RecordData::value_type Record[] = {SUBMODULE_UMBRELLA_DIR}; + Stream.EmitRecordWithBlob(UmbrellaDirAbbrev, Record, UmbrellaDir.NameAsWritten); } @@ -2528,8 +2498,7 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) { {SUBMODULE_EXCLUDED_HEADER, ExcludedHeaderAbbrev, Module::HK_Excluded} }; for (auto &HL : HeaderLists) { - Record.clear(); - Record.push_back(HL.RecordKind); + RecordData::value_type Record[] = {HL.RecordKind}; for (auto &H : Mod->Headers[HL.HeaderKind]) Stream.EmitRecordWithBlob(HL.Abbrev, Record, H.NameAsWritten); } @@ -2537,15 +2506,14 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) { // Emit the top headers. { auto TopHeaders = Mod->getTopHeaders(PP->getFileManager()); - Record.clear(); - Record.push_back(SUBMODULE_TOPHEADER); + RecordData::value_type Record[] = {SUBMODULE_TOPHEADER}; for (auto *H : TopHeaders) Stream.EmitRecordWithBlob(TopHeaderAbbrev, Record, H->getName()); } // Emit the imports. if (!Mod->Imports.empty()) { - Record.clear(); + RecordData Record; for (auto *I : Mod->Imports) Record.push_back(getSubmoduleID(I)); Stream.EmitRecord(SUBMODULE_IMPORTS, Record); @@ -2553,7 +2521,7 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) { // Emit the exports. if (!Mod->Exports.empty()) { - Record.clear(); + RecordData Record; for (const auto &E : Mod->Exports) { // FIXME: This may fail; we don't require that all exported modules // are local or imported. @@ -2569,26 +2537,23 @@ void ASTWriter::WriteSubmodules(Module *WritingModule) { // Emit the link libraries. for (const auto &LL : Mod->LinkLibraries) { - Record.clear(); - Record.push_back(SUBMODULE_LINK_LIBRARY); - Record.push_back(LL.IsFramework); + RecordData::value_type Record[] = {SUBMODULE_LINK_LIBRARY, + LL.IsFramework}; Stream.EmitRecordWithBlob(LinkLibraryAbbrev, Record, LL.Library); } // Emit the conflicts. for (const auto &C : Mod->Conflicts) { - Record.clear(); - Record.push_back(SUBMODULE_CONFLICT); // FIXME: This may fail; we don't require that all conflicting modules // are local or imported. - Record.push_back(getSubmoduleID(C.Other)); + RecordData::value_type Record[] = {SUBMODULE_CONFLICT, + getSubmoduleID(C.Other)}; Stream.EmitRecordWithBlob(ConflictAbbrev, Record, C.Message); } // Emit the configuration macros. for (const auto &CM : Mod->ConfigMacros) { - Record.clear(); - Record.push_back(SUBMODULE_CONFIG_MACRO); + RecordData::value_type Record[] = {SUBMODULE_CONFIG_MACRO}; Stream.EmitRecordWithBlob(ConfigMacroAbbrev, Record, CM); } @@ -2670,8 +2635,6 @@ void ASTWriter::WriteCXXCtorInitializersOffsets() { if (CXXCtorInitializersOffsets.empty()) return; - RecordData Record; - // Create a blob abbreviation for the C++ ctor initializer offsets. using namespace llvm; @@ -2682,9 +2645,8 @@ void ASTWriter::WriteCXXCtorInitializersOffsets() { unsigned CtorInitializersOffsetAbbrev = Stream.EmitAbbrev(Abbrev); // Write the base specifier offsets table. - Record.clear(); - Record.push_back(CXX_CTOR_INITIALIZERS_OFFSETS); - Record.push_back(CXXCtorInitializersOffsets.size()); + RecordData::value_type Record[] = {CXX_CTOR_INITIALIZERS_OFFSETS, + CXXCtorInitializersOffsets.size()}; Stream.EmitRecordWithBlob(CtorInitializersOffsetAbbrev, Record, bytes(CXXCtorInitializersOffsets)); } @@ -2693,8 +2655,6 @@ void ASTWriter::WriteCXXBaseSpecifiersOffsets() { if (CXXBaseSpecifiersOffsets.empty()) return; - RecordData Record; - // Create a blob abbreviation for the C++ base specifiers offsets. using namespace llvm; @@ -2705,9 +2665,8 @@ void ASTWriter::WriteCXXBaseSpecifiersOffsets() { unsigned BaseSpecifierOffsetAbbrev = Stream.EmitAbbrev(Abbrev); // Write the base specifier offsets table. - Record.clear(); - Record.push_back(CXX_BASE_SPECIFIER_OFFSETS); - Record.push_back(CXXBaseSpecifiersOffsets.size()); + RecordData::value_type Record[] = {CXX_BASE_SPECIFIER_OFFSETS, + CXXBaseSpecifiersOffsets.size()}; Stream.EmitRecordWithBlob(BaseSpecifierOffsetAbbrev, Record, bytes(CXXBaseSpecifiersOffsets)); } @@ -2778,8 +2737,6 @@ uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context, return 0; uint64_t Offset = Stream.GetCurrentBitNo(); - RecordData Record; - Record.push_back(DECL_CONTEXT_LEXICAL); SmallVector KindDeclPairs; for (const auto *D : DC->decls()) { KindDeclPairs.push_back(D->getKind()); @@ -2787,6 +2744,7 @@ uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context, } ++NumLexicalDeclContexts; + RecordData::value_type Record[] = {DECL_CONTEXT_LEXICAL}; Stream.EmitRecordWithBlob(DeclContextLexicalAbbrev, Record, bytes(KindDeclPairs)); return Offset; @@ -2794,7 +2752,6 @@ uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context, void ASTWriter::WriteTypeDeclOffsets() { using namespace llvm; - RecordData Record; // Write the type offsets array BitCodeAbbrev *Abbrev = new BitCodeAbbrev(); @@ -2803,11 +2760,11 @@ void ASTWriter::WriteTypeDeclOffsets() { Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base type index Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // types block unsigned TypeOffsetAbbrev = Stream.EmitAbbrev(Abbrev); - Record.clear(); - Record.push_back(TYPE_OFFSET); - Record.push_back(TypeOffsets.size()); - Record.push_back(FirstTypeID - NUM_PREDEF_TYPE_IDS); - Stream.EmitRecordWithBlob(TypeOffsetAbbrev, Record, bytes(TypeOffsets)); + { + RecordData::value_type Record[] = {TYPE_OFFSET, TypeOffsets.size(), + FirstTypeID - NUM_PREDEF_TYPE_IDS}; + Stream.EmitRecordWithBlob(TypeOffsetAbbrev, Record, bytes(TypeOffsets)); + } // Write the declaration offsets array Abbrev = new BitCodeAbbrev(); @@ -2816,16 +2773,15 @@ void ASTWriter::WriteTypeDeclOffsets() { Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); // base decl ID Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // declarations block unsigned DeclOffsetAbbrev = Stream.EmitAbbrev(Abbrev); - Record.clear(); - Record.push_back(DECL_OFFSET); - Record.push_back(DeclOffsets.size()); - Record.push_back(FirstDeclID - NUM_PREDEF_DECL_IDS); - Stream.EmitRecordWithBlob(DeclOffsetAbbrev, Record, bytes(DeclOffsets)); + { + RecordData::value_type Record[] = {DECL_OFFSET, DeclOffsets.size(), + FirstDeclID - NUM_PREDEF_DECL_IDS}; + Stream.EmitRecordWithBlob(DeclOffsetAbbrev, Record, bytes(DeclOffsets)); + } } void ASTWriter::WriteFileDeclIDsMap() { using namespace llvm; - RecordData Record; SmallVector, 64> SortedFileDeclIDs( FileDeclIDs.begin(), FileDeclIDs.end()); @@ -2846,8 +2802,8 @@ void ASTWriter::WriteFileDeclIDsMap() { Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32)); Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); unsigned AbbrevCode = Stream.EmitAbbrev(Abbrev); - Record.push_back(FILE_SORTED_DECLS); - Record.push_back(FileGroupedDeclIDs.size()); + RecordData::value_type Record[] = {FILE_SORTED_DECLS, + FileGroupedDeclIDs.size()}; Stream.EmitRecordWithBlob(AbbrevCode, Record, bytes(FileGroupedDeclIDs)); } @@ -3057,11 +3013,11 @@ void ASTWriter::WriteSelectors(Sema &SemaRef) { unsigned MethodPoolAbbrev = Stream.EmitAbbrev(Abbrev); // Write the method pool - RecordData Record; - Record.push_back(METHOD_POOL); - Record.push_back(BucketOffset); - Record.push_back(NumTableEntries); - Stream.EmitRecordWithBlob(MethodPoolAbbrev, Record, MethodPool); + { + RecordData::value_type Record[] = {METHOD_POOL, BucketOffset, + NumTableEntries}; + Stream.EmitRecordWithBlob(MethodPoolAbbrev, Record, MethodPool); + } // Create a blob abbreviation for the selector table offsets. Abbrev = new BitCodeAbbrev(); @@ -3072,12 +3028,13 @@ void ASTWriter::WriteSelectors(Sema &SemaRef) { unsigned SelectorOffsetAbbrev = Stream.EmitAbbrev(Abbrev); // Write the selector offsets table. - Record.clear(); - Record.push_back(SELECTOR_OFFSETS); - Record.push_back(SelectorOffsets.size()); - Record.push_back(FirstSelectorID - NUM_PREDEF_SELECTOR_IDS); - Stream.EmitRecordWithBlob(SelectorOffsetAbbrev, Record, - bytes(SelectorOffsets)); + { + RecordData::value_type Record[] = { + SELECTOR_OFFSETS, SelectorOffsets.size(), + FirstSelectorID - NUM_PREDEF_SELECTOR_IDS}; + Stream.EmitRecordWithBlob(SelectorOffsetAbbrev, Record, + bytes(SelectorOffsets)); + } } } @@ -3347,9 +3304,7 @@ void ASTWriter::WriteIdentifierTable(Preprocessor &PP, unsigned IDTableAbbrev = Stream.EmitAbbrev(Abbrev); // Write the identifier table - RecordData Record; - Record.push_back(IDENTIFIER_TABLE); - Record.push_back(BucketOffset); + RecordData::value_type Record[] = {IDENTIFIER_TABLE, BucketOffset}; Stream.EmitRecordWithBlob(IDTableAbbrev, Record, IdentifierTable); } @@ -3365,11 +3320,10 @@ void ASTWriter::WriteIdentifierTable(Preprocessor &PP, for (unsigned I = 0, N = IdentifierOffsets.size(); I != N; ++I) assert(IdentifierOffsets[I] && "Missing identifier offset?"); #endif - - RecordData Record; - Record.push_back(IDENTIFIER_OFFSET); - Record.push_back(IdentifierOffsets.size()); - Record.push_back(FirstIdentID - NUM_PREDEF_IDENT_IDS); + + RecordData::value_type Record[] = {IDENTIFIER_OFFSET, + IdentifierOffsets.size(), + FirstIdentID - NUM_PREDEF_IDENT_IDS}; Stream.EmitRecordWithBlob(IdentifierOffsetAbbrev, Record, bytes(IdentifierOffsets)); @@ -3785,8 +3739,7 @@ uint64_t ASTWriter::WriteDeclContextVisibleBlock(ASTContext &Context, GenerateNameLookupTable(DC, LookupTable); // Write the lookup table - RecordData Record; - Record.push_back(DECL_CONTEXT_VISIBLE); + RecordData::value_type Record[] = {DECL_CONTEXT_VISIBLE}; Stream.EmitRecordWithBlob(DeclContextVisibleLookupAbbrev, Record, LookupTable); ++NumVisibleDeclContexts; @@ -3817,16 +3770,13 @@ void ASTWriter::WriteDeclContextVisibleUpdate(const DeclContext *DC) { DC = cast(Chain->getKeyDeclaration(cast(DC))); // Write the lookup table - RecordData Record; - Record.push_back(UPDATE_VISIBLE); - Record.push_back(getDeclID(cast(DC))); + RecordData::value_type Record[] = {UPDATE_VISIBLE, getDeclID(cast(DC))}; Stream.EmitRecordWithBlob(UpdateVisibleAbbrev, Record, LookupTable); } /// \brief Write an FP_PRAGMA_OPTIONS block for the given FPOptions. void ASTWriter::WriteFPPragmaOptions(const FPOptions &Opts) { - RecordData Record; - Record.push_back(Opts.fp_contract); + RecordData::value_type Record[] = {Opts.fp_contract}; Stream.EmitRecord(FP_PRAGMA_OPTIONS, Record); } @@ -3883,14 +3833,12 @@ void ASTWriter::WriteObjCCategories() { Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of entries Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); unsigned AbbrevID = Stream.EmitAbbrev(Abbrev); - - RecordData Record; - Record.push_back(OBJC_CATEGORIES_MAP); - Record.push_back(CategoriesMap.size()); - Stream.EmitRecordWithBlob(AbbrevID, Record, - reinterpret_cast(CategoriesMap.data()), + + RecordData::value_type Record[] = {OBJC_CATEGORIES_MAP, CategoriesMap.size()}; + Stream.EmitRecordWithBlob(AbbrevID, Record, + reinterpret_cast(CategoriesMap.data()), CategoriesMap.size() * sizeof(ObjCCategoriesInfo)); - + // Emit the category lists. Stream.EmitRecord(OBJC_CATEGORIES, Categories); } @@ -3987,7 +3935,7 @@ void ASTWriter::AddPath(StringRef Path, RecordDataImpl &Record) { AddString(FilePath, Record); } -void ASTWriter::EmitRecordWithPath(unsigned Abbrev, RecordDataImpl &Record, +void ASTWriter::EmitRecordWithPath(unsigned Abbrev, RecordDataRef Record, StringRef Path) { SmallString<128> FilePath(Path); PreparePathForOutput(FilePath); @@ -4250,14 +4198,14 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, WriteControlBlock(PP, Context, isysroot, OutputFile); // Write the remaining AST contents. - RecordData Record; Stream.EnterSubblock(AST_BLOCK_ID, 5); // This is so that older clang versions, before the introduction // of the control block, can read and reject the newer PCH format. - Record.clear(); - Record.push_back(VERSION_MAJOR); - Stream.EmitRecord(METADATA_OLD_FORMAT, Record); + { + RecordData Record = {VERSION_MAJOR}; + Stream.EmitRecord(METADATA_OLD_FORMAT, Record); + } // Create a lexical update block containing all of the declarations in the // translation unit that do not come from other AST files. @@ -4274,11 +4222,12 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, Abv->Add(llvm::BitCodeAbbrevOp(TU_UPDATE_LEXICAL)); Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)); unsigned TuUpdateLexicalAbbrev = Stream.EmitAbbrev(Abv); - Record.clear(); - Record.push_back(TU_UPDATE_LEXICAL); - Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev, Record, - bytes(NewGlobalKindDeclPairs)); - + { + RecordData::value_type Record[] = {TU_UPDATE_LEXICAL}; + Stream.EmitRecordWithBlob(TuUpdateLexicalAbbrev, Record, + bytes(NewGlobalKindDeclPairs)); + } + // And a visible updates block for the translation unit. Abv = new llvm::BitCodeAbbrev(); Abv->Add(llvm::BitCodeAbbrevOp(UPDATE_VISIBLE)); @@ -4408,8 +4357,7 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, writeBaseIDOrNone(M->BaseTypeIndex, M->LocalNumTypes); } } - Record.clear(); - Record.push_back(MODULE_OFFSET_MAP); + RecordData::value_type Record[] = {MODULE_OFFSET_MAP}; Stream.EmitRecordWithBlob(ModuleOffsetMapAbbrev, Record, Buffer.data(), Buffer.size()); } @@ -4573,11 +4521,8 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, WriteOptimizePragmaOptions(SemaRef); // Some simple statistics - Record.clear(); - Record.push_back(NumStatements); - Record.push_back(NumMacros); - Record.push_back(NumLexicalDeclContexts); - Record.push_back(NumVisibleDeclContexts); + RecordData::value_type Record[] = { + NumStatements, NumMacros, NumLexicalDeclContexts, NumVisibleDeclContexts}; Stream.EmitRecord(STATISTICS, Record); Stream.ExitBlock(); } diff --git a/clang/lib/Serialization/GlobalModuleIndex.cpp b/clang/lib/Serialization/GlobalModuleIndex.cpp index 17c7914243e7..af5f94a5cdc4 100644 --- a/clang/lib/Serialization/GlobalModuleIndex.cpp +++ b/clang/lib/Serialization/GlobalModuleIndex.cpp @@ -757,9 +757,7 @@ void GlobalModuleIndexBuilder::writeIndex(llvm::BitstreamWriter &Stream) { unsigned IDTableAbbrev = Stream.EmitAbbrev(Abbrev); // Write the identifier table - Record.clear(); - Record.push_back(IDENTIFIER_INDEX); - Record.push_back(BucketOffset); + uint64_t Record[] = {IDENTIFIER_INDEX, BucketOffset}; Stream.EmitRecordWithBlob(IDTableAbbrev, Record, IdentifierTable); }