Coverage Report

Created: 2019-02-20 07:29

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/DebugInfo/CodeView/TypeDumpVisitor.h
Line
Count
Source
1
//===-- TypeDumpVisitor.h - CodeView type info dumper -----------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#ifndef LLVM_DEBUGINFO_CODEVIEW_TYPEDUMPVISITOR_H
10
#define LLVM_DEBUGINFO_CODEVIEW_TYPEDUMPVISITOR_H
11
12
#include "llvm/ADT/ArrayRef.h"
13
#include "llvm/ADT/StringSet.h"
14
#include "llvm/DebugInfo/CodeView/TypeIndex.h"
15
#include "llvm/DebugInfo/CodeView/TypeRecord.h"
16
#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
17
18
namespace llvm {
19
class ScopedPrinter;
20
21
namespace codeview {
22
23
class TypeCollection;
24
25
/// Dumper for CodeView type streams found in COFF object files and PDB files.
26
class TypeDumpVisitor : public TypeVisitorCallbacks {
27
public:
28
  TypeDumpVisitor(TypeCollection &TpiTypes, ScopedPrinter *W,
29
                  bool PrintRecordBytes)
30
693
      : W(W), PrintRecordBytes(PrintRecordBytes), TpiTypes(TpiTypes) {}
31
32
  /// When dumping types from an IPI stream in a PDB, a type index may refer to
33
  /// a type or an item ID. The dumper will lookup the "name" of the index in
34
  /// the item database if appropriate. If ItemDB is null, it will use TypeDB,
35
  /// which is correct when dumping types from an object file (/Z7).
36
  void setIpiTypes(TypeCollection &Types) { IpiTypes = &Types; }
37
38
  void printTypeIndex(StringRef FieldName, TypeIndex TI) const;
39
40
  void printItemIndex(StringRef FieldName, TypeIndex TI) const;
41
42
  /// Action to take on unknown types. By default, they are ignored.
43
  Error visitUnknownType(CVType &Record) override;
44
  Error visitUnknownMember(CVMemberRecord &Record) override;
45
46
  /// Paired begin/end actions for all types. Receives all record data,
47
  /// including the fixed-length record prefix.
48
  Error visitTypeBegin(CVType &Record) override;
49
  Error visitTypeBegin(CVType &Record, TypeIndex Index) override;
50
  Error visitTypeEnd(CVType &Record) override;
51
  Error visitMemberBegin(CVMemberRecord &Record) override;
52
  Error visitMemberEnd(CVMemberRecord &Record) override;
53
54
#define TYPE_RECORD(EnumName, EnumVal, Name)                                   \
55
  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override;
56
#define MEMBER_RECORD(EnumName, EnumVal, Name)                                 \
57
  Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override;
58
#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
59
#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
60
#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
61
62
private:
63
  void printMemberAttributes(MemberAttributes Attrs);
64
  void printMemberAttributes(MemberAccess Access, MethodKind Kind,
65
                             MethodOptions Options);
66
67
  /// Get the database of indices for the stream that we are dumping. If ItemDB
68
  /// is set, then we must be dumping an item (IPI) stream. This will also
69
  /// always get the appropriate DB for printing item names.
70
2.01k
  TypeCollection &getSourceTypes() const {
71
2.01k
    return IpiTypes ? 
*IpiTypes77
:
TpiTypes1.93k
;
72
2.01k
  }
73
74
  ScopedPrinter *W;
75
76
  bool PrintRecordBytes = false;
77
78
  TypeCollection &TpiTypes;
79
  TypeCollection *IpiTypes = nullptr;
80
};
81
82
} // end namespace codeview
83
} // end namespace llvm
84
85
#endif