summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2017-05-24 00:26:27 +0000
committerZachary Turner <zturner@google.com>2017-05-24 00:26:27 +0000
commitbb64231d2dd8a78a5b6365a3632902bdf4fe2d38 (patch)
tree10e09f4433766b31b6a927b001b8539e230a44e5
parentc4861adad9a3cd4c1eee705bef24410c4955654c (diff)
downloadbcm5719-llvm-bb64231d2dd8a78a5b6365a3632902bdf4fe2d38.tar.gz
bcm5719-llvm-bb64231d2dd8a78a5b6365a3632902bdf4fe2d38.zip
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
-rw-r--r--lld/COFF/PDB.cpp3
-rw-r--r--llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h6
-rw-r--r--llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp22
3 files changed, 15 insertions, 16 deletions
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp
index 2dbc3797c85..a1b0291a512 100644
--- a/lld/COFF/PDB.cpp
+++ b/lld/COFF/PDB.cpp
@@ -117,9 +117,8 @@ static void mergeDebugT(SymbolTable *Symtab, pdb::PDBFileBuilder &Builder,
Handler.addSearchPath(llvm::sys::path::parent_path(File->getName()));
if (auto EC = Reader.readArray(Types, Reader.getLength()))
fatal(EC, "Reader::readArray failed");
- codeview::LazyRandomTypeCollection TypesAndIds(Types, 100);
if (auto Err = codeview::mergeTypeAndIdRecords(
- IDTable, TypeTable, SourceToDest, &Handler, TypesAndIds))
+ IDTable, TypeTable, SourceToDest, &Handler, Types))
fatal(Err, "codeview::mergeTypeStreams failed");
}
diff --git a/llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h b/llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h
index d914cf2fd9f..3ad2b4e9c92 100644
--- a/llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h
+++ b/llvm/include/llvm/DebugInfo/CodeView/TypeStreamMerger.h
@@ -40,7 +40,7 @@ class TypeTableBuilder;
/// appropriate error code.
Error mergeTypeRecords(TypeTableBuilder &Dest,
SmallVectorImpl<TypeIndex> &SourceToDest,
- TypeServerHandler *Handler, TypeCollection &Types);
+ TypeServerHandler *Handler, const CVTypeArray &Types);
/// \brief Merge one set of id records into another. This method assumes
/// that all records are id records, and there are no Type records present.
@@ -65,7 +65,7 @@ Error mergeTypeRecords(TypeTableBuilder &Dest,
/// appropriate error code.
Error mergeIdRecords(TypeTableBuilder &Dest, ArrayRef<TypeIndex> Types,
SmallVectorImpl<TypeIndex> &SourceToDest,
- TypeCollection &Ids);
+ const CVTypeArray &Ids);
/// \brief Merge a unified set of type and id records, splitting them into
/// separate output streams.
@@ -89,7 +89,7 @@ Error mergeTypeAndIdRecords(TypeTableBuilder &DestIds,
TypeTableBuilder &DestTypes,
SmallVectorImpl<TypeIndex> &SourceToDest,
TypeServerHandler *Handler,
- TypeCollection &IdsAndTypes);
+ const CVTypeArray &IdsAndTypes);
} // end namespace codeview
} // end namespace llvm
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<TypeIndex> 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<TypeIndex> 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<TypeIndex> &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<TypeIndex> TypeSourceToDest,
SmallVectorImpl<TypeIndex> &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<TypeIndex> &SourceToDest, TypeServerHandler *Handler,
- TypeCollection &IdsAndTypes) {
+ const CVTypeArray &IdsAndTypes) {
TypeStreamMerger M(SourceToDest, Handler);
return M.mergeTypesAndIds(DestIds, DestTypes, IdsAndTypes);
OpenPOWER on IntegriCloud