Coverage Report

Created: 2018-07-19 03:59

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