Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:43:39

0001 //===- DebugSubsectionVisitor.h -----------------------------*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
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 } // namespace detail
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 } // end namespace codeview
0106 
0107 } // end namespace llvm
0108 
0109 #endif // LLVM_DEBUGINFO_CODEVIEW_DEBUGSUBSECTIONVISITOR_H