1 //===- DebugSubsectionVisitor.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 #ifndef LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGFRAGMENTVISITOR_H
11 #define LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGFRAGMENTVISITOR_H
12
13 #include "llvm/DebugInfo/CodeView/CodeView.h"
14 #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
15 #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
16 #include "llvm/Support/Error.h"
17 #include <cstdint>
18
19 namespace llvm {
20
21 namespace codeview {
22
23 class DebugChecksumsSubsectionRef;
24 class DebugSubsectionRecord;
25 class DebugInlineeLinesSubsectionRef;
26 class DebugCrossModuleExportsSubsectionRef;
27 class DebugCrossModuleImportsSubsectionRef;
28 class DebugFrameDataSubsectionRef;
29 class DebugLinesSubsectionRef;
30 class DebugStringTableSubsectionRef;
31 class DebugSymbolRVASubsectionRef;
32 class DebugSymbolsSubsectionRef;
33 class DebugUnknownSubsectionRef;
34 class StringsAndChecksumsRef;
35
36 class DebugSubsectionVisitor {
37 public:
38 virtual ~DebugSubsectionVisitor() = default;
39
visitUnknown(DebugUnknownSubsectionRef & Unknown)40 virtual Error visitUnknown(DebugUnknownSubsectionRef &Unknown) {
41 return Error::success();
42 }
43 virtual Error visitLines(DebugLinesSubsectionRef &Lines,
44 const StringsAndChecksumsRef &State) = 0;
45 virtual Error visitFileChecksums(DebugChecksumsSubsectionRef &Checksums,
46 const StringsAndChecksumsRef &State) = 0;
47 virtual Error visitInlineeLines(DebugInlineeLinesSubsectionRef &Inlinees,
48 const StringsAndChecksumsRef &State) = 0;
49 virtual Error
50 visitCrossModuleExports(DebugCrossModuleExportsSubsectionRef &CSE,
51 const StringsAndChecksumsRef &State) = 0;
52 virtual Error
53 visitCrossModuleImports(DebugCrossModuleImportsSubsectionRef &CSE,
54 const StringsAndChecksumsRef &State) = 0;
55
56 virtual Error visitStringTable(DebugStringTableSubsectionRef &ST,
57 const StringsAndChecksumsRef &State) = 0;
58
59 virtual Error visitSymbols(DebugSymbolsSubsectionRef &CSE,
60 const StringsAndChecksumsRef &State) = 0;
61
62 virtual Error visitFrameData(DebugFrameDataSubsectionRef &FD,
63 const StringsAndChecksumsRef &State) = 0;
64 virtual Error visitCOFFSymbolRVAs(DebugSymbolRVASubsectionRef &RVAs,
65 const StringsAndChecksumsRef &State) = 0;
66 };
67
68 Error visitDebugSubsection(const DebugSubsectionRecord &R,
69 DebugSubsectionVisitor &V,
70 const StringsAndChecksumsRef &State);
71
72 namespace detail {
73 template <typename T>
visitDebugSubsections(T && FragmentRange,DebugSubsectionVisitor & V,StringsAndChecksumsRef & State)74 Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V,
75 StringsAndChecksumsRef &State) {
76 State.initialize(std::forward<T>(FragmentRange));
77
78 for (const DebugSubsectionRecord &L : FragmentRange) {
79 if (auto EC = visitDebugSubsection(L, V, State))
80 return EC;
81 }
82 return Error::success();
83 }
84 } // namespace detail
85
86 template <typename T>
visitDebugSubsections(T && FragmentRange,DebugSubsectionVisitor & V)87 Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V) {
88 StringsAndChecksumsRef State;
89 return detail::visitDebugSubsections(std::forward<T>(FragmentRange), V,
90 State);
91 }
92
93 template <typename T>
visitDebugSubsections(T && FragmentRange,DebugSubsectionVisitor & V,const DebugStringTableSubsectionRef & Strings)94 Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V,
95 const DebugStringTableSubsectionRef &Strings) {
96 StringsAndChecksumsRef State(Strings);
97 return detail::visitDebugSubsections(std::forward<T>(FragmentRange), V,
98 State);
99 }
100
101 template <typename T>
visitDebugSubsections(T && FragmentRange,DebugSubsectionVisitor & V,const DebugStringTableSubsectionRef & Strings,const DebugChecksumsSubsectionRef & Checksums)102 Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V,
103 const DebugStringTableSubsectionRef &Strings,
104 const DebugChecksumsSubsectionRef &Checksums) {
105 StringsAndChecksumsRef State(Strings, Checksums);
106 return detail::visitDebugSubsections(std::forward<T>(FragmentRange), V,
107 State);
108 }
109
110 } // end namespace codeview
111
112 } // end namespace llvm
113
114 #endif // LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGFRAGMENTVISITOR_H
115