//===--- DWARFVisitor.h -----------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//===----------------------------------------------------------------------===//

#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 {

namespace DWARFYAML {

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

/// \brief 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() {}

  void 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
