mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-14 23:06:05 +00:00

This adds support for Symbols, StringTable, and FrameData subsection types. Even though these subsections rarely if ever appear in a PDB file (they are usually in object files), there's no theoretical reason why they *couldn't* appear in a PDB. The real issue though is that in order to add support for dumping and writing them (which will be useful for object files), we need a way to test them. And since there is no support for reading and writing them to / from object files yet, making PDB support them is the best way to both add support for the underlying format and add support for tests at the same time. Later, when we go to add support for reading / writing them from object files, we'll need only minimal changes in the underlying read/write code. llvm-svn: 305037
120 lines
4.2 KiB
C++
120 lines
4.2 KiB
C++
//===- DebugSubsectionVisitor.cpp -------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#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/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;
|
|
|
|
DebugSubsectionState::DebugSubsectionState() {}
|
|
|
|
DebugSubsectionState::DebugSubsectionState(
|
|
const DebugStringTableSubsectionRef &Strings)
|
|
: Strings(&Strings) {}
|
|
|
|
DebugSubsectionState::DebugSubsectionState(
|
|
const DebugStringTableSubsectionRef &Strings,
|
|
const DebugChecksumsSubsectionRef &Checksums)
|
|
: Strings(&Strings), Checksums(&Checksums) {}
|
|
|
|
void DebugSubsectionState::initializeStrings(const DebugSubsectionRecord &SR) {
|
|
assert(SR.kind() == DebugSubsectionKind::StringTable);
|
|
assert(!Strings && "Found a string table even though we already have one!");
|
|
|
|
OwnedStrings = llvm::make_unique<DebugStringTableSubsectionRef>();
|
|
consumeError(OwnedStrings->initialize(SR.getRecordData()));
|
|
Strings = OwnedStrings.get();
|
|
}
|
|
|
|
void DebugSubsectionState::initializeChecksums(
|
|
const DebugSubsectionRecord &FCR) {
|
|
assert(FCR.kind() == DebugSubsectionKind::FileChecksums);
|
|
if (Checksums)
|
|
return;
|
|
|
|
OwnedChecksums = llvm::make_unique<DebugChecksumsSubsectionRef>();
|
|
consumeError(OwnedChecksums->initialize(FCR.getRecordData()));
|
|
Checksums = OwnedChecksums.get();
|
|
}
|
|
|
|
Error llvm::codeview::visitDebugSubsection(const DebugSubsectionRecord &R,
|
|
DebugSubsectionVisitor &V,
|
|
const DebugSubsectionState &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);
|
|
}
|
|
default: {
|
|
DebugUnknownSubsectionRef Fragment(R.kind(), R.getRecordData());
|
|
return V.visitUnknown(Fragment);
|
|
}
|
|
}
|
|
}
|