1//===--- DWARFVisitor.h -----------------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9//===----------------------------------------------------------------------===// 10 11#ifndef LLVM_OBJECTYAML_DWARFVISITOR_H 12#define LLVM_OBJECTYAML_DWARFVISITOR_H 13 14#include "llvm/ADT/StringRef.h" 15#include "llvm/BinaryFormat/Dwarf.h" 16#include "llvm/Support/MemoryBuffer.h" 17 18namespace llvm { 19class Error; 20 21namespace DWARFYAML { 22 23struct Data; 24struct Unit; 25struct Entry; 26struct FormValue; 27struct AttributeAbbrev; 28 29/// A class to visits DWARFYAML Compile Units and DIEs in preorder. 30/// 31/// Extensions of this class can either maintain const or non-const references 32/// to the DWARFYAML::Data object. 33template <typename T> class VisitorImpl { 34protected: 35 T &DebugInfo; 36 37 /// Visitor Functions 38 /// @{ 39 virtual void onStartCompileUnit(Unit &CU) {} 40 virtual void onEndCompileUnit(Unit &CU) {} 41 virtual void onStartDIE(Unit &CU, Entry &DIE) {} 42 virtual void onEndDIE(Unit &CU, Entry &DIE) {} 43 virtual void onForm(AttributeAbbrev &AttAbbrev, FormValue &Value) {} 44 /// @} 45 46 /// Const Visitor Functions 47 /// @{ 48 virtual void onStartCompileUnit(const Unit &CU) {} 49 virtual void onEndCompileUnit(const Unit &CU) {} 50 virtual void onStartDIE(const Unit &CU, const Entry &DIE) {} 51 virtual void onEndDIE(const Unit &CU, const Entry &DIE) {} 52 virtual void onForm(const AttributeAbbrev &AttAbbrev, 53 const FormValue &Value) {} 54 /// @} 55 56 /// Value visitors 57 /// @{ 58 virtual void onValue(const uint8_t U) {} 59 virtual void onValue(const uint16_t U) {} 60 virtual void onValue(const uint32_t U) {} 61 virtual void onValue(const uint64_t U, const bool LEB = false) {} 62 virtual void onValue(const int64_t S, const bool LEB = false) {} 63 virtual void onValue(const StringRef String) {} 64 virtual void onValue(const MemoryBufferRef MBR) {} 65 /// @} 66 67public: 68 VisitorImpl(T &DI) : DebugInfo(DI) {} 69 70 virtual ~VisitorImpl() {} 71 72 Error traverseDebugInfo(); 73 74private: 75 void onVariableSizeValue(uint64_t U, unsigned Size); 76}; 77 78// Making the visior instantiations extern and explicit in the cpp file. This 79// prevents them from being instantiated in every compile unit that uses the 80// visitors. 81extern template class VisitorImpl<DWARFYAML::Data>; 82extern template class VisitorImpl<const DWARFYAML::Data>; 83 84class Visitor : public VisitorImpl<Data> { 85public: 86 Visitor(Data &DI) : VisitorImpl<Data>(DI) {} 87}; 88 89class ConstVisitor : public VisitorImpl<const Data> { 90public: 91 ConstVisitor(const Data &DI) : VisitorImpl<const Data>(DI) {} 92}; 93 94} // namespace DWARFYAML 95} // namespace llvm 96 97#endif 98