text: //===- MinimalSymbolDumper.h ---------------------------------- *- C++ --*-===//
  //
  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  // See https://llvm.org/LICENSE.txt for license information.
  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  //
  //===----------------------------------------------------------------------===//
  
  #ifndef LLVM_TOOLS_LLVMPDBUTIL_MINIMAL_SYMBOL_DUMPER_H
  #define LLVM_TOOLS_LLVMPDBUTIL_MINIMAL_SYMBOL_DUMPER_H
  
  #include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
  
  namespace llvm {
  namespace codeview {
  class LazyRandomTypeCollection;
  }
  
  namespace pdb {
  class LinePrinter;
  class SymbolGroup;
  
  class MinimalSymbolDumper : public codeview::SymbolVisitorCallbacks {
  public:
    MinimalSymbolDumper(LinePrinter &P, bool RecordBytes,
                        codeview::LazyRandomTypeCollection &Ids,
                        codeview::LazyRandomTypeCollection &Types)
        : P(P), RecordBytes(RecordBytes), Ids(Ids), Types(Types) {}
    MinimalSymbolDumper(LinePrinter &P, bool RecordBytes,
                        const SymbolGroup &SymGroup,
                        codeview::LazyRandomTypeCollection &Ids,
                        codeview::LazyRandomTypeCollection &Types)
        : P(P), RecordBytes(RecordBytes), SymGroup(&SymGroup), Ids(Ids),
          Types(Types) {}
  
    Error visitSymbolBegin(codeview::CVSymbol &Record) override;
    Error visitSymbolBegin(codeview::CVSymbol &Record, uint32_t Offset) override;
    Error visitSymbolEnd(codeview::CVSymbol &Record) override;
  
    void setSymbolGroup(const SymbolGroup *Group) { SymGroup = Group; }
  
  #define SYMBOL_RECORD(EnumName, EnumVal, Name)                                 \
    virtual Error visitKnownRecord(codeview::CVSymbol &CVR,                      \
                                   codeview::Name &Record) override;
  #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
  #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
  
  private:
    std::string typeOrIdIndex(codeview::TypeIndex TI, bool IsType) const;
  
    std::string typeIndex(codeview::TypeIndex TI) const;
    std::string idIndex(codeview::TypeIndex TI) const;
  
    LinePrinter &P;
  
    /// Dumping certain records requires knowing what machine this is. The
    /// S_COMPILE3 record will tell us, but if we don't see one, default to X64.
    codeview::CPUType CompilationCPU = codeview::CPUType::X64;
  
    bool RecordBytes;
    const SymbolGroup *SymGroup = nullptr;
    codeview::LazyRandomTypeCollection &Ids;
    codeview::LazyRandomTypeCollection &Types;
  };
  } // namespace pdb
  } // namespace llvm
  
  #endif
  