Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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:
  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).
  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.
  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.