95 lines · cpp
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-exception6//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 25using namespace llvm;26using namespace llvm::codeview;27 28Error llvm::codeview::visitDebugSubsection(29 const DebugSubsectionRecord &R, DebugSubsectionVisitor &V,30 const StringsAndChecksumsRef &State) {31 BinaryStreamReader Reader(R.getRecordData());32 switch (R.kind()) {33 case DebugSubsectionKind::Lines: {34 DebugLinesSubsectionRef Fragment;35 if (auto EC = Fragment.initialize(Reader))36 return EC;37 38 return V.visitLines(Fragment, State);39 }40 case DebugSubsectionKind::FileChecksums: {41 DebugChecksumsSubsectionRef Fragment;42 if (auto EC = Fragment.initialize(Reader))43 return EC;44 45 return V.visitFileChecksums(Fragment, State);46 }47 case DebugSubsectionKind::InlineeLines: {48 DebugInlineeLinesSubsectionRef Fragment;49 if (auto EC = Fragment.initialize(Reader))50 return EC;51 return V.visitInlineeLines(Fragment, State);52 }53 case DebugSubsectionKind::CrossScopeExports: {54 DebugCrossModuleExportsSubsectionRef Section;55 if (auto EC = Section.initialize(Reader))56 return EC;57 return V.visitCrossModuleExports(Section, State);58 }59 case DebugSubsectionKind::CrossScopeImports: {60 DebugCrossModuleImportsSubsectionRef Section;61 if (auto EC = Section.initialize(Reader))62 return EC;63 return V.visitCrossModuleImports(Section, State);64 }65 case DebugSubsectionKind::Symbols: {66 DebugSymbolsSubsectionRef Section;67 if (auto EC = Section.initialize(Reader))68 return EC;69 return V.visitSymbols(Section, State);70 }71 case DebugSubsectionKind::StringTable: {72 DebugStringTableSubsectionRef Section;73 if (auto EC = Section.initialize(Reader))74 return EC;75 return V.visitStringTable(Section, State);76 }77 case DebugSubsectionKind::FrameData: {78 DebugFrameDataSubsectionRef Section;79 if (auto EC = Section.initialize(Reader))80 return EC;81 return V.visitFrameData(Section, State);82 }83 case DebugSubsectionKind::CoffSymbolRVA: {84 DebugSymbolRVASubsectionRef Section;85 if (auto EC = Section.initialize(Reader))86 return EC;87 return V.visitCOFFSymbolRVAs(Section, State);88 }89 default: {90 DebugUnknownSubsectionRef Fragment(R.kind(), R.getRecordData());91 return V.visitUnknown(Fragment);92 }93 }94}95