blob: 81ef412eb7e69002d352db48775f3b5ca9741306 [file] [log] [blame]
Chris Bieneman8f471f72017-03-06 20:52:12 +00001//===--- DWARFVisitor.h -----------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//===----------------------------------------------------------------------===//
11
12#ifndef LLVM_OBJECTYAML_DWARFVISITOR_H
13#define LLVM_OBJECTYAML_DWARFVISITOR_H
14
15#include "llvm/ADT/StringRef.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000016#include "llvm/BinaryFormat/Dwarf.h"
Chris Bieneman8f471f72017-03-06 20:52:12 +000017#include "llvm/Support/MemoryBuffer.h"
18
19namespace llvm {
20
21namespace DWARFYAML {
22
23struct Data;
24struct Unit;
25struct Entry;
26struct FormValue;
27struct AttributeAbbrev;
28
29/// \brief 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 void 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