1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===-- TypeDumper.h - CodeView type info dumper ----------------*- C++ -*-===//
2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details.
7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef LLVM_DEBUGINFO_CODEVIEW_TYPEDUMPER_H
11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_DEBUGINFO_CODEVIEW_TYPEDUMPER_H
12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/ArrayRef.h"
14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/StringSet.h"
15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/TypeIndex.h"
16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/TypeRecord.h"
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm {
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ScopedPrinter;
21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace codeview {
23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Dumper for CodeView type streams found in COFF object files and PDB files.
25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass CVTypeDumper : public TypeVisitorCallbacks {
26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTypeDumper(ScopedPrinter *W, bool PrintRecordBytes)
28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : W(W), PrintRecordBytes(PrintRecordBytes) {}
29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef getTypeName(TypeIndex TI);
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printTypeIndex(StringRef FieldName, TypeIndex TI);
32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Dumps one type record.  Returns false if there was a type parsing error,
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// and true otherwise.  This should be called in order, since the dumper
35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// maintains state about previous records which are necessary for cross
36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// type references.
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Error dump(const CVRecord<TypeLeafKind> &Record);
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Dumps the type records in Types. Returns false if there was a type stream
40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// parse error, and true otherwise.
41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Error dump(const CVTypeArray &Types);
42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Dumps the type records in Data. Returns false if there was a type stream
44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// parse error, and true otherwise. Use this method instead of the
45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// CVTypeArray overload when type records are laid out contiguously in
46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// memory.
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Error dump(ArrayRef<uint8_t> Data);
48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Gets the type index for the next type record.
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned getNextTypeIndex() const {
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return 0x1000 + CVUDTNames.size();
52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Records the name of a type, and reserves its type index.
55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void recordType(StringRef Name) { CVUDTNames.push_back(Name); }
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Saves the name in a StringSet and creates a stable StringRef.
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef saveName(StringRef TypeName) {
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return TypeNames.insert(TypeName).first->getKey();
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void setPrinter(ScopedPrinter *P);
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ScopedPrinter *getPrinter() { return W; }
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Action to take on unknown types. By default, they are ignored.
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Error visitUnknownType(const CVRecord<TypeLeafKind> &Record) override;
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Error visitUnknownMember(const CVRecord<TypeLeafKind> &Record) override;
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Paired begin/end actions for all types. Receives all record data,
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// including the fixed-length record prefix.
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Error visitTypeBegin(const CVRecord<TypeLeafKind> &Record) override;
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Error visitTypeEnd(const CVRecord<TypeLeafKind> &Record) override;
73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define TYPE_RECORD(EnumName, EnumVal, Name)                                   \
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Error visit##Name(Name##Record &Record) override;
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define MEMBER_RECORD(EnumName, EnumVal, Name)                                 \
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  TYPE_RECORD(EnumName, EnumVal, Name)
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "TypeRecords.def"
81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate:
83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printMemberAttributes(MemberAttributes Attrs);
84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printMemberAttributes(MemberAccess Access, MethodKind Kind,
85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                             MethodOptions Options);
86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ScopedPrinter *W;
88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool PrintRecordBytes = false;
90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Name of the current type. Only valid before visitTypeEnd.
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// All user defined type records in .debug$T live in here. Type indices
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// greater than 0x1000 are user defined. Subtract 0x1000 from the index to
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// index into this vector.
97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SmallVector<StringRef, 10> CVUDTNames;
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringSet<> TypeNames;
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // end namespace codeview
103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // end namespace llvm
104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif // LLVM_DEBUGINFO_CODEVIEW_TYPEDUMPER_H
106