mirror of
https://github.com/RPCSX/llvm.git
synced 2026-01-31 01:05:23 +01:00
This is part of a larger effort to get the Stream code moved up to Support. I don't want to do it in one large patch, in part because the changes are so big that it will treat everything as file deletions and add, losing history in the process. Aside from that though, it's just a good idea in general to make small changes. So this change only changes the names of the Stream related source files, and applies necessary source fix ups. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296211 91177308-0d34-0410-b5e6-96231b3b80d8
137 lines
5.1 KiB
C++
137 lines
5.1 KiB
C++
//===- ModuleSubstreamVisitor.h ---------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_DEBUGINFO_CODEVIEW_MODULESUBSTREAMVISITOR_H
|
|
#define LLVM_DEBUGINFO_CODEVIEW_MODULESUBSTREAMVISITOR_H
|
|
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include "llvm/DebugInfo/CodeView/CodeView.h"
|
|
#include "llvm/DebugInfo/CodeView/CodeViewError.h"
|
|
#include "llvm/DebugInfo/CodeView/Line.h"
|
|
#include "llvm/DebugInfo/CodeView/ModuleSubstream.h"
|
|
#include "llvm/DebugInfo/MSF/BinaryStreamArray.h"
|
|
#include "llvm/DebugInfo/MSF/BinaryStreamReader.h"
|
|
#include "llvm/DebugInfo/MSF/BinaryStreamRef.h"
|
|
#include "llvm/Support/Endian.h"
|
|
#include "llvm/Support/Error.h"
|
|
#include <cstdint>
|
|
|
|
namespace llvm {
|
|
|
|
namespace codeview {
|
|
|
|
struct LineColumnEntry {
|
|
support::ulittle32_t NameIndex;
|
|
msf::FixedStreamArray<LineNumberEntry> LineNumbers;
|
|
msf::FixedStreamArray<ColumnNumberEntry> Columns;
|
|
};
|
|
|
|
struct FileChecksumEntry {
|
|
uint32_t FileNameOffset; // Byte offset of filename in global stringtable.
|
|
FileChecksumKind Kind; // The type of checksum.
|
|
ArrayRef<uint8_t> Checksum; // The bytes of the checksum.
|
|
};
|
|
|
|
typedef msf::VarStreamArray<LineColumnEntry> LineInfoArray;
|
|
typedef msf::VarStreamArray<FileChecksumEntry> FileChecksumArray;
|
|
|
|
class IModuleSubstreamVisitor {
|
|
public:
|
|
virtual ~IModuleSubstreamVisitor() = default;
|
|
|
|
virtual Error visitUnknown(ModuleSubstreamKind Kind,
|
|
msf::ReadableStreamRef Data) = 0;
|
|
virtual Error visitSymbols(msf::ReadableStreamRef Data);
|
|
virtual Error visitLines(msf::ReadableStreamRef Data,
|
|
const LineSubstreamHeader *Header,
|
|
const LineInfoArray &Lines);
|
|
virtual Error visitStringTable(msf::ReadableStreamRef Data);
|
|
virtual Error visitFileChecksums(msf::ReadableStreamRef Data,
|
|
const FileChecksumArray &Checksums);
|
|
virtual Error visitFrameData(msf::ReadableStreamRef Data);
|
|
virtual Error visitInlineeLines(msf::ReadableStreamRef Data);
|
|
virtual Error visitCrossScopeImports(msf::ReadableStreamRef Data);
|
|
virtual Error visitCrossScopeExports(msf::ReadableStreamRef Data);
|
|
virtual Error visitILLines(msf::ReadableStreamRef Data);
|
|
virtual Error visitFuncMDTokenMap(msf::ReadableStreamRef Data);
|
|
virtual Error visitTypeMDTokenMap(msf::ReadableStreamRef Data);
|
|
virtual Error visitMergedAssemblyInput(msf::ReadableStreamRef Data);
|
|
virtual Error visitCoffSymbolRVA(msf::ReadableStreamRef Data);
|
|
};
|
|
|
|
Error visitModuleSubstream(const ModuleSubstream &R,
|
|
IModuleSubstreamVisitor &V);
|
|
} // end namespace codeview
|
|
|
|
namespace msf {
|
|
|
|
template <> class VarStreamArrayExtractor<codeview::LineColumnEntry> {
|
|
public:
|
|
VarStreamArrayExtractor(const codeview::LineSubstreamHeader *Header)
|
|
: Header(Header) {}
|
|
|
|
Error operator()(ReadableStreamRef Stream, uint32_t &Len,
|
|
codeview::LineColumnEntry &Item) const {
|
|
using namespace codeview;
|
|
const LineFileBlockHeader *BlockHeader;
|
|
StreamReader Reader(Stream);
|
|
if (auto EC = Reader.readObject(BlockHeader))
|
|
return EC;
|
|
bool HasColumn = Header->Flags & LineFlags::HaveColumns;
|
|
uint32_t LineInfoSize =
|
|
BlockHeader->NumLines *
|
|
(sizeof(LineNumberEntry) + (HasColumn ? sizeof(ColumnNumberEntry) : 0));
|
|
if (BlockHeader->BlockSize < sizeof(LineFileBlockHeader))
|
|
return make_error<CodeViewError>(cv_error_code::corrupt_record,
|
|
"Invalid line block record size");
|
|
uint32_t Size = BlockHeader->BlockSize - sizeof(LineFileBlockHeader);
|
|
if (LineInfoSize > Size)
|
|
return make_error<CodeViewError>(cv_error_code::corrupt_record,
|
|
"Invalid line block record size");
|
|
// The value recorded in BlockHeader->BlockSize includes the size of
|
|
// LineFileBlockHeader.
|
|
Len = BlockHeader->BlockSize;
|
|
Item.NameIndex = BlockHeader->NameIndex;
|
|
if (auto EC = Reader.readArray(Item.LineNumbers, BlockHeader->NumLines))
|
|
return EC;
|
|
if (HasColumn) {
|
|
if (auto EC = Reader.readArray(Item.Columns, BlockHeader->NumLines))
|
|
return EC;
|
|
}
|
|
return Error::success();
|
|
}
|
|
|
|
private:
|
|
const codeview::LineSubstreamHeader *Header;
|
|
};
|
|
|
|
template <> class VarStreamArrayExtractor<codeview::FileChecksumEntry> {
|
|
public:
|
|
Error operator()(ReadableStreamRef Stream, uint32_t &Len,
|
|
codeview::FileChecksumEntry &Item) const {
|
|
using namespace codeview;
|
|
const FileChecksum *Header;
|
|
StreamReader Reader(Stream);
|
|
if (auto EC = Reader.readObject(Header))
|
|
return EC;
|
|
Item.FileNameOffset = Header->FileNameOffset;
|
|
Item.Kind = static_cast<FileChecksumKind>(Header->ChecksumKind);
|
|
if (auto EC = Reader.readBytes(Item.Checksum, Header->ChecksumSize))
|
|
return EC;
|
|
Len = sizeof(FileChecksum) + Header->ChecksumSize;
|
|
return Error::success();
|
|
}
|
|
};
|
|
|
|
} // end namespace msf
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_DEBUGINFO_CODEVIEW_MODULESUBSTREAMVISITOR_H
|