1 //===- C13DebugFragmentVisitor.cpp -------------------------------*- C++-*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "C13DebugFragmentVisitor.h"
12 #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
13 #include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
14 #include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
15 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
16 #include "llvm/DebugInfo/PDB/Native/PDBStringTable.h"
17 #include "llvm/DebugInfo/PDB/Native/RawError.h"
20 using namespace llvm::codeview;
21 using namespace llvm::pdb;
23 C13DebugFragmentVisitor::C13DebugFragmentVisitor(PDBFile &F) : F(F) {}
25 C13DebugFragmentVisitor::~C13DebugFragmentVisitor() {}
27 Error C13DebugFragmentVisitor::visitUnknown(
28 codeview::DebugUnknownSubsectionRef &Fragment) {
29 return Error::success();
32 Error C13DebugFragmentVisitor::visitFileChecksums(
33 codeview::DebugChecksumsSubsectionRef &Checksums) {
34 assert(!this->Checksums.hasValue());
35 this->Checksums = Checksums;
36 return Error::success();
39 Error C13DebugFragmentVisitor::visitLines(
40 codeview::DebugLinesSubsectionRef &Lines) {
41 this->Lines.push_back(Lines);
42 return Error::success();
45 Error C13DebugFragmentVisitor::visitInlineeLines(
46 codeview::DebugInlineeLinesSubsectionRef &Lines) {
47 this->InlineeLines.push_back(Lines);
48 return Error::success();
51 Error C13DebugFragmentVisitor::finished() {
52 if (!Checksums.hasValue()) {
53 assert(Lines.empty());
54 return Error::success();
56 if (auto EC = handleFileChecksums())
59 if (auto EC = handleLines())
62 if (auto EC = handleInlineeLines())
65 return Error::success();
69 C13DebugFragmentVisitor::getNameFromStringTable(uint32_t Offset) {
70 auto ST = F.getStringTable();
72 return ST.takeError();
74 return ST->getStringForID(Offset);
78 C13DebugFragmentVisitor::getNameFromChecksumsBuffer(uint32_t Offset) {
79 assert(Checksums.hasValue());
81 auto Array = Checksums->getArray();
82 auto ChecksumIter = Array.at(Offset);
83 if (ChecksumIter == Array.end())
84 return make_error<RawError>(raw_error_code::invalid_format);
85 const auto &Entry = *ChecksumIter;
86 return getNameFromStringTable(Entry.FileNameOffset);