llvm/tools/llvm-pdbutil/TypeReferenceTracker.h
Reid Kleckner 983ff6b359 [llvm-pdbutil] Add -type-ref-stats to help find unused type info
Summary:
This considers module symbol streams and the global symbol stream to be
roots. Most types that this considers "unreferenced" are referenced by
LF_UDT_MOD_SRC_LINE id records, which VC seems to always include.
Essentially, they are types that the user can only find in the debugger
if they call them by name, they cannot be found by traversing a symbol.

In practice, around 80% of type information in a PDB is referenced by a
symbol. That seems like a reasonable number.

I don't really plan to do anything with this tool. It mostly just exists
for informational purposes, and to confirm that we probably don't need
to implement type reference tracking in LLD. We can continue to merge
all types as we do today without wasting space.

Reviewers: zturner, aganea

Subscribers: mgorny, hiraditya, arphaman, jdoerfert, llvm-commits

Tags: #llvm

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@356692 91177308-0d34-0410-b5e6-96231b3b80d8
2019-03-21 18:02:34 +00:00

70 lines
2.1 KiB
C++

//===- TypeReferenceTracker.h --------------------------------- *- C++ --*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_TOOLS_LLVMPDBDUMP_TYPEREFERENCETRACKER_H
#define LLVM_TOOLS_LLVMPDBDUMP_TYPEREFERENCETRACKER_H
#include "InputFile.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/DebugInfo/CodeView/CVRecord.h"
#include "llvm/DebugInfo/CodeView/TypeIndex.h"
#include "llvm/DebugInfo/CodeView/TypeIndexDiscovery.h"
#include "llvm/Support/Error.h"
namespace llvm {
namespace pdb {
class TpiStream;
/// Maintains bitvector to track whether a type was referenced by a symbol
/// record.
class TypeReferenceTracker {
public:
TypeReferenceTracker(InputFile &File);
// Do the work of marking referenced types.
void mark();
// Return true if a symbol record transitively references this type.
bool isTypeReferenced(codeview::TypeIndex TI) {
return TI.toArrayIndex() <= NumTypeRecords &&
TypeReferenced.test(TI.toArrayIndex());
}
private:
void addTypeRefsFromSymbol(const codeview::CVSymbol &Sym);
// Mark types on this list as referenced.
void addReferencedTypes(ArrayRef<uint8_t> RecData,
ArrayRef<codeview::TiReference> Refs);
// Consume all types on the worklist.
void markReferencedTypes();
void addOneTypeRef(codeview::TiRefKind RefKind, codeview::TypeIndex RefTI);
InputFile &File;
codeview::LazyRandomTypeCollection &Types;
codeview::LazyRandomTypeCollection *Ids = nullptr;
TpiStream *Tpi = nullptr;
BitVector TypeReferenced;
BitVector IdReferenced;
SmallVector<std::pair<codeview::TiRefKind, codeview::TypeIndex>, 10>
RefWorklist;
uint32_t NumTypeRecords = 0;
uint32_t NumIdRecords = 0;
};
} // namespace pdb
} // namespace llvm
#endif // LLVM_TOOLS_LLVMPDBDUMP_TYPEREFERENCETRACKER_H