From bb64231d2dd8a78a5b6365a3632902bdf4fe2d38 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Wed, 24 May 2017 00:26:27 +0000 Subject: Don't do a full scan of the type stream before processing records. LazyRandomTypeCollection is designed for random access, and in order to provide this it lazily indexes ranges of types. In the case of types from an object file, there is no partial index to build off of, so it has to index the full stream up front. However, merging types only requires sequential access, and when that is needed, this extra work is simply wasted. Changing the algorithm to work on sequential arrays of types rather than random access type collections eliminates this up front scan. llvm-svn: 303707 --- llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'llvm/lib/DebugInfo/CodeView') diff --git a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp index 152634056bd..383799bca7e 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp @@ -81,14 +81,14 @@ public: Error visitMemberEnd(CVMemberRecord &Record) override; Error mergeTypesAndIds(TypeTableBuilder &DestIds, TypeTableBuilder &DestTypes, - TypeCollection &IdsAndTypes); + const CVTypeArray &IdsAndTypes); Error mergeIdRecords(TypeTableBuilder &Dest, ArrayRef TypeSourceToDest, - TypeCollection &Ids); - Error mergeTypeRecords(TypeTableBuilder &Dest, TypeCollection &Types); + const CVTypeArray &Ids); + Error mergeTypeRecords(TypeTableBuilder &Dest, const CVTypeArray &Types); private: - Error doit(TypeCollection &Types); + Error doit(const CVTypeArray &Types); void addMapping(TypeIndex Idx); @@ -497,7 +497,7 @@ Error TypeStreamMerger::visitUnknownType(CVType &Rec) { } Error TypeStreamMerger::mergeTypeRecords(TypeTableBuilder &Dest, - TypeCollection &Types) { + const CVTypeArray &Types) { DestTypeStream = &Dest; return doit(Types); @@ -505,7 +505,7 @@ Error TypeStreamMerger::mergeTypeRecords(TypeTableBuilder &Dest, Error TypeStreamMerger::mergeIdRecords(TypeTableBuilder &Dest, ArrayRef TypeSourceToDest, - TypeCollection &Ids) { + const CVTypeArray &Ids) { DestIdStream = &Dest; TypeLookup = TypeSourceToDest; @@ -514,14 +514,14 @@ Error TypeStreamMerger::mergeIdRecords(TypeTableBuilder &Dest, Error TypeStreamMerger::mergeTypesAndIds(TypeTableBuilder &DestIds, TypeTableBuilder &DestTypes, - TypeCollection &IdsAndTypes) { + const CVTypeArray &IdsAndTypes) { DestIdStream = &DestIds; DestTypeStream = &DestTypes; return doit(IdsAndTypes); } -Error TypeStreamMerger::doit(TypeCollection &Types) { +Error TypeStreamMerger::doit(const CVTypeArray &Types) { LastError = Error::success(); if (auto EC = codeview::visitTypeStream(Types, *this, Handler)) @@ -559,7 +559,7 @@ Error TypeStreamMerger::doit(TypeCollection &Types) { Error llvm::codeview::mergeTypeRecords(TypeTableBuilder &Dest, SmallVectorImpl &SourceToDest, TypeServerHandler *Handler, - TypeCollection &Types) { + const CVTypeArray &Types) { TypeStreamMerger M(SourceToDest, Handler); return M.mergeTypeRecords(Dest, Types); } @@ -567,7 +567,7 @@ Error llvm::codeview::mergeTypeRecords(TypeTableBuilder &Dest, Error llvm::codeview::mergeIdRecords(TypeTableBuilder &Dest, ArrayRef TypeSourceToDest, SmallVectorImpl &SourceToDest, - TypeCollection &Ids) { + const CVTypeArray &Ids) { TypeStreamMerger M(SourceToDest, nullptr); return M.mergeIdRecords(Dest, TypeSourceToDest, Ids); } @@ -575,7 +575,7 @@ Error llvm::codeview::mergeIdRecords(TypeTableBuilder &Dest, Error llvm::codeview::mergeTypeAndIdRecords( TypeTableBuilder &DestIds, TypeTableBuilder &DestTypes, SmallVectorImpl &SourceToDest, TypeServerHandler *Handler, - TypeCollection &IdsAndTypes) { + const CVTypeArray &IdsAndTypes) { TypeStreamMerger M(SourceToDest, Handler); return M.mergeTypesAndIds(DestIds, DestTypes, IdsAndTypes); -- cgit v1.2.3