1283625Sdim//===- ClassDefinitionDumper.h - --------------------------------*- C++ -*-===//
2283625Sdim//
3283625Sdim//                     The LLVM Compiler Infrastructure
4283625Sdim//
5283625Sdim// This file is distributed under the University of Illinois Open Source
6283625Sdim// License. See LICENSE.TXT for details.
7283625Sdim//
8283625Sdim//===----------------------------------------------------------------------===//
9283625Sdim
10283625Sdim#ifndef LLVM_TOOLS_LLVMPDBDUMP_CLASSDEFINITIONDUMPER_H
11283625Sdim#define LLVM_TOOLS_LLVMPDBDUMP_CLASSDEFINITIONDUMPER_H
12283625Sdim
13283625Sdim#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
14283625Sdim#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
15283625Sdim#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
16283625Sdim
17283625Sdim#include <list>
18283625Sdim#include <memory>
19283625Sdim#include <unordered_map>
20283625Sdim
21283625Sdimnamespace llvm {
22283625Sdim
23283625Sdimclass LinePrinter;
24283625Sdim
25283625Sdimclass ClassDefinitionDumper : public PDBSymDumper {
26283625Sdimpublic:
27283625Sdim  ClassDefinitionDumper(LinePrinter &P);
28283625Sdim
29283625Sdim  void start(const PDBSymbolTypeUDT &Exe);
30283625Sdim
31283625Sdim  void dump(const PDBSymbolTypeBaseClass &Symbol) override;
32283625Sdim  void dump(const PDBSymbolData &Symbol) override;
33283625Sdim  void dump(const PDBSymbolTypeEnum &Symbol) override;
34283625Sdim  void dump(const PDBSymbolFunc &Symbol) override;
35283625Sdim  void dump(const PDBSymbolTypeTypedef &Symbol) override;
36283625Sdim  void dump(const PDBSymbolTypeUDT &Symbol) override;
37283625Sdim  void dump(const PDBSymbolTypeVTable &Symbol) override;
38283625Sdim
39283625Sdimprivate:
40283625Sdim  LinePrinter &Printer;
41283625Sdim
42283625Sdim  struct SymbolGroup {
43283625Sdim    SymbolGroup() {}
44283625Sdim    SymbolGroup(SymbolGroup &&Other) {
45283625Sdim      Functions = std::move(Other.Functions);
46283625Sdim      Data = std::move(Other.Data);
47283625Sdim      Unknown = std::move(Other.Unknown);
48283625Sdim    }
49283625Sdim
50283625Sdim    std::list<std::unique_ptr<PDBSymbolFunc>> Functions;
51283625Sdim    std::list<std::unique_ptr<PDBSymbolData>> Data;
52283625Sdim    std::list<std::unique_ptr<PDBSymbol>> Unknown;
53283625Sdim    SymbolGroup(const SymbolGroup &other) = delete;
54283625Sdim    SymbolGroup &operator=(const SymbolGroup &other) = delete;
55283625Sdim  };
56283625Sdim  typedef std::unordered_map<int, SymbolGroup> SymbolGroupByAccess;
57283625Sdim
58283625Sdim  int dumpAccessGroup(PDB_MemberAccess Access, const SymbolGroup &Group);
59283625Sdim};
60283625Sdim}
61283625Sdim
62283625Sdim#endif
63