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