#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;
template <typename T> class VisitorImpl {
protected:
T &DebugInfo;
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) {}
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) {}
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);
};
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) {}
};
} }
#endif