1317017Sdim//===--- DWARFVisitor.h -----------------------------------------*- C++ -*-===//
2317017Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6317017Sdim//
7317017Sdim//===----------------------------------------------------------------------===//
8317017Sdim//
9317017Sdim//===----------------------------------------------------------------------===//
10317017Sdim
11317017Sdim#ifndef LLVM_OBJECTYAML_DWARFVISITOR_H
12317017Sdim#define LLVM_OBJECTYAML_DWARFVISITOR_H
13317017Sdim
14317017Sdim#include "llvm/ADT/StringRef.h"
15319799Sdim#include "llvm/BinaryFormat/Dwarf.h"
16317017Sdim#include "llvm/Support/MemoryBuffer.h"
17317017Sdim
18317017Sdimnamespace llvm {
19317017Sdim
20317017Sdimnamespace DWARFYAML {
21317017Sdim
22317017Sdimstruct Data;
23317017Sdimstruct Unit;
24317017Sdimstruct Entry;
25317017Sdimstruct FormValue;
26317017Sdimstruct AttributeAbbrev;
27317017Sdim
28341825Sdim/// A class to visits DWARFYAML Compile Units and DIEs in preorder.
29317017Sdim///
30317017Sdim/// Extensions of this class can either maintain const or non-const references
31317017Sdim/// to the DWARFYAML::Data object.
32317017Sdimtemplate <typename T> class VisitorImpl {
33317017Sdimprotected:
34317017Sdim  T &DebugInfo;
35317017Sdim
36317017Sdim  /// Visitor Functions
37317017Sdim  /// @{
38317017Sdim  virtual void onStartCompileUnit(Unit &CU) {}
39317017Sdim  virtual void onEndCompileUnit(Unit &CU) {}
40317017Sdim  virtual void onStartDIE(Unit &CU, Entry &DIE) {}
41317017Sdim  virtual void onEndDIE(Unit &CU, Entry &DIE) {}
42317017Sdim  virtual void onForm(AttributeAbbrev &AttAbbrev, FormValue &Value) {}
43317017Sdim  /// @}
44317017Sdim
45317017Sdim  /// Const Visitor Functions
46317017Sdim  /// @{
47317017Sdim  virtual void onStartCompileUnit(const Unit &CU) {}
48317017Sdim  virtual void onEndCompileUnit(const Unit &CU) {}
49317017Sdim  virtual void onStartDIE(const Unit &CU, const Entry &DIE) {}
50317017Sdim  virtual void onEndDIE(const Unit &CU, const Entry &DIE) {}
51317017Sdim  virtual void onForm(const AttributeAbbrev &AttAbbrev,
52317017Sdim                      const FormValue &Value) {}
53317017Sdim  /// @}
54317017Sdim
55317017Sdim  /// Value visitors
56317017Sdim  /// @{
57317017Sdim  virtual void onValue(const uint8_t U) {}
58317017Sdim  virtual void onValue(const uint16_t U) {}
59317017Sdim  virtual void onValue(const uint32_t U) {}
60317017Sdim  virtual void onValue(const uint64_t U, const bool LEB = false) {}
61317017Sdim  virtual void onValue(const int64_t S, const bool LEB = false) {}
62317017Sdim  virtual void onValue(const StringRef String) {}
63317017Sdim  virtual void onValue(const MemoryBufferRef MBR) {}
64317017Sdim  /// @}
65317017Sdim
66317017Sdimpublic:
67317017Sdim  VisitorImpl(T &DI) : DebugInfo(DI) {}
68317017Sdim
69317017Sdim  virtual ~VisitorImpl() {}
70317017Sdim
71317017Sdim  void traverseDebugInfo();
72317017Sdim
73317017Sdimprivate:
74317017Sdim  void onVariableSizeValue(uint64_t U, unsigned Size);
75317017Sdim};
76317017Sdim
77317017Sdim// Making the visior instantiations extern and explicit in the cpp file. This
78317017Sdim// prevents them from being instantiated in every compile unit that uses the
79317017Sdim// visitors.
80317017Sdimextern template class VisitorImpl<DWARFYAML::Data>;
81317017Sdimextern template class VisitorImpl<const DWARFYAML::Data>;
82317017Sdim
83317017Sdimclass Visitor : public VisitorImpl<Data> {
84317017Sdimpublic:
85317017Sdim  Visitor(Data &DI) : VisitorImpl<Data>(DI) {}
86317017Sdim};
87317017Sdim
88317017Sdimclass ConstVisitor : public VisitorImpl<const Data> {
89317017Sdimpublic:
90317017Sdim  ConstVisitor(const Data &DI) : VisitorImpl<const Data>(DI) {}
91317017Sdim};
92317017Sdim
93317017Sdim} // namespace DWARFYAML
94317017Sdim} // namespace llvm
95317017Sdim
96317017Sdim#endif
97