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/PDB | |
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/PDB')
-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 |
3 files changed, 59 insertions, 3 deletions
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; } |