| //===--- 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; | |
| /// 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 |