diff options
| author | Zachary Turner <zturner@google.com> | 2016-06-02 20:11:22 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2016-06-02 20:11:22 +0000 |
| commit | 7eb6d358afb1461990939b9b364e86f9b1c41eaf (patch) | |
| tree | 0242b917eef3693fa9c68c7ba1f59ec53b72b27a /llvm/lib/DebugInfo | |
| parent | 43578ec2a853b5dc98d63d3fd4c42cd1083ff909 (diff) | |
| download | bcm5719-llvm-7eb6d358afb1461990939b9b364e86f9b1c41eaf.tar.gz bcm5719-llvm-7eb6d358afb1461990939b9b364e86f9b1c41eaf.zip | |
[llvm-pdbdump] Dump CodeView line information.
This first pass only splits apart the records and dumps the line
info kinds and binary data. Subsequent patches will parse out
the binary data into more useful information and dump it in
detail.
llvm-svn: 271576
Diffstat (limited to 'llvm/lib/DebugInfo')
| -rw-r--r-- | llvm/lib/DebugInfo/CodeView/EnumTables.cpp | 20 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/CodeView/StreamReader.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp | 12 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/ModuleSubstreamRecord.cpp | 49 |
5 files changed, 80 insertions, 4 deletions
diff --git a/llvm/lib/DebugInfo/CodeView/EnumTables.cpp b/llvm/lib/DebugInfo/CodeView/EnumTables.cpp index b209aa9f98e..edb489767d4 100644 --- a/llvm/lib/DebugInfo/CodeView/EnumTables.cpp +++ b/llvm/lib/DebugInfo/CodeView/EnumTables.cpp @@ -231,6 +231,23 @@ static const EnumEntry<uint32_t> FrameProcSymFlagNames[] = { CV_ENUM_CLASS_ENT(FrameProcedureOptions, GuardCfw), }; +static const EnumEntry<uint32_t> ModuleSubstreamKindNames[] = { + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, None), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, Symbols), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, Lines), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, StringTable), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, FileChecksums), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, FrameData), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, InlineeLines), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, CrossScopeImports), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, CrossScopeExports), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, ILLines), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, FuncMDTokenMap), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, TypeMDTokenMap), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, MergedAssemblyInput), + CV_ENUM_CLASS_ENT(ModuleSubstreamKind, CoffSymbolRVA), +}; + static const EnumEntry<uint16_t> ExportSymFlagNames[] = { CV_ENUM_CLASS_ENT(ExportFlags, IsConstant), CV_ENUM_CLASS_ENT(ExportFlags, IsData), @@ -331,6 +348,9 @@ ArrayRef<EnumEntry<uint32_t>> getFrameProcSymFlagNames() { ArrayRef<EnumEntry<uint16_t>> getExportSymFlagNames() { return makeArrayRef(ExportSymFlagNames); } +ArrayRef<EnumEntry<uint32_t>> getModuleSubstreamKindNames() { + return makeArrayRef(ModuleSubstreamKindNames); +} ArrayRef<EnumEntry<uint8_t>> getThunkOrdinalNames() { return makeArrayRef(ThunkOrdinalNames); } diff --git a/llvm/lib/DebugInfo/CodeView/StreamReader.cpp b/llvm/lib/DebugInfo/CodeView/StreamReader.cpp index 2adf9487e5d..cc5cebc9c43 100644 --- a/llvm/lib/DebugInfo/CodeView/StreamReader.cpp +++ b/llvm/lib/DebugInfo/CodeView/StreamReader.cpp @@ -15,7 +15,7 @@ using namespace llvm; using namespace llvm::codeview; -StreamReader::StreamReader(StreamRef Stream) : Stream(Stream), Offset(0) {} +StreamReader::StreamReader(StreamRef S) : Stream(S), Offset(0) {} Error StreamReader::readBytes(ArrayRef<uint8_t> &Buffer, uint32_t Size) { if (auto EC = Stream.readBytes(Offset, Size, Buffer)) diff --git a/llvm/lib/DebugInfo/PDB/CMakeLists.txt b/llvm/lib/DebugInfo/PDB/CMakeLists.txt index 46074f769cd..4dc0b4f8c31 100644 --- a/llvm/lib/DebugInfo/PDB/CMakeLists.txt +++ b/llvm/lib/DebugInfo/PDB/CMakeLists.txt @@ -33,6 +33,7 @@ add_pdb_impl_folder(Raw Raw/InfoStream.cpp Raw/MappedBlockStream.cpp Raw/ModInfo.cpp + Raw/ModuleSubstreamRecord.cpp Raw/ModStream.cpp Raw/NameHashTable.cpp Raw/NameMap.cpp diff --git a/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp index b7204cb5afa..a6d1977165f 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp @@ -13,6 +13,7 @@ #include "llvm/DebugInfo/PDB/Raw/ModInfo.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawError.h" +#include "llvm/DebugInfo/PDB/Raw/RawTypes.h" using namespace llvm; using namespace llvm::pdb; @@ -45,9 +46,9 @@ Error ModStream::reload() { return EC; if (auto EC = Reader.readStreamRef(C13LinesSubstream, C13Size)) return EC; - ArrayRef<uint8_t> LineBytes; - codeview::StreamReader LinesReader(C13LinesSubstream); - if (auto EC = LinesReader.readBytes(LineBytes, C13LinesSubstream.getLength())) + + codeview::StreamReader LineReader(C13LinesSubstream); + if (auto EC = LineReader.readArray(LineInfo, LineReader.bytesRemaining())) return EC; uint32_t GlobalRefsSize; @@ -67,3 +68,8 @@ ModStream::symbols(bool *HadError) const { return llvm::make_range(SymbolsSubstream.begin(HadError), SymbolsSubstream.end()); } + +iterator_range<ModStream::LineInfoArray::Iterator> +ModStream::lines(bool *HadError) const { + return llvm::make_range(LineInfo.begin(HadError), LineInfo.end()); +} diff --git a/llvm/lib/DebugInfo/PDB/Raw/ModuleSubstreamRecord.cpp b/llvm/lib/DebugInfo/PDB/Raw/ModuleSubstreamRecord.cpp new file mode 100644 index 00000000000..3e0573bf5ef --- /dev/null +++ b/llvm/lib/DebugInfo/PDB/Raw/ModuleSubstreamRecord.cpp @@ -0,0 +1,49 @@ +//===- ModuleSubstreamRecord.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/PDB/Raw/ModuleSubstreamRecord.h" + +#include "llvm/DebugInfo/CodeView/StreamReader.h" +#include "llvm/DebugInfo/PDB/Raw/RawTypes.h" + +using namespace llvm; +using namespace llvm::codeview; +using namespace llvm::pdb; + +ModuleSubstreamRecord::ModuleSubstreamRecord() + : Kind(ModuleSubstreamKind::None) {} + +ModuleSubstreamRecord::ModuleSubstreamRecord(ModuleSubstreamKind Kind, + StreamRef Data) + : Kind(Kind), Data(Data) {} + +Error ModuleSubstreamRecord::initialize(StreamRef Stream, + ModuleSubstreamRecord &Info) { + const ModuleSubsectionHeader *Header; + StreamReader Reader(Stream); + if (auto EC = Reader.readObject(Header)) + return EC; + + ModuleSubstreamKind Kind = + static_cast<ModuleSubstreamKind>(uint32_t(Header->Kind)); + if (auto EC = Reader.readStreamRef(Info.Data, Header->Length)) + return EC; + Info.Kind = Kind; + return Error::success(); +} + +uint32_t ModuleSubstreamRecord::getRecordLength() const { + return sizeof(ModuleSubsectionHeader) + Data.getLength(); +} + +ModuleSubstreamKind ModuleSubstreamRecord::getSubstreamKind() const { + return Kind; +} + +StreamRef ModuleSubstreamRecord::getRecordData() const { return Data; } |

