| //===- DebugSubsectionVisitor.cpp -------------------------------*- C++ -*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h" | |
| #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" | |
| #include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h" | |
| #include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h" | |
| #include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h" | |
| #include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h" | |
| #include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h" | |
| #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h" | |
| #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" | |
| #include "llvm/DebugInfo/CodeView/DebugSymbolRVASubsection.h" | |
| #include "llvm/DebugInfo/CodeView/DebugSymbolsSubsection.h" | |
| #include "llvm/DebugInfo/CodeView/DebugUnknownSubsection.h" | |
| #include "llvm/Support/BinaryStreamReader.h" | |
| #include "llvm/Support/BinaryStreamRef.h" | |
| using namespace llvm; | |
| using namespace llvm::codeview; | |
| Error llvm::codeview::visitDebugSubsection( | |
| const DebugSubsectionRecord &R, DebugSubsectionVisitor &V, | |
| const StringsAndChecksumsRef &State) { | |
| BinaryStreamReader Reader(R.getRecordData()); | |
| switch (R.kind()) { | |
| case DebugSubsectionKind::Lines: { | |
| DebugLinesSubsectionRef Fragment; | |
| if (auto EC = Fragment.initialize(Reader)) | |
| return EC; | |
| return V.visitLines(Fragment, State); | |
| } | |
| case DebugSubsectionKind::FileChecksums: { | |
| DebugChecksumsSubsectionRef Fragment; | |
| if (auto EC = Fragment.initialize(Reader)) | |
| return EC; | |
| return V.visitFileChecksums(Fragment, State); | |
| } | |
| case DebugSubsectionKind::InlineeLines: { | |
| DebugInlineeLinesSubsectionRef Fragment; | |
| if (auto EC = Fragment.initialize(Reader)) | |
| return EC; | |
| return V.visitInlineeLines(Fragment, State); | |
| } | |
| case DebugSubsectionKind::CrossScopeExports: { | |
| DebugCrossModuleExportsSubsectionRef Section; | |
| if (auto EC = Section.initialize(Reader)) | |
| return EC; | |
| return V.visitCrossModuleExports(Section, State); | |
| } | |
| case DebugSubsectionKind::CrossScopeImports: { | |
| DebugCrossModuleImportsSubsectionRef Section; | |
| if (auto EC = Section.initialize(Reader)) | |
| return EC; | |
| return V.visitCrossModuleImports(Section, State); | |
| } | |
| case DebugSubsectionKind::Symbols: { | |
| DebugSymbolsSubsectionRef Section; | |
| if (auto EC = Section.initialize(Reader)) | |
| return EC; | |
| return V.visitSymbols(Section, State); | |
| } | |
| case DebugSubsectionKind::StringTable: { | |
| DebugStringTableSubsectionRef Section; | |
| if (auto EC = Section.initialize(Reader)) | |
| return EC; | |
| return V.visitStringTable(Section, State); | |
| } | |
| case DebugSubsectionKind::FrameData: { | |
| DebugFrameDataSubsectionRef Section; | |
| if (auto EC = Section.initialize(Reader)) | |
| return EC; | |
| return V.visitFrameData(Section, State); | |
| } | |
| case DebugSubsectionKind::CoffSymbolRVA: { | |
| DebugSymbolRVASubsectionRef Section; | |
| if (auto EC = Section.initialize(Reader)) | |
| return EC; | |
| return V.visitCOFFSymbolRVAs(Section, State); | |
| } | |
| default: { | |
| DebugUnknownSubsectionRef Fragment(R.kind(), R.getRecordData()); | |
| return V.visitUnknown(Fragment); | |
| } | |
| } | |
| } |