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