//===--- DWARFVisitor.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_OBJECTYAML_DWARFVISITOR_H
#define LLVM_OBJECTYAML_DWARFVISITOR_H

#include "llvm/ADT/StringRef.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/Support/MemoryBuffer.h"

namespace llvm {
class Error;

namespace DWARFYAML {

struct Data;
struct Unit;
struct Entry;
struct FormValue;
struct AttributeAbbrev;

/// A class to visits DWARFYAML Compile Units and DIEs in preorder.
///
/// Extensions of this class can either maintain const or non-const references
/// to the DWARFYAML::Data object.
template <typename T> class VisitorImpl {
protected:
  T &DebugInfo;

  /// Visitor Functions
  /// @{
  virtual void onStartCompileUnit(Unit &CU) {}
  virtual void onEndCompileUnit(Unit &CU) {}
  virtual void onStartDIE(Unit &CU, Entry &DIE) {}
  virtual void onEndDIE(Unit &CU, Entry &DIE) {}
  virtual void onForm(AttributeAbbrev &AttAbbrev, FormValue &Value) {}
  /// @}

  /// Const Visitor Functions
  /// @{
  virtual void onStartCompileUnit(const Unit &CU) {}
  virtual void onEndCompileUnit(const Unit &CU) {}
  virtual void onStartDIE(const Unit &CU, const Entry &DIE) {}
  virtual void onEndDIE(const Unit &CU, const Entry &DIE) {}
  virtual void onForm(const AttributeAbbrev &AttAbbrev,
                      const FormValue &Value) {}
  /// @}

  /// Value visitors
  /// @{
  virtual void onValue(const uint8_t U) {}
  virtual void onValue(const uint16_t U) {}
  virtual void onValue(const uint32_t U) {}
  virtual void onValue(const uint64_t U, const bool LEB = false) {}
  virtual void onValue(const int64_t S, const bool LEB = false) {}
  virtual void onValue(const StringRef String) {}
  virtual void onValue(const MemoryBufferRef MBR) {}
  /// @}

public:
  VisitorImpl(T &DI) : DebugInfo(DI) {}

  virtual ~VisitorImpl() {}

  Error traverseDebugInfo();

private:
  void onVariableSizeValue(uint64_t U, unsigned Size);
};

// Making the visior instantiations extern and explicit in the cpp file. This
// prevents them from being instantiated in every compile unit that uses the
// visitors.
extern template class VisitorImpl<DWARFYAML::Data>;
extern template class VisitorImpl<const DWARFYAML::Data>;

class Visitor : public VisitorImpl<Data> {
public:
  Visitor(Data &DI) : VisitorImpl<Data>(DI) {}
};

class ConstVisitor : public VisitorImpl<const Data> {
public:
  ConstVisitor(const Data &DI) : VisitorImpl<const Data>(DI) {}
};

} // namespace DWARFYAML
} // namespace llvm

#endif
