[PDB] Don't build the entire source file list up front.
authorZachary Turner <zturner@google.com>
Thu, 4 May 2017 23:53:29 +0000 (23:53 +0000)
committerZachary Turner <zturner@google.com>
Thu, 4 May 2017 23:53:29 +0000 (23:53 +0000)
commit1eb9a0297cb639323e97ca7f02123b035bf0b24b
treeddb035ff414d6531ae8e47e0b070b1996c302422
parent20d773c4af45411a77c1715857c2559ffe3a9f09
[PDB] Don't build the entire source file list up front.

I tried to run llvm-pdbdump on a very large (~1.5GB) PDB to
try and identify show-stopping performance problems.  This
patch addresses the first such problem.

When loading the DBI stream, before anyone has even tried to
access a single record, we build an in memory map of every
source file for every module.  In the particular PDB I was
using, this was over 85 million files.  Specifically, the
complexity is O(m*n) where m is the number of modules and
n is the average number of source files (including headers)
per module.

The whole reason for doing this was so that we could have
constant time access to any module and any of its source
file lists.  However, we can still get O(1) access to the
source file list for a given module with a simple O(m)
precomputation, and access to the list of modules is
already O(1) anyway.

So this patches reduces the O(m*n) up-front precomputation
to an O(m) one, where n is ~6,500 and n*m is about 85 million
in my pathological test case.

Differential Revision: https://reviews.llvm.org/D32870

llvm-svn: 302205
16 files changed:
llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h
llvm/include/llvm/DebugInfo/PDB/Native/DbiModuleList.h [new file with mode: 0644]
llvm/include/llvm/DebugInfo/PDB/Native/DbiStream.h
llvm/include/llvm/DebugInfo/PDB/Native/NativeCompilandSymbol.h
llvm/include/llvm/DebugInfo/PDB/Native/NativeEnumModules.h
llvm/include/llvm/DebugInfo/PDB/Native/RawTypes.h
llvm/include/llvm/Support/BinaryStreamArray.h
llvm/lib/DebugInfo/PDB/CMakeLists.txt
llvm/lib/DebugInfo/PDB/Native/DbiModuleList.cpp [new file with mode: 0644]
llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp
llvm/lib/DebugInfo/PDB/Native/NativeCompilandSymbol.cpp
llvm/lib/DebugInfo/PDB/Native/NativeEnumModules.cpp
llvm/lib/DebugInfo/PDB/Native/NativeExeSymbol.cpp
llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp
llvm/tools/llvm-pdbdump/StreamUtil.cpp
llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp