1317017Sdim//===--- DWARFVisitor.h -----------------------------------------*- C++ -*-===// 2317017Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6317017Sdim// 7317017Sdim//===----------------------------------------------------------------------===// 8317017Sdim// 9317017Sdim//===----------------------------------------------------------------------===// 10317017Sdim 11317017Sdim#ifndef LLVM_OBJECTYAML_DWARFVISITOR_H 12317017Sdim#define LLVM_OBJECTYAML_DWARFVISITOR_H 13317017Sdim 14317017Sdim#include "llvm/ADT/StringRef.h" 15319799Sdim#include "llvm/BinaryFormat/Dwarf.h" 16317017Sdim#include "llvm/Support/MemoryBuffer.h" 17317017Sdim 18317017Sdimnamespace llvm { 19317017Sdim 20317017Sdimnamespace DWARFYAML { 21317017Sdim 22317017Sdimstruct Data; 23317017Sdimstruct Unit; 24317017Sdimstruct Entry; 25317017Sdimstruct FormValue; 26317017Sdimstruct AttributeAbbrev; 27317017Sdim 28341825Sdim/// A class to visits DWARFYAML Compile Units and DIEs in preorder. 29317017Sdim/// 30317017Sdim/// Extensions of this class can either maintain const or non-const references 31317017Sdim/// to the DWARFYAML::Data object. 32317017Sdimtemplate <typename T> class VisitorImpl { 33317017Sdimprotected: 34317017Sdim T &DebugInfo; 35317017Sdim 36317017Sdim /// Visitor Functions 37317017Sdim /// @{ 38317017Sdim virtual void onStartCompileUnit(Unit &CU) {} 39317017Sdim virtual void onEndCompileUnit(Unit &CU) {} 40317017Sdim virtual void onStartDIE(Unit &CU, Entry &DIE) {} 41317017Sdim virtual void onEndDIE(Unit &CU, Entry &DIE) {} 42317017Sdim virtual void onForm(AttributeAbbrev &AttAbbrev, FormValue &Value) {} 43317017Sdim /// @} 44317017Sdim 45317017Sdim /// Const Visitor Functions 46317017Sdim /// @{ 47317017Sdim virtual void onStartCompileUnit(const Unit &CU) {} 48317017Sdim virtual void onEndCompileUnit(const Unit &CU) {} 49317017Sdim virtual void onStartDIE(const Unit &CU, const Entry &DIE) {} 50317017Sdim virtual void onEndDIE(const Unit &CU, const Entry &DIE) {} 51317017Sdim virtual void onForm(const AttributeAbbrev &AttAbbrev, 52317017Sdim const FormValue &Value) {} 53317017Sdim /// @} 54317017Sdim 55317017Sdim /// Value visitors 56317017Sdim /// @{ 57317017Sdim virtual void onValue(const uint8_t U) {} 58317017Sdim virtual void onValue(const uint16_t U) {} 59317017Sdim virtual void onValue(const uint32_t U) {} 60317017Sdim virtual void onValue(const uint64_t U, const bool LEB = false) {} 61317017Sdim virtual void onValue(const int64_t S, const bool LEB = false) {} 62317017Sdim virtual void onValue(const StringRef String) {} 63317017Sdim virtual void onValue(const MemoryBufferRef MBR) {} 64317017Sdim /// @} 65317017Sdim 66317017Sdimpublic: 67317017Sdim VisitorImpl(T &DI) : DebugInfo(DI) {} 68317017Sdim 69317017Sdim virtual ~VisitorImpl() {} 70317017Sdim 71317017Sdim void traverseDebugInfo(); 72317017Sdim 73317017Sdimprivate: 74317017Sdim void onVariableSizeValue(uint64_t U, unsigned Size); 75317017Sdim}; 76317017Sdim 77317017Sdim// Making the visior instantiations extern and explicit in the cpp file. This 78317017Sdim// prevents them from being instantiated in every compile unit that uses the 79317017Sdim// visitors. 80317017Sdimextern template class VisitorImpl<DWARFYAML::Data>; 81317017Sdimextern template class VisitorImpl<const DWARFYAML::Data>; 82317017Sdim 83317017Sdimclass Visitor : public VisitorImpl<Data> { 84317017Sdimpublic: 85317017Sdim Visitor(Data &DI) : VisitorImpl<Data>(DI) {} 86317017Sdim}; 87317017Sdim 88317017Sdimclass ConstVisitor : public VisitorImpl<const Data> { 89317017Sdimpublic: 90317017Sdim ConstVisitor(const Data &DI) : VisitorImpl<const Data>(DI) {} 91317017Sdim}; 92317017Sdim 93317017Sdim} // namespace DWARFYAML 94317017Sdim} // namespace llvm 95317017Sdim 96317017Sdim#endif 97