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 : 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 TypeCollection &getSourceTypes() const { 71 return IpiTypes ? *IpiTypes : TpiTypes; 72 } 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 86