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 
visitDebugSubsection(const DebugSubsectionRecord & R,DebugSubsectionVisitor & V,const StringsAndChecksumsRef & State)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