[llvm] r301557 - [CodeView] Isolate Debug Info Fragments into standalone classes.
Aaron Ballman via llvm-commits
llvm-commits at lists.llvm.org
Tue May 9 07:36:12 PDT 2017
On Tue, May 9, 2017 at 10:23 AM, Zachary Turner <zturner at google.com> wrote:
> Hmm, it's probably not needed and I suppose it got added as boilerplate when
> i was creating new files but didn't remove it when it turned out the
> contents were empty.
>
> Feel free to remove, or I'll be in in a few hours and i can do it.
Thanks! I've removed it in r302531.
~Aaron
>
> On Tue, May 9, 2017 at 7:20 AM Aaron Ballman <aaron at aaronballman.com> wrote:
>>
>> On Thu, Apr 27, 2017 at 12:12 PM, Zachary Turner via llvm-commits
>> <llvm-commits at lists.llvm.org> wrote:
>> > Author: zturner
>> > Date: Thu Apr 27 11:12:16 2017
>> > New Revision: 301557
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=301557&view=rev
>> > Log:
>> > [CodeView] Isolate Debug Info Fragments into standalone classes.
>> >
>> > Previously parsing of these were all grouped together into a
>> > single master class that could parse any type of debug info
>> > fragment.
>> >
>> > With writing forthcoming, the complexity of each individual
>> > fragment is enough to warrant them having their own classes so
>> > that reading and writing of each fragment type can be grouped
>> > together, but isolated from the code for reading and writing
>> > other fragment types.
>> >
>> > In doing so, I found a place where parsing code was duplicated
>> > for the FileChecksums fragment, across llvm-readobj and the
>> > CodeView library, and one of the implementations had a bug.
>> > Now that the codepaths are merged, the bug is resolved.
>> >
>> > Differential Revision: https://reviews.llvm.org/D32547
>> >
>> > Added:
>> >
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h
>> >
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentRecord.h
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h
>> >
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugUnknownFragment.h
>> >
>> > llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.cpp
>> > llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentRecord.cpp
>> > llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugLineFragment.cpp
>> > llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugUnknownFragment.cpp
>> > Modified:
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragment.h
>> >
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h
>> > llvm/trunk/include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h
>> > llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt
>> > llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragment.cpp
>> > llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentVisitor.cpp
>> > llvm/trunk/lib/DebugInfo/PDB/Native/ModuleDebugStream.cpp
>> > llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp
>> > llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
>> > llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
>> >
>> > Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h?rev=301557&r1=301556&r2=301557&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h (original)
>> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h Thu Apr 27
>> > 11:12:16 2017
>> > @@ -141,13 +141,6 @@ struct InlineeSourceLine {
>> > // ulittle32_t Files[];
>> > };
>> >
>> > -struct FileChecksum {
>> > - ulittle32_t FileNameOffset; // Byte offset of filename in global
>> > string table.
>> > - uint8_t ChecksumSize; // Number of bytes of checksum.
>> > - uint8_t ChecksumKind; // FileChecksumKind
>> > - // Checksum bytes follow.
>> > -};
>> > -
>> > } // namespace codeview
>> > } // namespace llvm
>> >
>> >
>> > Added:
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h?rev=301557&view=auto
>> >
>> > ==============================================================================
>> > ---
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h
>> > (added)
>> > +++
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h
>> > Thu Apr 27 11:12:16 2017
>> > @@ -0,0 +1,65 @@
>> > +//===- ModuleDebugLineFragment.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_MODULEDEBUGFILECHECKSUMFRAGMENT_H
>> > +#define LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGFILECHECKSUMFRAGMENT_H
>> > +
>> > +#include "llvm/ADT/ArrayRef.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFragment.h"
>> > +#include "llvm/Support/BinaryStreamArray.h"
>> > +#include "llvm/Support/BinaryStreamReader.h"
>> > +#include "llvm/Support/Endian.h"
>> > +
>> > +namespace llvm {
>> > +namespace codeview {
>> > +
>> > +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.
>> > +};
>> > +}
>> > +}
>> > +
>> > +namespace llvm {
>> > +template <> struct VarStreamArrayExtractor<codeview::FileChecksumEntry>
>> > {
>> > +public:
>> > + typedef void ContextType;
>> > +
>> > + static Error extract(BinaryStreamRef Stream, uint32_t &Len,
>> > + codeview::FileChecksumEntry &Item, void *Ctx);
>> > +};
>> > +}
>> > +
>> > +namespace llvm {
>> > +namespace codeview {
>> > +class ModuleDebugFileChecksumFragment final : public
>> > ModuleDebugFragment {
>> > + typedef VarStreamArray<FileChecksumEntry> FileChecksumArray;
>> > + typedef FileChecksumArray::Iterator Iterator;
>> > +
>> > +public:
>> > + ModuleDebugFileChecksumFragment()
>> > + : ModuleDebugFragment(ModuleDebugFragmentKind::FileChecksums) {}
>> > +
>> > + static bool classof(const ModuleDebugFragment *S) {
>> > + return S->kind() == ModuleDebugFragmentKind::FileChecksums;
>> > + }
>> > +
>> > + Error initialize(BinaryStreamReader Reader);
>> > +
>> > + Iterator begin() const { return Checksums.begin(); }
>> > + Iterator end() const { return Checksums.end(); }
>> > +
>> > +private:
>> > + FileChecksumArray Checksums;
>> > +};
>> > +}
>> > +}
>> > +
>> > +#endif
>> >
>> > Modified:
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragment.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragment.h?rev=301557&r1=301556&r2=301557&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragment.h
>> > (original)
>> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragment.h Thu
>> > Apr 27 11:12:16 2017
>> > @@ -11,79 +11,23 @@
>> > #define LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGFRAGMENT_H
>> >
>> > #include "llvm/DebugInfo/CodeView/CodeView.h"
>> > -#include "llvm/Support/BinaryStreamArray.h"
>> > -#include "llvm/Support/BinaryStreamRef.h"
>> > -#include "llvm/Support/Endian.h"
>> > -#include "llvm/Support/Error.h"
>> > +#include "llvm/Support/Casting.h"
>> >
>> > namespace llvm {
>> > namespace codeview {
>> >
>> > -// Corresponds to the `CV_DebugSSubsectionHeader_t` structure.
>> > -struct ModuleDebugFragmentHeader {
>> > - support::ulittle32_t Kind; // codeview::ModuleDebugFragmentKind
>> > enum
>> > - support::ulittle32_t Length; // number of bytes occupied by this
>> > record.
>> > -};
>> > -
>> > -// Corresponds to the `CV_DebugSLinesHeader_t` structure.
>> > -struct LineFragmentHeader {
>> > - support::ulittle32_t RelocOffset; // Code offset of line
>> > contribution.
>> > - support::ulittle16_t RelocSegment; // Code segment of line
>> > contribution.
>> > - support::ulittle16_t Flags; // See LineFlags enumeration.
>> > - support::ulittle32_t CodeSize; // Code size of this line
>> > contribution.
>> > -};
>> > -
>> > -// Corresponds to the `CV_DebugSLinesFileBlockHeader_t` structure.
>> > -struct LineBlockFragmentHeader {
>> > - support::ulittle32_t NameIndex; // Index in DBI name buffer of
>> > filename.
>> > - support::ulittle32_t NumLines; // Number of lines
>> > - support::ulittle32_t BlockSize; // Code size of block, in bytes.
>> > - // The following two variable length arrays appear immediately after
>> > the
>> > - // header. The structure definitions follow.
>> > - // LineNumberEntry Lines[NumLines];
>> > - // ColumnNumberEntry Columns[NumLines];
>> > -};
>> > -
>> > -// Corresponds to `CV_Line_t` structure
>> > -struct LineNumberEntry {
>> > - support::ulittle32_t Offset; // Offset to start of code bytes for
>> > line number
>> > - support::ulittle32_t Flags; // Start:24, End:7, IsStatement:1
>> > -};
>> > -
>> > -// Corresponds to `CV_Column_t` structure
>> > -struct ColumnNumberEntry {
>> > - support::ulittle16_t StartColumn;
>> > - support::ulittle16_t EndColumn;
>> > -};
>> > -
>> > class ModuleDebugFragment {
>> > public:
>> > - ModuleDebugFragment();
>> > - ModuleDebugFragment(ModuleDebugFragmentKind Kind, BinaryStreamRef
>> > Data);
>> > - static Error initialize(BinaryStreamRef Stream, ModuleDebugFragment
>> > &Info);
>> > - uint32_t getRecordLength() const;
>> > - ModuleDebugFragmentKind kind() const;
>> > - BinaryStreamRef getRecordData() const;
>> > + explicit ModuleDebugFragment(ModuleDebugFragmentKind Kind) :
>> > Kind(Kind) {}
>> > +
>> > + virtual ~ModuleDebugFragment();
>> > + ModuleDebugFragmentKind kind() const { return Kind; }
>> >
>> > -private:
>> > +protected:
>> > ModuleDebugFragmentKind Kind;
>> > - BinaryStreamRef Data;
>> > };
>> >
>> > -typedef VarStreamArray<ModuleDebugFragment> ModuleDebugFragmentArray;
>> > } // namespace codeview
>> > -
>> > -template <> struct
>> > VarStreamArrayExtractor<codeview::ModuleDebugFragment> {
>> > - typedef void ContextType;
>> > -
>> > - static Error extract(BinaryStreamRef Stream, uint32_t &Length,
>> > - codeview::ModuleDebugFragment &Info, void *Ctx)
>> > {
>> > - if (auto EC = codeview::ModuleDebugFragment::initialize(Stream,
>> > Info))
>> > - return EC;
>> > - Length = Info.getRecordLength();
>> > - return Error::success();
>> > - }
>> > -};
>> > } // namespace llvm
>> >
>> > #endif // LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGFRAGMENT_H
>> >
>> > Added:
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentRecord.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentRecord.h?rev=301557&view=auto
>> >
>> > ==============================================================================
>> > ---
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentRecord.h
>> > (added)
>> > +++
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentRecord.h Thu
>> > Apr 27 11:12:16 2017
>> > @@ -0,0 +1,62 @@
>> > +//===- ModuleDebugFragment.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_MODULEDEBUGFRAGMENTRECORD_H
>> > +#define LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGFRAGMENTRECORD_H
>> > +
>> > +#include "llvm/DebugInfo/CodeView/CodeView.h"
>> > +#include "llvm/Support/BinaryStreamArray.h"
>> > +#include "llvm/Support/BinaryStreamRef.h"
>> > +#include "llvm/Support/Endian.h"
>> > +#include "llvm/Support/Error.h"
>> > +
>> > +namespace llvm {
>> > +namespace codeview {
>> > +
>> > +// Corresponds to the `CV_DebugSSubsectionHeader_t` structure.
>> > +struct ModuleDebugFragmentHeader {
>> > + support::ulittle32_t Kind; // codeview::ModuleDebugFragmentKind
>> > enum
>> > + support::ulittle32_t Length; // number of bytes occupied by this
>> > record.
>> > +};
>> > +
>> > +class ModuleDebugFragmentRecord {
>> > +public:
>> > + ModuleDebugFragmentRecord();
>> > + ModuleDebugFragmentRecord(ModuleDebugFragmentKind Kind,
>> > BinaryStreamRef Data);
>> > +
>> > + static Error initialize(BinaryStreamRef Stream,
>> > + ModuleDebugFragmentRecord &Info);
>> > + uint32_t getRecordLength() const;
>> > + ModuleDebugFragmentKind kind() const;
>> > + BinaryStreamRef getRecordData() const;
>> > +
>> > +private:
>> > + ModuleDebugFragmentKind Kind;
>> > + BinaryStreamRef Data;
>> > +};
>> > +
>> > +typedef VarStreamArray<ModuleDebugFragmentRecord>
>> > ModuleDebugFragmentArray;
>> > +
>> > +} // namespace codeview
>> > +
>> > +template <>
>> > +struct VarStreamArrayExtractor<codeview::ModuleDebugFragmentRecord> {
>> > + typedef void ContextType;
>> > +
>> > + static Error extract(BinaryStreamRef Stream, uint32_t &Length,
>> > + codeview::ModuleDebugFragmentRecord &Info, void
>> > *Ctx) {
>> > + if (auto EC =
>> > codeview::ModuleDebugFragmentRecord::initialize(Stream, Info))
>> > + return EC;
>> > + Length = Info.getRecordLength();
>> > + return Error::success();
>> > + }
>> > +};
>> > +} // namespace llvm
>> > +
>> > +#endif // LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGFRAGMENTRECORD_H
>> >
>> > Modified:
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h?rev=301557&r1=301556&r2=301557&view=diff
>> >
>> > ==============================================================================
>> > ---
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h
>> > (original)
>> > +++
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h Thu
>> > Apr 27 11:12:16 2017
>> > @@ -14,7 +14,10 @@
>> > #include "llvm/DebugInfo/CodeView/CodeView.h"
>> > #include "llvm/DebugInfo/CodeView/CodeViewError.h"
>> > #include "llvm/DebugInfo/CodeView/Line.h"
>> > -#include "llvm/DebugInfo/CodeView/ModuleDebugFragment.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFragmentRecord.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugUnknownFragment.h"
>> > #include "llvm/Support/BinaryStreamArray.h"
>> > #include "llvm/Support/BinaryStreamReader.h"
>> > #include "llvm/Support/BinaryStreamRef.h"
>> > @@ -26,105 +29,26 @@ namespace llvm {
>> >
>> > namespace codeview {
>> >
>> > -struct LineColumnEntry {
>> > - support::ulittle32_t NameIndex;
>> > - FixedStreamArray<LineNumberEntry> LineNumbers;
>> > - 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 VarStreamArray<LineColumnEntry> LineInfoArray;
>> > -typedef VarStreamArray<FileChecksumEntry> FileChecksumArray;
>> > -
>> > class ModuleDebugFragmentVisitor {
>> > public:
>> > virtual ~ModuleDebugFragmentVisitor() = default;
>> >
>> > - virtual Error visitUnknown(ModuleDebugFragmentKind Kind,
>> > - BinaryStreamRef Data) = 0;
>> > - virtual Error visitSymbols(BinaryStreamRef Data);
>> > - virtual Error visitLines(BinaryStreamRef Data,
>> > - const LineFragmentHeader *Header,
>> > - const LineInfoArray &Lines);
>> > - virtual Error visitStringTable(BinaryStreamRef Data);
>> > - virtual Error visitFileChecksums(BinaryStreamRef Data,
>> > - const FileChecksumArray &Checksums);
>> > - virtual Error visitFrameData(BinaryStreamRef Data);
>> > - virtual Error visitInlineeLines(BinaryStreamRef Data);
>> > - virtual Error visitCrossScopeImports(BinaryStreamRef Data);
>> > - virtual Error visitCrossScopeExports(BinaryStreamRef Data);
>> > - virtual Error visitILLines(BinaryStreamRef Data);
>> > - virtual Error visitFuncMDTokenMap(BinaryStreamRef Data);
>> > - virtual Error visitTypeMDTokenMap(BinaryStreamRef Data);
>> > - virtual Error visitMergedAssemblyInput(BinaryStreamRef Data);
>> > - virtual Error visitCoffSymbolRVA(BinaryStreamRef Data);
>> > -};
>> > -
>> > -Error visitModuleDebugFragment(const ModuleDebugFragment &R,
>> > - ModuleDebugFragmentVisitor &V);
>> > -} // end namespace codeview
>> > -
>> > -template <> class VarStreamArrayExtractor<codeview::LineColumnEntry> {
>> > -public:
>> > - typedef const codeview::LineFragmentHeader ContextType;
>> > -
>> > - static Error extract(BinaryStreamRef Stream, uint32_t &Len,
>> > - codeview::LineColumnEntry &Item, ContextType
>> > *Header) {
>> > - using namespace codeview;
>> > - const LineBlockFragmentHeader *BlockHeader;
>> > - BinaryStreamReader Reader(Stream);
>> > - if (auto EC = Reader.readObject(BlockHeader))
>> > - return EC;
>> > - bool HasColumn = Header->Flags & uint32_t(LineFlags::HaveColumns);
>> > - uint32_t LineInfoSize =
>> > - BlockHeader->NumLines *
>> > - (sizeof(LineNumberEntry) + (HasColumn ?
>> > sizeof(ColumnNumberEntry) : 0));
>> > - if (BlockHeader->BlockSize < sizeof(LineBlockFragmentHeader))
>> > - return make_error<CodeViewError>(cv_error_code::corrupt_record,
>> > - "Invalid line block record
>> > size");
>> > - uint32_t Size = BlockHeader->BlockSize -
>> > sizeof(LineBlockFragmentHeader);
>> > - 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
>> > - // LineBlockFragmentHeader.
>> > - 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;
>> > - }
>> > + virtual Error visitUnknown(ModuleDebugUnknownFragment &Unknown) {
>> > + return Error::success();
>> > + }
>> > + virtual Error visitLines(ModuleDebugLineFragment &Lines) {
>> > return Error::success();
>> > }
>> > -};
>> > -
>> > -template <> class VarStreamArrayExtractor<codeview::FileChecksumEntry>
>> > {
>> > -public:
>> > - typedef void ContextType;
>> >
>> > - static Error extract(BinaryStreamRef Stream, uint32_t &Len,
>> > - codeview::FileChecksumEntry &Item, void *Ctx) {
>> > - using namespace codeview;
>> > - const FileChecksum *Header;
>> > - BinaryStreamReader 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;
>> > + virtual Error visitFileChecksums(ModuleDebugFileChecksumFragment
>> > &Checksums) {
>> > return Error::success();
>> > }
>> > };
>> >
>> > +Error visitModuleDebugFragment(const ModuleDebugFragmentRecord &R,
>> > + ModuleDebugFragmentVisitor &V);
>> > +} // end namespace codeview
>> > +
>> > } // end namespace llvm
>> >
>> > #endif // LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGFRAGMENTVISITOR_H
>> >
>> > Added:
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h?rev=301557&view=auto
>> >
>> > ==============================================================================
>> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h
>> > (added)
>> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h
>> > Thu Apr 27 11:12:16 2017
>> > @@ -0,0 +1,92 @@
>> > +//===- ModuleDebugLineFragment.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_MODULEDEBUGLINEFRAGMENT_H
>> > +#define LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGLINEFRAGMENT_H
>> > +
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFragment.h"
>> > +#include "llvm/Support/BinaryStreamArray.h"
>> > +#include "llvm/Support/BinaryStreamReader.h"
>> > +#include "llvm/Support/Error.h"
>> > +
>> > +namespace llvm {
>> > +namespace codeview {
>> > +
>> > +// Corresponds to the `CV_DebugSLinesHeader_t` structure.
>> > +struct LineFragmentHeader {
>> > + support::ulittle32_t RelocOffset; // Code offset of line
>> > contribution.
>> > + support::ulittle16_t RelocSegment; // Code segment of line
>> > contribution.
>> > + support::ulittle16_t Flags; // See LineFlags enumeration.
>> > + support::ulittle32_t CodeSize; // Code size of this line
>> > contribution.
>> > +};
>> > +
>> > +// Corresponds to the `CV_DebugSLinesFileBlockHeader_t` structure.
>> > +struct LineBlockFragmentHeader {
>> > + support::ulittle32_t NameIndex; // Index in DBI name buffer of
>> > filename.
>> > + support::ulittle32_t NumLines; // Number of lines
>> > + support::ulittle32_t BlockSize; // Code size of block, in bytes.
>> > + // The following two variable length arrays appear immediately after
>> > the
>> > + // header. The structure definitions follow.
>> > + // LineNumberEntry Lines[NumLines];
>> > + // ColumnNumberEntry Columns[NumLines];
>> > +};
>> > +
>> > +// Corresponds to `CV_Line_t` structure
>> > +struct LineNumberEntry {
>> > + support::ulittle32_t Offset; // Offset to start of code bytes for
>> > line number
>> > + support::ulittle32_t Flags; // Start:24, End:7, IsStatement:1
>> > +};
>> > +
>> > +// Corresponds to `CV_Column_t` structure
>> > +struct ColumnNumberEntry {
>> > + support::ulittle16_t StartColumn;
>> > + support::ulittle16_t EndColumn;
>> > +};
>> > +
>> > +struct LineColumnEntry {
>> > + support::ulittle32_t NameIndex;
>> > + FixedStreamArray<LineNumberEntry> LineNumbers;
>> > + FixedStreamArray<ColumnNumberEntry> Columns;
>> > +};
>> > +
>> > +class LineColumnExtractor {
>> > +public:
>> > + typedef const LineFragmentHeader ContextType;
>> > +
>> > + static Error extract(BinaryStreamRef Stream, uint32_t &Len,
>> > + LineColumnEntry &Item, const LineFragmentHeader
>> > *Header);
>> > +};
>> > +
>> > +class ModuleDebugLineFragment final : public ModuleDebugFragment {
>> > + friend class LineColumnExtractor;
>> > + typedef VarStreamArray<LineColumnEntry, LineColumnExtractor>
>> > LineInfoArray;
>> > + typedef LineInfoArray::Iterator Iterator;
>> > +
>> > +public:
>> > + ModuleDebugLineFragment();
>> > +
>> > + static bool classof(const ModuleDebugFragment *S) {
>> > + return S->kind() == ModuleDebugFragmentKind::Lines;
>> > + }
>> > +
>> > + Error initialize(BinaryStreamReader Reader);
>> > +
>> > + Iterator begin() const { return LinesAndColumns.begin(); }
>> > + Iterator end() const { return LinesAndColumns.end(); }
>> > +
>> > + const LineFragmentHeader *header() const { return Header; }
>> > +
>> > +private:
>> > + const LineFragmentHeader *Header = nullptr;
>> > + LineInfoArray LinesAndColumns;
>> > +};
>> > +}
>> > +}
>> > +
>> > +#endif
>> >
>> > Added:
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugUnknownFragment.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugUnknownFragment.h?rev=301557&view=auto
>> >
>> > ==============================================================================
>> > ---
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugUnknownFragment.h
>> > (added)
>> > +++
>> > llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugUnknownFragment.h Thu
>> > Apr 27 11:12:16 2017
>> > @@ -0,0 +1,32 @@
>> > +//===- ModuleDebugUnknownFragment.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_MODULEDEBUGUNKNOWNFRAGMENT_H
>> > +#define LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGUNKNOWNFRAGMENT_H
>> > +
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFragment.h"
>> > +#include "llvm/Support/BinaryStreamRef.h"
>> > +
>> > +namespace llvm {
>> > +namespace codeview {
>> > +
>> > +class ModuleDebugUnknownFragment final : public ModuleDebugFragment {
>> > +public:
>> > + ModuleDebugUnknownFragment(ModuleDebugFragmentKind Kind,
>> > BinaryStreamRef Data)
>> > + : ModuleDebugFragment(Kind), Data(Data) {}
>> > +
>> > + BinaryStreamRef getData() const { return Data; }
>> > +
>> > +private:
>> > + BinaryStreamRef Data;
>> > +};
>> > +}
>> > +}
>> > +
>> > +#endif
>> >
>> > Modified:
>> > llvm/trunk/include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h?rev=301557&r1=301556&r2=301557&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h
>> > (original)
>> > +++ llvm/trunk/include/llvm/DebugInfo/PDB/Native/ModuleDebugStream.h Thu
>> > Apr 27 11:12:16 2017
>> > @@ -12,7 +12,7 @@
>> >
>> > #include "llvm/ADT/iterator_range.h"
>> > #include "llvm/DebugInfo/CodeView/CVRecord.h"
>> > -#include "llvm/DebugInfo/CodeView/ModuleDebugFragment.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFragmentRecord.h"
>> > #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
>> > #include "llvm/DebugInfo/MSF/MappedBlockStream.h"
>> > #include "llvm/Support/BinaryStreamArray.h"
>> > @@ -25,6 +25,9 @@ class PDBFile;
>> > class DbiModuleDescriptor;
>> >
>> > class ModuleDebugStream {
>> > + typedef codeview::ModuleDebugFragmentArray::Iterator
>> > + LinesAndChecksumsIterator;
>> > +
>> > public:
>> > ModuleDebugStream(const DbiModuleDescriptor &Module,
>> > std::unique_ptr<msf::MappedBlockStream> Stream);
>> > @@ -37,8 +40,7 @@ public:
>> > iterator_range<codeview::CVSymbolArray::Iterator>
>> > symbols(bool *HadError) const;
>> >
>> > - iterator_range<codeview::ModuleDebugFragmentArray::Iterator>
>> > - lines(bool *HadError) const;
>> > + llvm::iterator_range<LinesAndChecksumsIterator> linesAndChecksums()
>> > const;
>> >
>> > bool hasLineInfo() const;
>> >
>> > @@ -56,7 +58,7 @@ private:
>> > BinaryStreamRef C13LinesSubstream;
>> > BinaryStreamRef GlobalRefsSubstream;
>> >
>> > - codeview::ModuleDebugFragmentArray LineInfo;
>> > + codeview::ModuleDebugFragmentArray LinesAndChecksums;
>> > };
>> > }
>> > }
>> >
>> > Modified: llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt?rev=301557&r1=301556&r2=301557&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt (original)
>> > +++ llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt Thu Apr 27 11:12:16
>> > 2017
>> > @@ -7,8 +7,12 @@ add_llvm_library(LLVMDebugInfoCodeView
>> > EnumTables.cpp
>> > Formatters.cpp
>> > Line.cpp
>> > + ModuleDebugFileChecksumFragment.cpp
>> > ModuleDebugFragment.cpp
>> > + ModuleDebugFragmentRecord.cpp
>> > ModuleDebugFragmentVisitor.cpp
>> > + ModuleDebugLineFragment.cpp
>> > + ModuleDebugUnknownFragment.cpp
>> > RecordSerialization.cpp
>> > SymbolRecordMapping.cpp
>> > SymbolDumper.cpp
>> >
>> > Added:
>> > llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.cpp?rev=301557&view=auto
>> >
>> > ==============================================================================
>> > ---
>> > llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.cpp
>> > (added)
>> > +++
>> > llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.cpp Thu
>> > Apr 27 11:12:16 2017
>> > @@ -0,0 +1,49 @@
>> > +//===- ModuleDebugFileChecksumFragment.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/ModuleDebugFileChecksumFragment.h"
>> > +
>> > +#include "llvm/DebugInfo/CodeView/CodeViewError.h"
>> > +#include "llvm/Support/BinaryStreamReader.h"
>> > +
>> > +using namespace llvm;
>> > +using namespace llvm::codeview;
>> > +
>> > +struct FileChecksumEntryHeader {
>> > + using ulittle32_t = support::ulittle32_t;
>> > +
>> > + ulittle32_t FileNameOffset; // Byte offset of filename in global
>> > string table.
>> > + uint8_t ChecksumSize; // Number of bytes of checksum.
>> > + uint8_t ChecksumKind; // FileChecksumKind
>> > + // Checksum bytes follow.
>> > +};
>> > +
>> > +Error llvm::VarStreamArrayExtractor<FileChecksumEntry>::extract(
>> > + BinaryStreamRef Stream, uint32_t &Len, FileChecksumEntry &Item,
>> > void *Ctx) {
>> > + BinaryStreamReader Reader(Stream);
>> > +
>> > + const FileChecksumEntryHeader *Header;
>> > + 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 = alignTo(Header->ChecksumSize + sizeof(FileChecksumEntryHeader),
>> > 4);
>> > + return Error::success();
>> > +}
>> > +
>> > +Error ModuleDebugFileChecksumFragment::initialize(BinaryStreamReader
>> > Reader) {
>> > + if (auto EC = Reader.readArray(Checksums, Reader.bytesRemaining()))
>> > + return EC;
>> > +
>> > + return Error::success();
>> > +}
>> >
>> > Modified: llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragment.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragment.cpp?rev=301557&r1=301556&r2=301557&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragment.cpp (original)
>> > +++ llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragment.cpp Thu Apr 27
>> > 11:12:16 2017
>> > @@ -1,5 +1,4 @@
>> > -//===- ModuleDebugFragment.cpp --------------------------------------*-
>> > C++
>> > -//-*-===//
>> > +//===- ModuleDebugFragment.cpp -----------------------------------*-
>> > C++-*-===//
>> > //
>> > // The LLVM Compiler Infrastructure
>> > //
>> > @@ -10,37 +9,6 @@
>> >
>> > #include "llvm/DebugInfo/CodeView/ModuleDebugFragment.h"
>> >
>> > -#include "llvm/Support/BinaryStreamReader.h"
>> > -
>> > -using namespace llvm;
>> > using namespace llvm::codeview;
>> >
>> > -ModuleDebugFragment::ModuleDebugFragment()
>> > - : Kind(ModuleDebugFragmentKind::None) {}
>> > -
>> > -ModuleDebugFragment::ModuleDebugFragment(ModuleDebugFragmentKind Kind,
>> > - BinaryStreamRef Data)
>> > - : Kind(Kind), Data(Data) {}
>> > -
>> > -Error ModuleDebugFragment::initialize(BinaryStreamRef Stream,
>> > - ModuleDebugFragment &Info) {
>> > - const ModuleDebugFragmentHeader *Header;
>> > - BinaryStreamReader Reader(Stream);
>> > - if (auto EC = Reader.readObject(Header))
>> > - return EC;
>> > -
>> > - ModuleDebugFragmentKind Kind =
>> > - static_cast<ModuleDebugFragmentKind>(uint32_t(Header->Kind));
>> > - if (auto EC = Reader.readStreamRef(Info.Data, Header->Length))
>> > - return EC;
>> > - Info.Kind = Kind;
>> > - return Error::success();
>> > -}
>> > -
>> > -uint32_t ModuleDebugFragment::getRecordLength() const {
>> > - return sizeof(ModuleDebugFragmentHeader) + Data.getLength();
>> > -}
>> > -
>> > -ModuleDebugFragmentKind ModuleDebugFragment::kind() const { return
>> > Kind; }
>> > -
>> > -BinaryStreamRef ModuleDebugFragment::getRecordData() const { return
>> > Data; }
>> > +ModuleDebugFragment::~ModuleDebugFragment() {}
>> >
>> > Added: llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentRecord.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentRecord.cpp?rev=301557&view=auto
>> >
>> > ==============================================================================
>> > --- llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentRecord.cpp
>> > (added)
>> > +++ llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentRecord.cpp Thu
>> > Apr 27 11:12:16 2017
>> > @@ -0,0 +1,47 @@
>> > +//===- ModuleDebugFragmentRecord.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/ModuleDebugFragmentRecord.h"
>> > +
>> > +#include "llvm/Support/BinaryStreamReader.h"
>> > +
>> > +using namespace llvm;
>> > +using namespace llvm::codeview;
>> > +
>> > +ModuleDebugFragmentRecord::ModuleDebugFragmentRecord()
>> > + : Kind(ModuleDebugFragmentKind::None) {}
>> > +
>> > +ModuleDebugFragmentRecord::ModuleDebugFragmentRecord(
>> > + ModuleDebugFragmentKind Kind, BinaryStreamRef Data)
>> > + : Kind(Kind), Data(Data) {}
>> > +
>> > +Error ModuleDebugFragmentRecord::initialize(BinaryStreamRef Stream,
>> > + ModuleDebugFragmentRecord
>> > &Info) {
>> > + const ModuleDebugFragmentHeader *Header;
>> > + BinaryStreamReader Reader(Stream);
>> > + if (auto EC = Reader.readObject(Header))
>> > + return EC;
>> > +
>> > + ModuleDebugFragmentKind Kind =
>> > + static_cast<ModuleDebugFragmentKind>(uint32_t(Header->Kind));
>> > + if (auto EC = Reader.readStreamRef(Info.Data, Header->Length))
>> > + return EC;
>> > + Info.Kind = Kind;
>> > + return Error::success();
>> > +}
>> > +
>> > +uint32_t ModuleDebugFragmentRecord::getRecordLength() const {
>> > + return sizeof(ModuleDebugFragmentHeader) + Data.getLength();
>> > +}
>> > +
>> > +ModuleDebugFragmentKind ModuleDebugFragmentRecord::kind() const {
>> > return Kind; }
>> > +
>> > +BinaryStreamRef ModuleDebugFragmentRecord::getRecordData() const {
>> > + return Data;
>> > +}
>> >
>> > Modified:
>> > llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentVisitor.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentVisitor.cpp?rev=301557&r1=301556&r2=301557&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentVisitor.cpp
>> > (original)
>> > +++ llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentVisitor.cpp Thu
>> > Apr 27 11:12:16 2017
>> > @@ -8,99 +8,36 @@
>> >
>> > //===----------------------------------------------------------------------===//
>> >
>> > #include "llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h"
>> > +
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
>> > #include "llvm/Support/BinaryStreamReader.h"
>> > #include "llvm/Support/BinaryStreamRef.h"
>> >
>> > using namespace llvm;
>> > using namespace llvm::codeview;
>> >
>> > -Error ModuleDebugFragmentVisitor::visitSymbols(BinaryStreamRef Data) {
>> > - return visitUnknown(ModuleDebugFragmentKind::Symbols, Data);
>> > -}
>> > -Error ModuleDebugFragmentVisitor::visitLines(BinaryStreamRef Data,
>> > - const LineFragmentHeader
>> > *Header,
>> > - const LineInfoArray
>> > &Lines) {
>> > - return visitUnknown(ModuleDebugFragmentKind::Lines, Data);
>> > -}
>> > -Error ModuleDebugFragmentVisitor::visitStringTable(BinaryStreamRef
>> > Data) {
>> > - return visitUnknown(ModuleDebugFragmentKind::StringTable, Data);
>> > -}
>> > -Error ModuleDebugFragmentVisitor::visitFileChecksums(
>> > - BinaryStreamRef Data, const FileChecksumArray &Checksums) {
>> > - return visitUnknown(ModuleDebugFragmentKind::FileChecksums, Data);
>> > -}
>> > -Error ModuleDebugFragmentVisitor::visitFrameData(BinaryStreamRef Data)
>> > {
>> > - return visitUnknown(ModuleDebugFragmentKind::FrameData, Data);
>> > -}
>> > -Error ModuleDebugFragmentVisitor::visitInlineeLines(BinaryStreamRef
>> > Data) {
>> > - return visitUnknown(ModuleDebugFragmentKind::InlineeLines, Data);
>> > -}
>> > -Error
>> > ModuleDebugFragmentVisitor::visitCrossScopeImports(BinaryStreamRef Data) {
>> > - return visitUnknown(ModuleDebugFragmentKind::CrossScopeExports,
>> > Data);
>> > -}
>> > -Error
>> > ModuleDebugFragmentVisitor::visitCrossScopeExports(BinaryStreamRef Data) {
>> > - return visitUnknown(ModuleDebugFragmentKind::CrossScopeImports,
>> > Data);
>> > -}
>> > -Error ModuleDebugFragmentVisitor::visitILLines(BinaryStreamRef Data) {
>> > - return visitUnknown(ModuleDebugFragmentKind::ILLines, Data);
>> > -}
>> > -Error ModuleDebugFragmentVisitor::visitFuncMDTokenMap(BinaryStreamRef
>> > Data) {
>> > - return visitUnknown(ModuleDebugFragmentKind::FuncMDTokenMap, Data);
>> > -}
>> > -Error ModuleDebugFragmentVisitor::visitTypeMDTokenMap(BinaryStreamRef
>> > Data) {
>> > - return visitUnknown(ModuleDebugFragmentKind::TypeMDTokenMap, Data);
>> > -}
>> > -Error ModuleDebugFragmentVisitor::visitMergedAssemblyInput(
>> > - BinaryStreamRef Data) {
>> > - return visitUnknown(ModuleDebugFragmentKind::MergedAssemblyInput,
>> > Data);
>> > -}
>> > -Error ModuleDebugFragmentVisitor::visitCoffSymbolRVA(BinaryStreamRef
>> > Data) {
>> > - return visitUnknown(ModuleDebugFragmentKind::CoffSymbolRVA, Data);
>> > -}
>> > -
>> > -Error llvm::codeview::visitModuleDebugFragment(const
>> > ModuleDebugFragment &R,
>> > -
>> > ModuleDebugFragmentVisitor &V) {
>> > +Error llvm::codeview::visitModuleDebugFragment(
>> > + const ModuleDebugFragmentRecord &R, ModuleDebugFragmentVisitor &V)
>> > {
>> > + BinaryStreamReader Reader(R.getRecordData());
>> > switch (R.kind()) {
>> > - case ModuleDebugFragmentKind::Symbols:
>> > - return V.visitSymbols(R.getRecordData());
>> > case ModuleDebugFragmentKind::Lines: {
>> > - BinaryStreamReader Reader(R.getRecordData());
>> > - const LineFragmentHeader *Header;
>> > - if (auto EC = Reader.readObject(Header))
>> > + ModuleDebugLineFragment Fragment;
>> > + if (auto EC = Fragment.initialize(Reader))
>> > return EC;
>> > - LineInfoArray LineInfos;
>> > - if (auto EC = Reader.readArray(LineInfos, Reader.bytesRemaining(),
>> > Header))
>> > - return EC;
>> > - return V.visitLines(R.getRecordData(), Header, LineInfos);
>> > +
>> > + return V.visitLines(Fragment);
>> > }
>> > - case ModuleDebugFragmentKind::StringTable:
>> > - return V.visitStringTable(R.getRecordData());
>> > case ModuleDebugFragmentKind::FileChecksums: {
>> > - BinaryStreamReader Reader(R.getRecordData());
>> > - FileChecksumArray Checksums;
>> > - if (auto EC = Reader.readArray(Checksums, Reader.bytesRemaining()))
>> > + ModuleDebugFileChecksumFragment Fragment;
>> > + if (auto EC = Fragment.initialize(Reader))
>> > return EC;
>> > - return V.visitFileChecksums(R.getRecordData(), Checksums);
>> > +
>> > + return V.visitFileChecksums(Fragment);
>> > + }
>> > + default: {
>> > + ModuleDebugUnknownFragment Fragment(R.kind(), R.getRecordData());
>> > + return V.visitUnknown(Fragment);
>> > }
>> > - case ModuleDebugFragmentKind::FrameData:
>> > - return V.visitFrameData(R.getRecordData());
>> > - case ModuleDebugFragmentKind::InlineeLines:
>> > - return V.visitInlineeLines(R.getRecordData());
>> > - case ModuleDebugFragmentKind::CrossScopeImports:
>> > - return V.visitCrossScopeImports(R.getRecordData());
>> > - case ModuleDebugFragmentKind::CrossScopeExports:
>> > - return V.visitCrossScopeExports(R.getRecordData());
>> > - case ModuleDebugFragmentKind::ILLines:
>> > - return V.visitILLines(R.getRecordData());
>> > - case ModuleDebugFragmentKind::FuncMDTokenMap:
>> > - return V.visitFuncMDTokenMap(R.getRecordData());
>> > - case ModuleDebugFragmentKind::TypeMDTokenMap:
>> > - return V.visitTypeMDTokenMap(R.getRecordData());
>> > - case ModuleDebugFragmentKind::MergedAssemblyInput:
>> > - return V.visitMergedAssemblyInput(R.getRecordData());
>> > - case ModuleDebugFragmentKind::CoffSymbolRVA:
>> > - return V.visitCoffSymbolRVA(R.getRecordData());
>> > - default:
>> > - return V.visitUnknown(R.kind(), R.getRecordData());
>> > }
>> > }
>> >
>> > Added: llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugLineFragment.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugLineFragment.cpp?rev=301557&view=auto
>> >
>> > ==============================================================================
>> > --- llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugLineFragment.cpp
>> > (added)
>> > +++ llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugLineFragment.cpp Thu
>> > Apr 27 11:12:16 2017
>> > @@ -0,0 +1,63 @@
>> > +//===- ModuleDebugLineFragment.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/ModuleDebugLineFragment.h"
>> > +
>> > +#include "llvm/DebugInfo/CodeView/CodeViewError.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFragmentRecord.h"
>> > +
>> > +using namespace llvm;
>> > +using namespace llvm::codeview;
>> > +
>> > +Error LineColumnExtractor::extract(BinaryStreamRef Stream, uint32_t
>> > &Len,
>> > + LineColumnEntry &Item,
>> > + const LineFragmentHeader *Header) {
>> > + using namespace codeview;
>> > + const LineBlockFragmentHeader *BlockHeader;
>> > + BinaryStreamReader Reader(Stream);
>> > + if (auto EC = Reader.readObject(BlockHeader))
>> > + return EC;
>> > + bool HasColumn = Header->Flags & uint32_t(LineFlags::HaveColumns);
>> > + uint32_t LineInfoSize =
>> > + BlockHeader->NumLines *
>> > + (sizeof(LineNumberEntry) + (HasColumn ? sizeof(ColumnNumberEntry)
>> > : 0));
>> > + if (BlockHeader->BlockSize < sizeof(LineBlockFragmentHeader))
>> > + return make_error<CodeViewError>(cv_error_code::corrupt_record,
>> > + "Invalid line block record size");
>> > + uint32_t Size = BlockHeader->BlockSize -
>> > sizeof(LineBlockFragmentHeader);
>> > + 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
>> > + // LineBlockFragmentHeader.
>> > + 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();
>> > +}
>> > +
>> > +ModuleDebugLineFragment::ModuleDebugLineFragment()
>> > + : ModuleDebugFragment(ModuleDebugFragmentKind::Lines) {}
>> > +
>> > +Error ModuleDebugLineFragment::initialize(BinaryStreamReader Reader) {
>> > + if (auto EC = Reader.readObject(Header))
>> > + return EC;
>> > +
>> > + if (auto EC =
>> > + Reader.readArray(LinesAndColumns, Reader.bytesRemaining(),
>> > Header))
>> > + return EC;
>> > +
>> > + return Error::success();
>> > +}
>> >
>> > Added: llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugUnknownFragment.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugUnknownFragment.cpp?rev=301557&view=auto
>> >
>> > ==============================================================================
>> > --- llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugUnknownFragment.cpp
>> > (added)
>> > +++ llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugUnknownFragment.cpp Thu
>> > Apr 27 11:12:16 2017
>> > @@ -0,0 +1,10 @@
>> > +//===- ModuleDebugUnknownFragment.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/ModuleDebugUnknownFragment.h"
>> > \ No newline at end of file
>>
>> This file was commit with no newline, but more importantly, why is
>> this file needed at all? It's generating diagnostics with link.exe
>> because the resulting object file contains no previously undefined
>> public symbols.
>>
>> ~Aaron
>>
>> >
>> > Modified: llvm/trunk/lib/DebugInfo/PDB/Native/ModuleDebugStream.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Native/ModuleDebugStream.cpp?rev=301557&r1=301556&r2=301557&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/lib/DebugInfo/PDB/Native/ModuleDebugStream.cpp (original)
>> > +++ llvm/trunk/lib/DebugInfo/PDB/Native/ModuleDebugStream.cpp Thu Apr 27
>> > 11:12:16 2017
>> > @@ -21,6 +21,7 @@
>> > #include <cstdint>
>> >
>> > using namespace llvm;
>> > +using namespace llvm::codeview;
>> > using namespace llvm::msf;
>> > using namespace llvm::pdb;
>> >
>> > @@ -54,7 +55,8 @@ Error ModuleDebugStream::reload() {
>> > return EC;
>> >
>> > BinaryStreamReader LineReader(C13LinesSubstream);
>> > - if (auto EC = LineReader.readArray(LineInfo,
>> > LineReader.bytesRemaining()))
>> > + if (auto EC =
>> > + LineReader.readArray(LinesAndChecksums,
>> > LineReader.bytesRemaining()))
>> > return EC;
>> >
>> > uint32_t GlobalRefsSize;
>> > @@ -77,13 +79,13 @@ ModuleDebugStream::symbols(bool *HadErro
>> > return make_range(SymbolsSubstream.begin(HadError),
>> > SymbolsSubstream.end());
>> > }
>> >
>> > -iterator_range<codeview::ModuleDebugFragmentArray::Iterator>
>> > -ModuleDebugStream::lines(bool *HadError) const {
>> > - return make_range(LineInfo.begin(HadError), LineInfo.end());
>> > +llvm::iterator_range<ModuleDebugStream::LinesAndChecksumsIterator>
>> > +ModuleDebugStream::linesAndChecksums() const {
>> > + return make_range(LinesAndChecksums.begin(),
>> > LinesAndChecksums.end());
>> > }
>> >
>> > bool ModuleDebugStream::hasLineInfo() const {
>> > - return C13LinesSubstream.getLength() > 0 ||
>> > LinesSubstream.getLength() > 0;
>> > + return C13LinesSubstream.getLength() > 0;
>> > }
>> >
>> > Error ModuleDebugStream::commit() { return Error::success(); }
>> >
>> > Modified: llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp?rev=301557&r1=301556&r2=301557&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp (original)
>> > +++ llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp Thu Apr 27
>> > 11:12:16 2017
>> > @@ -16,7 +16,10 @@
>> > #include "llvm/DebugInfo/CodeView/CVTypeDumper.h"
>> > #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
>> > #include "llvm/DebugInfo/CodeView/EnumTables.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
>> > #include "llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugUnknownFragment.h"
>> > #include "llvm/DebugInfo/CodeView/SymbolDumper.h"
>> > #include "llvm/DebugInfo/CodeView/TypeDatabaseVisitor.h"
>> > #include "llvm/DebugInfo/CodeView/TypeDeserializer.h"
>> > @@ -633,17 +636,15 @@ Error LLVMOutputStyle::dumpDbiStream() {
>> > }
>> > if (opts::raw::DumpLineInfo) {
>> > ListScope SS(P, "LineInfo");
>> > - bool HadError = false;
>> > // Define a locally scoped visitor to print the different
>> > // substream types types.
>> > class RecordVisitor : public
>> > codeview::ModuleDebugFragmentVisitor {
>> > public:
>> > RecordVisitor(ScopedPrinter &P, PDBFile &F) : P(P), F(F) {}
>> > - Error visitUnknown(ModuleDebugFragmentKind Kind,
>> > - BinaryStreamRef Stream) override {
>> > + Error visitUnknown(ModuleDebugUnknownFragment &Fragment)
>> > override {
>> > DictScope DD(P, "Unknown");
>> > ArrayRef<uint8_t> Data;
>> > - BinaryStreamReader R(Stream);
>> > + BinaryStreamReader R(Fragment.getData());
>> > if (auto EC = R.readBytes(Data, R.bytesRemaining())) {
>> > return make_error<RawError>(
>> > raw_error_code::corrupt_file,
>> > @@ -652,9 +653,8 @@ Error LLVMOutputStyle::dumpDbiStream() {
>> > P.printBinaryBlock("Data", Data);
>> > return Error::success();
>> > }
>> > - Error
>> > - visitFileChecksums(BinaryStreamRef Data,
>> > - const FileChecksumArray &Checksums)
>> > override {
>> > + Error visitFileChecksums(
>> > + ModuleDebugFileChecksumFragment &Checksums) override {
>> > DictScope DD(P, "FileChecksums");
>> > for (const auto &C : Checksums) {
>> > DictScope DDD(P, "Checksum");
>> > @@ -669,9 +669,7 @@ Error LLVMOutputStyle::dumpDbiStream() {
>> > return Error::success();
>> > }
>> >
>> > - Error visitLines(BinaryStreamRef Data,
>> > - const LineFragmentHeader *Header,
>> > - const LineInfoArray &Lines) override {
>> > + Error visitLines(ModuleDebugLineFragment &Lines) override {
>> > DictScope DD(P, "Lines");
>> > for (const auto &L : Lines) {
>> > if (auto Result = getFileNameForOffset2(L.NameIndex))
>> > @@ -720,7 +718,7 @@ Error LLVMOutputStyle::dumpDbiStream() {
>> > };
>> >
>> > RecordVisitor V(P, File);
>> > - for (const auto &L : ModS.lines(&HadError)) {
>> > + for (const auto &L : ModS.linesAndChecksums()) {
>> > if (auto EC = codeview::visitModuleDebugFragment(L, V))
>> > return EC;
>> > }
>> >
>> > Modified: llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp?rev=301557&r1=301556&r2=301557&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp (original)
>> > +++ llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp Thu Apr 27
>> > 11:12:16 2017
>> > @@ -13,8 +13,11 @@
>> > #include "llvm-pdbdump.h"
>> >
>> > #include "llvm/DebugInfo/CodeView/Line.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
>> > #include "llvm/DebugInfo/CodeView/ModuleDebugFragment.h"
>> > #include "llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugUnknownFragment.h"
>> > #include "llvm/DebugInfo/MSF/MappedBlockStream.h"
>> > #include "llvm/DebugInfo/PDB/Native/DbiStream.h"
>> > #include "llvm/DebugInfo/PDB/Native/InfoStream.h"
>> > @@ -24,6 +27,7 @@
>> > #include "llvm/DebugInfo/PDB/Native/TpiStream.h"
>> >
>> > using namespace llvm;
>> > +using namespace llvm::codeview;
>> > using namespace llvm::pdb;
>> >
>> > YAMLOutputStyle::YAMLOutputStyle(PDBFile &File)
>> > @@ -75,19 +79,17 @@ Error YAMLOutputStyle::dump() {
>> > }
>> >
>> > namespace {
>> > -class C13SubstreamVisitor : public codeview::ModuleDebugFragmentVisitor
>> > {
>> > +class C13SubstreamVisitor : public ModuleDebugFragmentVisitor {
>> > public:
>> > C13SubstreamVisitor(llvm::pdb::yaml::PdbSourceFileInfo &Info, PDBFile
>> > &F)
>> > : Info(Info), F(F) {}
>> >
>> > - Error visitUnknown(codeview::ModuleDebugFragmentKind Kind,
>> > - BinaryStreamRef Stream) override {
>> > + Error visitUnknown(ModuleDebugUnknownFragment &Fragment) override {
>> > return Error::success();
>> > }
>> >
>> > Error
>> > - visitFileChecksums(BinaryStreamRef Data,
>> > - const codeview::FileChecksumArray &Checksums)
>> > override {
>> > + visitFileChecksums(ModuleDebugFileChecksumFragment &Checksums)
>> > override {
>> > for (const auto &C : Checksums) {
>> > llvm::pdb::yaml::PdbSourceFileChecksumEntry Entry;
>> > if (auto Result = getGlobalString(C.FileNameOffset))
>> > @@ -102,15 +104,13 @@ public:
>> > return Error::success();
>> > }
>> >
>> > - Error visitLines(BinaryStreamRef Data,
>> > - const codeview::LineFragmentHeader *Header,
>> > - const codeview::LineInfoArray &Lines) override {
>> > + Error visitLines(ModuleDebugLineFragment &Lines) override {
>> >
>> > - Info.Lines.CodeSize = Header->CodeSize;
>> > + Info.Lines.CodeSize = Lines.header()->CodeSize;
>> > Info.Lines.Flags =
>> > - static_cast<codeview::LineFlags>(uint16_t(Header->Flags));
>> > - Info.Lines.RelocOffset = Header->RelocOffset;
>> > - Info.Lines.RelocSegment = Header->RelocSegment;
>> > +
>> > static_cast<codeview::LineFlags>(uint16_t(Lines.header()->Flags));
>> > + Info.Lines.RelocOffset = Lines.header()->RelocOffset;
>> > + Info.Lines.RelocSegment = Lines.header()->RelocSegment;
>> >
>> > for (const auto &L : Lines) {
>> > llvm::pdb::yaml::PdbSourceLineBlock Block;
>> > @@ -170,9 +170,8 @@ YAMLOutputStyle::getFileLineInfo(const p
>> > return None;
>> >
>> > yaml::PdbSourceFileInfo Info;
>> > - bool Error = false;
>> > C13SubstreamVisitor Visitor(Info, File);
>> > - for (auto &Frag : ModS.lines(&Error)) {
>> > + for (auto &Frag : ModS.linesAndChecksums()) {
>> > if (auto E = codeview::visitModuleDebugFragment(Frag, Visitor))
>> > return std::move(E);
>> > }
>> >
>> > Modified: llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
>> > URL:
>> > http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/COFFDumper.cpp?rev=301557&r1=301556&r2=301557&view=diff
>> >
>> > ==============================================================================
>> > --- llvm/trunk/tools/llvm-readobj/COFFDumper.cpp (original)
>> > +++ llvm/trunk/tools/llvm-readobj/COFFDumper.cpp Thu Apr 27 11:12:16
>> > 2017
>> > @@ -25,6 +25,7 @@
>> > #include "llvm/DebugInfo/CodeView/CVTypeDumper.h"
>> > #include "llvm/DebugInfo/CodeView/CodeView.h"
>> > #include "llvm/DebugInfo/CodeView/Line.h"
>> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
>> > #include "llvm/DebugInfo/CodeView/RecordSerialization.h"
>> > #include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
>> > #include "llvm/DebugInfo/CodeView/SymbolDumpDelegate.h"
>> > @@ -985,29 +986,22 @@ void COFFDumper::printCodeViewSymbolsSub
>> > void COFFDumper::printCodeViewFileChecksums(StringRef Subsection) {
>> > BinaryByteStream S(Subsection, llvm::support::little);
>> > BinaryStreamReader SR(S);
>> > - while (!SR.empty()) {
>> > + ModuleDebugFileChecksumFragment Checksums;
>> > + error(Checksums.initialize(SR));
>> > +
>> > + for (auto &FC : Checksums) {
>> > DictScope S(W, "FileChecksum");
>> > - const FileChecksum *FC;
>> > - error(SR.readObject(FC));
>> > - if (FC->FileNameOffset >= CVStringTable.size())
>> > +
>> > + if (FC.FileNameOffset >= CVStringTable.size())
>> > error(object_error::parse_failed);
>> > StringRef Filename =
>> > - CVStringTable.drop_front(FC->FileNameOffset).split('\0').first;
>> > - W.printHex("Filename", Filename, FC->FileNameOffset);
>> > - W.printHex("ChecksumSize", FC->ChecksumSize);
>> > - W.printEnum("ChecksumKind", uint8_t(FC->ChecksumKind),
>> > + CVStringTable.drop_front(FC.FileNameOffset).split('\0').first;
>> > + W.printHex("Filename", Filename, FC.FileNameOffset);
>> > + W.printHex("ChecksumSize", FC.Checksum.size());
>> > + W.printEnum("ChecksumKind", uint8_t(FC.Kind),
>> > makeArrayRef(FileChecksumKindNames));
>> > - if (FC->ChecksumSize >= SR.bytesRemaining())
>> > - error(object_error::parse_failed);
>> > - ArrayRef<uint8_t> ChecksumBytes;
>> > - error(SR.readBytes(ChecksumBytes, FC->ChecksumSize));
>> > - W.printBinary("ChecksumBytes", ChecksumBytes);
>> > - unsigned PaddedSize = alignTo(FC->ChecksumSize +
>> > sizeof(FileChecksum), 4) -
>> > - sizeof(FileChecksum);
>> > - PaddedSize -= ChecksumBytes.size();
>> > - if (PaddedSize > SR.bytesRemaining())
>> > - error(object_error::parse_failed);
>> > - error(SR.skip(PaddedSize));
>> > +
>> > + W.printBinary("ChecksumBytes", FC.Checksum);
>> > }
>> > }
>> >
>> >
>> >
>> > _______________________________________________
>> > llvm-commits mailing list
>> > llvm-commits at lists.llvm.org
>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list