|  | //===--- DWARFVisitor.h -----------------------------------------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #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 |