1 //===- DebugSubsectionVisitor.cpp -------------------------------*- 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 #include "llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h" 10 11 #include "llvm/DebugInfo/CodeView/CodeView.h" 12 #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" 13 #include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h" 14 #include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h" 15 #include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h" 16 #include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h" 17 #include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h" 18 #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h" 19 #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" 20 #include "llvm/DebugInfo/CodeView/DebugSymbolRVASubsection.h" 21 #include "llvm/DebugInfo/CodeView/DebugSymbolsSubsection.h" 22 #include "llvm/DebugInfo/CodeView/DebugUnknownSubsection.h" 23 #include "llvm/Support/BinaryStreamReader.h" 24 #include "llvm/Support/SwapByteOrder.h" 25 26 using namespace llvm; 27 using namespace llvm::codeview; 28 29 Error llvm::codeview::visitDebugSubsection( 30 const DebugSubsectionRecord &R, DebugSubsectionVisitor &V, 31 const StringsAndChecksumsRef &State) { 32 BinaryStreamReader Reader(R.getRecordData()); 33 switch (R.kind()) { 34 case DebugSubsectionKind::Lines: { 35 DebugLinesSubsectionRef Fragment; 36 if (auto EC = Fragment.initialize(Reader)) 37 return EC; 38 39 return V.visitLines(Fragment, State); 40 } 41 case DebugSubsectionKind::FileChecksums: { 42 DebugChecksumsSubsectionRef Fragment; 43 if (auto EC = Fragment.initialize(Reader)) 44 return EC; 45 46 return V.visitFileChecksums(Fragment, State); 47 } 48 case DebugSubsectionKind::InlineeLines: { 49 DebugInlineeLinesSubsectionRef Fragment; 50 if (auto EC = Fragment.initialize(Reader)) 51 return EC; 52 return V.visitInlineeLines(Fragment, State); 53 } 54 case DebugSubsectionKind::CrossScopeExports: { 55 DebugCrossModuleExportsSubsectionRef Section; 56 if (auto EC = Section.initialize(Reader)) 57 return EC; 58 return V.visitCrossModuleExports(Section, State); 59 } 60 case DebugSubsectionKind::CrossScopeImports: { 61 DebugCrossModuleImportsSubsectionRef Section; 62 if (auto EC = Section.initialize(Reader)) 63 return EC; 64 return V.visitCrossModuleImports(Section, State); 65 } 66 case DebugSubsectionKind::Symbols: { 67 DebugSymbolsSubsectionRef Section; 68 if (auto EC = Section.initialize(Reader)) 69 return EC; 70 return V.visitSymbols(Section, State); 71 } 72 case DebugSubsectionKind::StringTable: { 73 DebugStringTableSubsectionRef Section; 74 if (auto EC = Section.initialize(Reader)) 75 return EC; 76 return V.visitStringTable(Section, State); 77 } 78 case DebugSubsectionKind::FrameData: { 79 DebugFrameDataSubsectionRef Section; 80 if (auto EC = Section.initialize(Reader)) 81 return EC; 82 return V.visitFrameData(Section, State); 83 } 84 case DebugSubsectionKind::CoffSymbolRVA: { 85 DebugSymbolRVASubsectionRef Section; 86 if (auto EC = Section.initialize(Reader)) 87 return EC; 88 return V.visitCOFFSymbolRVAs(Section, State); 89 } 90 default: { 91 DebugUnknownSubsectionRef Fragment(R.kind(), R.getRecordData()); 92 return V.visitUnknown(Fragment); 93 } 94 } 95 } 96