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/StringRef.h" 13 #include "llvm/DebugInfo/CodeView/CVRecord.h" 14 #include "llvm/DebugInfo/CodeView/CodeView.h" 15 #include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h" 16 17 namespace llvm { 18 class ScopedPrinter; 19 20 namespace codeview { 21 class TypeIndex; 22 struct CVMemberRecord; 23 struct MemberAttributes; 24 25 class TypeCollection; 26 27 /// Dumper for CodeView type streams found in COFF object files and PDB files. 28 class TypeDumpVisitor : public TypeVisitorCallbacks { 29 public: TypeDumpVisitor(TypeCollection & TpiTypes,ScopedPrinter * W,bool PrintRecordBytes)30 TypeDumpVisitor(TypeCollection &TpiTypes, ScopedPrinter *W, 31 bool PrintRecordBytes) 32 : W(W), PrintRecordBytes(PrintRecordBytes), TpiTypes(TpiTypes) {} 33 34 /// When dumping types from an IPI stream in a PDB, a type index may refer to 35 /// a type or an item ID. The dumper will lookup the "name" of the index in 36 /// the item database if appropriate. If ItemDB is null, it will use TypeDB, 37 /// which is correct when dumping types from an object file (/Z7). setIpiTypes(TypeCollection & Types)38 void setIpiTypes(TypeCollection &Types) { IpiTypes = &Types; } 39 40 void printTypeIndex(StringRef FieldName, TypeIndex TI) const; 41 42 void printItemIndex(StringRef FieldName, TypeIndex TI) const; 43 44 /// Action to take on unknown types. By default, they are ignored. 45 Error visitUnknownType(CVType &Record) override; 46 Error visitUnknownMember(CVMemberRecord &Record) override; 47 48 /// Paired begin/end actions for all types. Receives all record data, 49 /// including the fixed-length record prefix. 50 Error visitTypeBegin(CVType &Record) override; 51 Error visitTypeBegin(CVType &Record, TypeIndex Index) override; 52 Error visitTypeEnd(CVType &Record) override; 53 Error visitMemberBegin(CVMemberRecord &Record) override; 54 Error visitMemberEnd(CVMemberRecord &Record) override; 55 56 #define TYPE_RECORD(EnumName, EnumVal, Name) \ 57 Error visitKnownRecord(CVType &CVR, Name##Record &Record) override; 58 #define MEMBER_RECORD(EnumName, EnumVal, Name) \ 59 Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override; 60 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) 61 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) 62 #include "llvm/DebugInfo/CodeView/CodeViewTypes.def" 63 64 private: 65 void printMemberAttributes(MemberAttributes Attrs); 66 void printMemberAttributes(MemberAccess Access, MethodKind Kind, 67 MethodOptions Options); 68 69 /// Get the database of indices for the stream that we are dumping. If ItemDB 70 /// is set, then we must be dumping an item (IPI) stream. This will also 71 /// always get the appropriate DB for printing item names. getSourceTypes()72 TypeCollection &getSourceTypes() const { 73 return IpiTypes ? *IpiTypes : TpiTypes; 74 } 75 76 ScopedPrinter *W; 77 78 bool PrintRecordBytes = false; 79 80 TypeCollection &TpiTypes; 81 TypeCollection *IpiTypes = nullptr; 82 }; 83 84 } // end namespace codeview 85 } // end namespace llvm 86 87 #endif 88