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