98 lines
2.8 KiB
C
98 lines
2.8 KiB
C
|
//===--- 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/Support/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
|