File indexing completed on 2026-05-10 08:43:39
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_DEBUGINFO_CODEVIEW_DEBUGSUBSECTIONVISITOR_H
0010 #define LLVM_DEBUGINFO_CODEVIEW_DEBUGSUBSECTIONVISITOR_H
0011
0012 #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
0013 #include "llvm/Support/Error.h"
0014
0015 namespace llvm {
0016
0017 namespace codeview {
0018
0019 class DebugChecksumsSubsectionRef;
0020 class DebugSubsectionRecord;
0021 class DebugInlineeLinesSubsectionRef;
0022 class DebugCrossModuleExportsSubsectionRef;
0023 class DebugCrossModuleImportsSubsectionRef;
0024 class DebugFrameDataSubsectionRef;
0025 class DebugLinesSubsectionRef;
0026 class DebugStringTableSubsectionRef;
0027 class DebugSymbolRVASubsectionRef;
0028 class DebugSymbolsSubsectionRef;
0029 class DebugUnknownSubsectionRef;
0030
0031 class DebugSubsectionVisitor {
0032 public:
0033 virtual ~DebugSubsectionVisitor() = default;
0034
0035 virtual Error visitUnknown(DebugUnknownSubsectionRef &Unknown) {
0036 return Error::success();
0037 }
0038 virtual Error visitLines(DebugLinesSubsectionRef &Lines,
0039 const StringsAndChecksumsRef &State) = 0;
0040 virtual Error visitFileChecksums(DebugChecksumsSubsectionRef &Checksums,
0041 const StringsAndChecksumsRef &State) = 0;
0042 virtual Error visitInlineeLines(DebugInlineeLinesSubsectionRef &Inlinees,
0043 const StringsAndChecksumsRef &State) = 0;
0044 virtual Error
0045 visitCrossModuleExports(DebugCrossModuleExportsSubsectionRef &CSE,
0046 const StringsAndChecksumsRef &State) = 0;
0047 virtual Error
0048 visitCrossModuleImports(DebugCrossModuleImportsSubsectionRef &CSE,
0049 const StringsAndChecksumsRef &State) = 0;
0050
0051 virtual Error visitStringTable(DebugStringTableSubsectionRef &ST,
0052 const StringsAndChecksumsRef &State) = 0;
0053
0054 virtual Error visitSymbols(DebugSymbolsSubsectionRef &CSE,
0055 const StringsAndChecksumsRef &State) = 0;
0056
0057 virtual Error visitFrameData(DebugFrameDataSubsectionRef &FD,
0058 const StringsAndChecksumsRef &State) = 0;
0059 virtual Error visitCOFFSymbolRVAs(DebugSymbolRVASubsectionRef &RVAs,
0060 const StringsAndChecksumsRef &State) = 0;
0061 };
0062
0063 Error visitDebugSubsection(const DebugSubsectionRecord &R,
0064 DebugSubsectionVisitor &V,
0065 const StringsAndChecksumsRef &State);
0066
0067 namespace detail {
0068 template <typename T>
0069 Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V,
0070 StringsAndChecksumsRef &State) {
0071 State.initialize(std::forward<T>(FragmentRange));
0072
0073 for (const DebugSubsectionRecord &L : FragmentRange) {
0074 if (auto EC = visitDebugSubsection(L, V, State))
0075 return EC;
0076 }
0077 return Error::success();
0078 }
0079 }
0080
0081 template <typename T>
0082 Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V) {
0083 StringsAndChecksumsRef State;
0084 return detail::visitDebugSubsections(std::forward<T>(FragmentRange), V,
0085 State);
0086 }
0087
0088 template <typename T>
0089 Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V,
0090 const DebugStringTableSubsectionRef &Strings) {
0091 StringsAndChecksumsRef State(Strings);
0092 return detail::visitDebugSubsections(std::forward<T>(FragmentRange), V,
0093 State);
0094 }
0095
0096 template <typename T>
0097 Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V,
0098 const DebugStringTableSubsectionRef &Strings,
0099 const DebugChecksumsSubsectionRef &Checksums) {
0100 StringsAndChecksumsRef State(Strings, Checksums);
0101 return detail::visitDebugSubsections(std::forward<T>(FragmentRange), V,
0102 State);
0103 }
0104
0105 }
0106
0107 }
0108
0109 #endif