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 19namespace llvm { 20 21namespace codeview { 22 23class DebugChecksumsSubsectionRef; 24class DebugSubsectionRecord; 25class DebugInlineeLinesSubsectionRef; 26class DebugCrossModuleExportsSubsectionRef; 27class DebugCrossModuleImportsSubsectionRef; 28class DebugFrameDataSubsectionRef; 29class DebugLinesSubsectionRef; 30class DebugStringTableSubsectionRef; 31class DebugSymbolRVASubsectionRef; 32class DebugSymbolsSubsectionRef; 33class DebugUnknownSubsectionRef; 34class StringsAndChecksumsRef; 35 36class DebugSubsectionVisitor { 37public: 38 virtual ~DebugSubsectionVisitor() = default; 39 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 68Error visitDebugSubsection(const DebugSubsectionRecord &R, 69 DebugSubsectionVisitor &V, 70 const StringsAndChecksumsRef &State); 71 72namespace detail { 73template <typename T> 74Error 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 86template <typename T> 87Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V) { 88 StringsAndChecksumsRef State; 89 return detail::visitDebugSubsections(std::forward<T>(FragmentRange), V, 90 State); 91} 92 93template <typename T> 94Error 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 101template <typename T> 102Error 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