[llvm] r301936 - [PDB/CodeView] Read/write codeview inlinee line information.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Tue May 2 18:12:53 PDT 2017


Gah, 30 seconds after i left.  I won't be able to look at this until
tomorrow unfortunately

On Tue, May 2, 2017 at 6:10 PM Evgenii Stepanov <eugeni.stepanov at gmail.com>
wrote:

> Hi,
>
> ASan claims a use-after-return caused by this change:
>
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/4636/steps/check-llvm%20asan/logs/stdio
>
> READ of size 4 at 0x7fd4a3a03d8c thread T0
>     #0 0x6f26b4 in hasExtraFiles
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.cpp:53:10
>     #1 0x6f26b4 in
>
> llvm::VarStreamArrayExtractor<llvm::codeview::InlineeSourceLine>::extract(llvm::BinaryStreamRef,
> unsigned int&, llvm::codeview::InlineeSourceLine&,
> llvm::codeview::ModuleDebugInlineeLineFragmentRef*)
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.cpp:26
>     #2 0x6430f4 in
> llvm::VarStreamArrayIterator<llvm::codeview::InlineeSourceLine,
> llvm::VarStreamArrayExtractor<llvm::codeview::InlineeSourceLine>
>
> >::VarStreamArrayIterator(llvm::VarStreamArray<llvm::codeview::InlineeSourceLine,
> llvm::VarStreamArrayExtractor<llvm::codeview::InlineeSourceLine> >
> const&, llvm::codeview::ModuleDebugInlineeLineFragmentRef*,
> llvm::BinaryStreamRef, bool*)
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/include/llvm/Support/BinaryStreamArray.h:137:17
>     #3 0x63ed91 in VarStreamArrayIterator
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/include/llvm/Support/BinaryStreamArray.h:147:9
>     #4 0x63ed91 in begin
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/include/llvm/Support/BinaryStreamArray.h:99
>     #5 0x63ed91 in begin
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/include/llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h:67
>     #6 0x63ed91 in (anonymous
> namespace)::C13RawVisitor::handleInlineeLines()
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp:157
>     #7 0x591ac0 in llvm::pdb::C13DebugFragmentVisitor::finished()
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp:62:17
>     #8 0x638308 in llvm::Error
>
> llvm::codeview::visitModuleDebugFragments<llvm::iterator_range<llvm::VarStreamArrayIterator<llvm::codeview::ModuleDebugFragmentRecord,
> llvm::VarStreamArrayExtractor<llvm::codeview::ModuleDebugFragmentRecord>
> > >
> >(llvm::iterator_range<llvm::VarStreamArrayIterator<llvm::codeview::ModuleDebugFragmentRecord,
> llvm::VarStreamArrayExtractor<llvm::codeview::ModuleDebugFragmentRecord>
> > >&&, llvm::codeview::ModuleDebugFragmentVisitor&)
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h:59:19
>     #9 0x62923e in llvm::pdb::LLVMOutputStyle::dumpDbiStream()
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp:806:25
>     #10 0x619926 in llvm::pdb::LLVMOutputStyle::dump()
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp:256:17
>     #11 0x5c0b50 in dumpRaw
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp:627:16
>     #12 0x5c0b50 in
> for_each<std::__1::__wrap_iter<std::__1::basic_string<char> *>, void
> (*)(llvm::StringRef)>
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/libcxx_build_asan/include/c++/v1/algorithm:879
>     #13 0x5c0b50 in main
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp:881
>     #14 0x7fd4a69ad82f in __libc_start_main
> (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
>     #15 0x47d2f8 in _start
>
> (/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_asan/bin/llvm-pdbdump+0x47d2f8)
>
> Address 0x7fd4a3a03d8c is located in stack of thread T0 at offset 396 in
> frame
>     #0 0x6f194f in
>
> llvm::codeview::visitModuleDebugFragment(llvm::codeview::ModuleDebugFragmentRecord
> const&, llvm::codeview::ModuleDebugFragmentVisitor&)
>
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/CodeView/ModuleDebugFragmentVisitor.cpp:24
>
>   This frame has 8 object(s):
>     [32, 64) 'Reader:25'
>     [96, 144) 'Fragment:28'
>     [176, 208) 'agg.tmp2'
>     [240, 280) 'Fragment7:35'
>     [320, 352) 'agg.tmp9'
>     [384, 424) 'Fragment24:42' <== Memory access at offset 396 is
> inside this variable
>     [464, 496) 'agg.tmp26'
>     [528, 560) 'Fragment40:48'
>
> On Tue, May 2, 2017 at 9:56 AM, Zachary Turner via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
> > Author: zturner
> > Date: Tue May  2 11:56:09 2017
> > New Revision: 301936
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=301936&view=rev
> > Log:
> > [PDB/CodeView] Read/write codeview inlinee line information.
> >
> > Previously we wrote line information and file checksum
> > information, but we did not write information about inlinee
> > lines and functions.  This patch adds support for that.
> >
> > Added:
> >
>  llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h
> >     llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.cpp
> > Modified:
> >     llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h
> >
>  llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h
> >
>  llvm/trunk/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h
> >     llvm/trunk/include/llvm/Support/BinaryStreamWriter.h
> >     llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
> >     llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt
> >     llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.cpp
> >     llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentRecord.cpp
> >     llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentVisitor.cpp
> >     llvm/trunk/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp
> >     llvm/trunk/test/DebugInfo/PDB/Inputs/simple-line-info.yaml
> >     llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml-lineinfo-write.test
> >     llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp
> >     llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.h
> >     llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp
> >     llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.h
> >     llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp
> >     llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp
> >     llvm/trunk/tools/llvm-pdbdump/PdbYaml.h
> >     llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
> >     llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.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=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/CodeView/Line.h Tue May  2
> 11:56:09 2017
> > @@ -127,20 +127,6 @@ public:
> >    bool isNeverStepInto() const { return LineInf.isNeverStepInto(); }
> >  };
> >
> > -enum class InlineeLinesSignature : uint32_t {
> > -  Normal,    // CV_INLINEE_SOURCE_LINE_SIGNATURE
> > -  ExtraFiles // CV_INLINEE_SOURCE_LINE_SIGNATURE_EX
> > -};
> > -
> > -struct InlineeSourceLine {
> > -  TypeIndex Inlinee;         // ID of the function that was inlined.
> > -  ulittle32_t FileID;        // Offset into FileChecksums subsection.
> > -  ulittle32_t SourceLineNum; // First line of inlined code.
> > -  // If extra files present:
> > -  //   ulittle32_t ExtraFileCount;
> > -  //   ulittle32_t Files[];
> > -};
> > -
> >  } // namespace codeview
> >  } // namespace llvm
> >
> >
> > 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=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > ---
> llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h
> (original)
> > +++
> llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h Tue
> May  2 11:56:09 2017
> > @@ -39,6 +39,10 @@ public:
> >      return Error::success();
> >    }
> >
> > +  virtual Error visitInlineeLines(ModuleDebugInlineeLineFragmentRef
> &Inlinees) {
> > +    return Error::success();
> > +  }
> > +
> >    virtual Error finished() { return Error::success(); }
> >  };
> >
> >
> > Added:
> llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h?rev=301936&view=auto
> >
> ==============================================================================
> > ---
> llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h
> (added)
> > +++
> llvm/trunk/include/llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h
> Tue May  2 11:56:09 2017
> > @@ -0,0 +1,103 @@
> > +//===- ModuleDebugInlineeLinesFragment.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_MODULEDEBUGINLINEELINESFRAGMENT_H
> > +#define LLVM_DEBUGINFO_CODEVIEW_MODULEDEBUGINLINEELINESFRAGMENT_H
> > +
> > +#include "llvm/DebugInfo/CodeView/Line.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 {
> > +
> > +class ModuleDebugInlineeLineFragmentRef;
> > +
> > +enum class InlineeLinesSignature : uint32_t {
> > +  Normal,    // CV_INLINEE_SOURCE_LINE_SIGNATURE
> > +  ExtraFiles // CV_INLINEE_SOURCE_LINE_SIGNATURE_EX
> > +};
> > +
> > +struct InlineeSourceLineHeader {
> > +  TypeIndex Inlinee;                  // ID of the function that was
> inlined.
> > +  support::ulittle32_t FileID;        // Offset into FileChecksums
> subsection.
> > +  support::ulittle32_t SourceLineNum; // First line of inlined code.
> > +                                      // If extra files present:
> > +                                      //   ulittle32_t ExtraFileCount;
> > +                                      //   ulittle32_t Files[];
> > +};
> > +
> > +struct InlineeSourceLine {
> > +  const InlineeSourceLineHeader *Header;
> > +  FixedStreamArray<support::ulittle32_t> ExtraFiles;
> > +};
> > +}
> > +
> > +template <> struct VarStreamArrayExtractor<codeview::InlineeSourceLine>
> {
> > +  typedef codeview::ModuleDebugInlineeLineFragmentRef ContextType;
> > +
> > +  static Error extract(BinaryStreamRef Stream, uint32_t &Len,
> > +                       codeview::InlineeSourceLine &Item,
> > +                       ContextType *Fragment);
> > +};
> > +
> > +namespace codeview {
> > +class ModuleDebugInlineeLineFragmentRef final : public
> ModuleDebugFragmentRef {
> > +  typedef VarStreamArray<InlineeSourceLine> LinesArray;
> > +  typedef LinesArray::Iterator Iterator;
> > +
> > +public:
> > +  ModuleDebugInlineeLineFragmentRef();
> > +
> > +  static bool classof(const ModuleDebugFragmentRef *S) {
> > +    return S->kind() == ModuleDebugFragmentKind::InlineeLines;
> > +  }
> > +
> > +  Error initialize(BinaryStreamReader Reader);
> > +  bool hasExtraFiles() const;
> > +
> > +  Iterator begin() const { return Lines.begin(); }
> > +  Iterator end() const { return Lines.end(); }
> > +
> > +private:
> > +  InlineeLinesSignature Signature;
> > +  VarStreamArray<InlineeSourceLine> Lines;
> > +};
> > +
> > +class ModuleDebugInlineeLineFragment final : public ModuleDebugFragment
> {
> > +public:
> > +  explicit ModuleDebugInlineeLineFragment(bool HasExtraFiles);
> > +
> > +  static bool classof(const ModuleDebugFragment *S) {
> > +    return S->kind() == ModuleDebugFragmentKind::InlineeLines;
> > +  }
> > +
> > +  Error commit(BinaryStreamWriter &Writer) override;
> > +  uint32_t calculateSerializedLength() override;
> > +
> > +  void addInlineSite(TypeIndex FuncId, uint32_t FileOffset,
> > +                     uint32_t SourceLine);
> > +  void addExtraFile(uint32_t FileOffset);
> > +
> > +private:
> > +  bool HasExtraFiles = false;
> > +  uint32_t ExtraFileCount = 0;
> > +
> > +  struct Entry {
> > +    std::vector<support::ulittle32_t> ExtraFiles;
> > +    InlineeSourceLineHeader Header;
> > +  };
> > +  std::vector<Entry> Entries;
> > +};
> > +}
> > +}
> > +
> > +#endif
> >
> > Modified:
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > ---
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h
> (original)
> > +++
> llvm/trunk/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h
> Tue May  2 11:56:09 2017
> > @@ -12,6 +12,7 @@
> >
> >  #include "llvm/ADT/StringRef.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
> > +#include "llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
> >  #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
> >  #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
> > @@ -48,8 +49,9 @@ public:
> >    void setObjFileName(StringRef Name);
> >    void addSymbol(codeview::CVSymbol Symbol);
> >
> > -  void
> > -  addC13LineFragment(std::unique_ptr<codeview::ModuleDebugLineFragment>
> Lines);
> > +  void
> addC13Fragment(std::unique_ptr<codeview::ModuleDebugLineFragment> Lines);
> > +  void addC13Fragment(
> > +      std::unique_ptr<codeview::ModuleDebugInlineeLineFragment>
> Inlinees);
> >    void setC13FileChecksums(
> >        std::unique_ptr<codeview::ModuleDebugFileChecksumFragment>
> Checksums);
> >
> > @@ -80,8 +82,11 @@ private:
> >    std::string ObjFileName;
> >    std::vector<std::string> SourceFiles;
> >    std::vector<codeview::CVSymbol> Symbols;
> > -  std::vector<std::unique_ptr<codeview::ModuleDebugLineFragment>>
> LineInfo;
> > +
> >    std::unique_ptr<codeview::ModuleDebugFileChecksumFragment>
> ChecksumInfo;
> > +  std::vector<std::unique_ptr<codeview::ModuleDebugLineFragment>>
> LineInfo;
> > +  std::vector<std::unique_ptr<codeview::ModuleDebugInlineeLineFragment>>
> > +      Inlinees;
> >
> >
> std::vector<std::unique_ptr<codeview::ModuleDebugFragmentRecordBuilder>>
> >        C13Builders;
> >
> > Modified: llvm/trunk/include/llvm/Support/BinaryStreamWriter.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/BinaryStreamWriter.h?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Support/BinaryStreamWriter.h (original)
> > +++ llvm/trunk/include/llvm/Support/BinaryStreamWriter.h Tue May  2
> 11:56:09 2017
> > @@ -30,6 +30,8 @@ namespace llvm {
> >  /// although no methods are overridable.
> >  class BinaryStreamWriter {
> >  public:
> > +  // FIXME: We should be able to slice and drop_front etc on Writers /
> Readers.
> > +
> >    BinaryStreamWriter() = default;
> >    explicit BinaryStreamWriter(WritableBinaryStreamRef Stream);
> >    virtual ~BinaryStreamWriter() {}
> >
> > Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp Tue May  2
> 11:56:09 2017
> > @@ -17,6 +17,7 @@
> >  #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
> >  #include "llvm/DebugInfo/CodeView/CodeView.h"
> >  #include "llvm/DebugInfo/CodeView/Line.h"
> > +#include "llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h"
> >  #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
> >  #include "llvm/DebugInfo/CodeView/TypeDatabase.h"
> >  #include "llvm/DebugInfo/CodeView/TypeDumpVisitor.h"
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt Tue May  2 11:56:09
> 2017
> > @@ -11,6 +11,7 @@ add_llvm_library(LLVMDebugInfoCodeView
> >    ModuleDebugFragment.cpp
> >    ModuleDebugFragmentRecord.cpp
> >    ModuleDebugFragmentVisitor.cpp
> > +  ModuleDebugInlineeLinesFragment.cpp
> >    ModuleDebugLineFragment.cpp
> >    ModuleDebugUnknownFragment.cpp
> >    RecordSerialization.cpp
> >
> > Modified:
> llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > ---
> llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.cpp
> (original)
> > +++
> llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.cpp Tue
> May  2 11:56:09 2017
> > @@ -68,7 +68,10 @@ void ModuleDebugFileChecksumFragment::ad
> >    // This maps the offset of this string in the string table to the
> offset
> >    // of this checksum entry in the checksum buffer.
> >    OffsetMap[StringTableOffset] = SerializedSize;
> > -  SerializedSize += sizeof(FileChecksumEntryHeader) + Bytes.size();
> > +  assert(SerializedSize % 4 == 0);
> > +
> > +  uint32_t Len = alignTo(sizeof(FileChecksumEntryHeader) +
> Bytes.size(), 4);
> > +  SerializedSize += Len;
> >  }
> >
> >  uint32_t ModuleDebugFileChecksumFragment::calculateSerializedLength() {
> > @@ -85,6 +88,8 @@ Error ModuleDebugFileChecksumFragment::c
> >        return EC;
> >      if (auto EC = Writer.writeArray(makeArrayRef(FC.Checksum)))
> >        return EC;
> > +    if (auto EC = Writer.padToAlignment(4))
> > +      return EC;
> >    }
> >    return Error::success();
> >  }
> >
> > Modified: llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentRecord.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentRecord.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentRecord.cpp
> (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentRecord.cpp Tue
> May  2 11:56:09 2017
> > @@ -34,6 +34,7 @@ Error ModuleDebugFragmentRecord::initial
> >    switch (Kind) {
> >    case ModuleDebugFragmentKind::FileChecksums:
> >    case ModuleDebugFragmentKind::Lines:
> > +  case ModuleDebugFragmentKind::InlineeLines:
> >      break;
> >    default:
> >      llvm_unreachable("Unexpected debug fragment kind!");
> >
> > Modified:
> llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentVisitor.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentVisitor.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentVisitor.cpp
> (original)
> > +++ llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugFragmentVisitor.cpp Tue
> May  2 11:56:09 2017
> > @@ -11,6 +11,7 @@
> >
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugFragmentRecord.h"
> > +#include "llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugUnknownFragment.h"
> >  #include "llvm/Support/BinaryStreamReader.h"
> > @@ -37,6 +38,12 @@ Error llvm::codeview::visitModuleDebugFr
> >
> >      return V.visitFileChecksums(Fragment);
> >    }
> > +  case ModuleDebugFragmentKind::InlineeLines: {
> > +    ModuleDebugInlineeLineFragmentRef Fragment;
> > +    if (auto EC = Fragment.initialize(Reader))
> > +      return EC;
> > +    return V.visitInlineeLines(Fragment);
> > +  }
> >    default: {
> >      ModuleDebugUnknownFragmentRef Fragment(R.kind(), R.getRecordData());
> >      return V.visitUnknown(Fragment);
> >
> > Added:
> llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.cpp?rev=301936&view=auto
> >
> ==============================================================================
> > ---
> llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.cpp
> (added)
> > +++
> llvm/trunk/lib/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.cpp Tue
> May  2 11:56:09 2017
> > @@ -0,0 +1,116 @@
> > +//===- ModuleDebugInlineeLineFragment.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/ModuleDebugInlineeLinesFragment.h"
> > +
> > +#include "llvm/DebugInfo/CodeView/CodeViewError.h"
> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFragmentRecord.h"
> > +
> > +using namespace llvm;
> > +using namespace llvm::codeview;
> > +
> > +Error VarStreamArrayExtractor<InlineeSourceLine>::extract(
> > +    BinaryStreamRef Stream, uint32_t &Len, InlineeSourceLine &Item,
> > +    ContextType *Fragment) {
> > +  BinaryStreamReader Reader(Stream);
> > +
> > +  if (auto EC = Reader.readObject(Item.Header))
> > +    return EC;
> > +
> > +  if (Fragment->hasExtraFiles()) {
> > +    uint32_t ExtraFileCount;
> > +    if (auto EC = Reader.readInteger(ExtraFileCount))
> > +      return EC;
> > +    if (auto EC = Reader.readArray(Item.ExtraFiles, ExtraFileCount))
> > +      return EC;
> > +  }
> > +
> > +  Len = Reader.getOffset();
> > +  return Error::success();
> > +}
> > +
> > +ModuleDebugInlineeLineFragmentRef::ModuleDebugInlineeLineFragmentRef()
> > +    : ModuleDebugFragmentRef(ModuleDebugFragmentKind::InlineeLines) {}
> > +
> > +Error ModuleDebugInlineeLineFragmentRef::initialize(BinaryStreamReader
> Reader) {
> > +  if (auto EC = Reader.readEnum(Signature))
> > +    return EC;
> > +
> > +  if (auto EC = Reader.readArray(Lines, Reader.bytesRemaining(), this))
> > +    return EC;
> > +
> > +  assert(Reader.bytesRemaining() == 0);
> > +  return Error::success();
> > +}
> > +
> > +bool ModuleDebugInlineeLineFragmentRef::hasExtraFiles() const {
> > +  return Signature == InlineeLinesSignature::ExtraFiles;
> > +}
> > +
> > +ModuleDebugInlineeLineFragment::ModuleDebugInlineeLineFragment(
> > +    bool HasExtraFiles)
> > +    : ModuleDebugFragment(ModuleDebugFragmentKind::InlineeLines),
> > +      HasExtraFiles(HasExtraFiles) {}
> > +
> > +uint32_t ModuleDebugInlineeLineFragment::calculateSerializedLength() {
> > +  // 4 bytes for the signature
> > +  uint32_t Size = sizeof(InlineeLinesSignature);
> > +
> > +  // one header for each entry.
> > +  Size += Entries.size() * sizeof(InlineeSourceLineHeader);
> > +  if (HasExtraFiles) {
> > +    // If extra files are enabled, one count for each entry.
> > +    Size += Entries.size() * sizeof(uint32_t);
> > +
> > +    // And one file id for each file.
> > +    Size += ExtraFileCount * sizeof(uint32_t);
> > +  }
> > +  assert(Size % 4 == 0);
> > +  return Size;
> > +}
> > +
> > +Error ModuleDebugInlineeLineFragment::commit(BinaryStreamWriter
> &Writer) {
> > +  InlineeLinesSignature Sig = InlineeLinesSignature::Normal;
> > +  if (HasExtraFiles)
> > +    Sig = InlineeLinesSignature::ExtraFiles;
> > +
> > +  if (auto EC = Writer.writeEnum(Sig))
> > +    return EC;
> > +
> > +  for (const auto &E : Entries) {
> > +    if (auto EC = Writer.writeObject(E.Header))
> > +      return EC;
> > +
> > +    if (!HasExtraFiles)
> > +      continue;
> > +
> > +    if (auto EC = Writer.writeInteger<uint32_t>(E.ExtraFiles.size()))
> > +      return EC;
> > +    if (auto EC = Writer.writeArray(makeArrayRef(E.ExtraFiles)))
> > +      return EC;
> > +  }
> > +
> > +  return Error::success();
> > +}
> > +
> > +void ModuleDebugInlineeLineFragment::addExtraFile(uint32_t FileOffset) {
> > +  auto &Entry = Entries.back();
> > +  Entry.ExtraFiles.push_back(ulittle32_t(FileOffset));
> > +  ++ExtraFileCount;
> > +}
> > +
> > +void ModuleDebugInlineeLineFragment::addInlineSite(TypeIndex FuncId,
> > +                                                   uint32_t FileOffset,
> > +                                                   uint32_t SourceLine)
> {
> > +  Entries.emplace_back();
> > +  auto &Entry = Entries.back();
> > +  Entry.Header.FileID = FileOffset;
> > +  Entry.Header.SourceLineNum = SourceLine;
> > +  Entry.Header.Inlinee = FuncId;
> > +}
> >
> > Modified:
> llvm/trunk/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp
> (original)
> > +++ llvm/trunk/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp
> Tue May  2 11:56:09 2017
> > @@ -161,7 +161,7 @@ Error DbiModuleDescriptorBuilder::commit
> >    return Error::success();
> >  }
> >
> > -void DbiModuleDescriptorBuilder::addC13LineFragment(
> > +void DbiModuleDescriptorBuilder::addC13Fragment(
> >      std::unique_ptr<ModuleDebugLineFragment> Lines) {
> >    ModuleDebugLineFragment &Frag = *Lines;
> >
> > @@ -174,6 +174,20 @@ void DbiModuleDescriptorBuilder::addC13L
> >    C13Builders.push_back(
> >        llvm::make_unique<ModuleDebugFragmentRecordBuilder>(Frag.kind(),
> Frag));
> >  }
> > +
> > +void DbiModuleDescriptorBuilder::addC13Fragment(
> > +    std::unique_ptr<codeview::ModuleDebugInlineeLineFragment> Inlinees)
> {
> > +  ModuleDebugInlineeLineFragment &Frag = *Inlinees;
> > +
> > +  // File Checksums have to come first, so push an empty entry on if
> this
> > +  // is the first.
> > +  if (C13Builders.empty())
> > +    C13Builders.push_back(nullptr);
> > +
> > +  this->Inlinees.push_back(std::move(Inlinees));
> > +  C13Builders.push_back(
> > +      llvm::make_unique<ModuleDebugFragmentRecordBuilder>(Frag.kind(),
> Frag));
> > +}
> >
> >  void DbiModuleDescriptorBuilder::setC13FileChecksums(
> >      std::unique_ptr<ModuleDebugFileChecksumFragment> Checksums) {
> >
> > Modified: llvm/trunk/test/DebugInfo/PDB/Inputs/simple-line-info.yaml
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/Inputs/simple-line-info.yaml?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/PDB/Inputs/simple-line-info.yaml (original)
> > +++ llvm/trunk/test/DebugInfo/PDB/Inputs/simple-line-info.yaml Tue May
> 2 11:56:09 2017
> > @@ -1,8 +1,4 @@
> >  ---
> > -StringTable:
> > -  - 'junk_a'
> > -  - 'd:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp'
> > -  - 'junk_b'
> >  DbiStream:
> >    Modules:
> >      - Module:          'd:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj'
> > @@ -14,6 +10,9 @@ DbiStream:
> >            - FileName:
> 'd:\src\llvm\test\debuginfo\pdb\inputs\empty.cpp'
> >              Kind:            MD5
> >              Checksum:        A0A5BD0D3ECD93FC29D19DE826FBF4BC
> > +          - FileName:
> 'f:\dd\externalapis\windows\10\sdk\inc\winerror.h'
> > +            Kind:            MD5
> > +            Checksum:        1154D69F5B2650196E1FC34F4134E56B
> >          Lines:
> >            - CodeSize:        10
> >              Flags:           [  ]
> > @@ -35,4 +34,10 @@ DbiStream:
> >                      IsStatement:     true
> >                      EndDelta:        0
> >                  Columns:
> > +        InlineeLines:
> > +          - HasExtraFiles:   false
> > +            Sites:
> > +              - FileName:
> 'f:\dd\externalapis\windows\10\sdk\inc\winerror.h'
> > +                LineNum:         26950
> > +                Inlinee:         22767
> >  ...
> >
> > Modified: llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml-lineinfo-write.test
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml-lineinfo-write.test?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml-lineinfo-write.test
> (original)
> > +++ llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml-lineinfo-write.test Tue
> May  2 11:56:09 2017
> > @@ -18,6 +18,13 @@ LINES-NEXT:            Checksum (
> >  LINES-NEXT:              0000: A0A5BD0D 3ECD93FC 29D19DE8 26FBF4BC
> |....>...)...&...|
> >  LINES-NEXT:            )
> >  LINES-NEXT:          }
> > +LINES-NEXT:          Checksum {
> > +LINES-NEXT:            FileName:
> f:\dd\externalapis\windows\10\sdk\inc\winerror.h
> > +LINES-NEXT:            Kind: MD5 (0x1)
> > +LINES-NEXT:            Checksum (
> > +LINES-NEXT:              0000: 1154D69F 5B265019 6E1FC34F 4134E56B
> |.T..[&P.n..OA4.k|
> > +LINES-NEXT:            )
> > +LINES-NEXT:          }
> >  LINES-NEXT:        }
> >  LINES-NEXT:        Lines {
> >  LINES-NEXT:          Block {
> > @@ -48,5 +55,17 @@ LINES-NEXT:              }
> >  LINES-NEXT:            }
> >  LINES-NEXT:          }
> >  LINES-NEXT:        }
> > +LINES-NEXT:        InlineeLines {
> > +LINES-NEXT:          HasExtraFiles: No
> > +LINES-NEXT:          Lines [
> > +LINES-NEXT:            Inlinee {
> > +LINES-NEXT:              FileName:
> f:\dd\externalapis\windows\10\sdk\inc\winerror.h
> > +LINES-NEXT:              Function {
> > +LINES-NEXT:                Index: 0x58ef (unknown function)
> > +LINES-NEXT:              }
> > +LINES-NEXT:              SourceLine: 26950
> > +LINES-NEXT:            }
> > +LINES-NEXT:          ]
> > +LINES-NEXT:        }
> >  LINES-NEXT:      ]
> >  LINES-NEXT:    }
> >
> > Modified: llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp (original)
> > +++ llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp Tue May  2
> 11:56:09 2017
> > @@ -10,6 +10,7 @@
> >  #include "C13DebugFragmentVisitor.h"
> >
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
> > +#include "llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
> >  #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
> >  #include "llvm/DebugInfo/PDB/Native/RawError.h"
> > @@ -41,6 +42,12 @@ Error C13DebugFragmentVisitor::visitLine
> >    return Error::success();
> >  }
> >
> > +Error C13DebugFragmentVisitor::visitInlineeLines(
> > +    codeview::ModuleDebugInlineeLineFragmentRef &Lines) {
> > +  this->InlineeLines.push_back(Lines);
> > +  return Error::success();
> > +}
> > +
> >  Error C13DebugFragmentVisitor::finished() {
> >    if (!Checksums.hasValue()) {
> >      assert(Lines.empty());
> > @@ -52,6 +59,9 @@ Error C13DebugFragmentVisitor::finished(
> >    if (auto EC = handleLines())
> >      return EC;
> >
> > +  if (auto EC = handleInlineeLines())
> > +    return EC;
> > +
> >    return Error::success();
> >  }
> >
> >
> > Modified: llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.h?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.h (original)
> > +++ llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.h Tue May  2
> 11:56:09 2017
> > @@ -35,16 +35,21 @@ public:
> >
> >    Error visitLines(codeview::ModuleDebugLineFragmentRef &Lines) final;
> >
> > +  Error
> > +  visitInlineeLines(codeview::ModuleDebugInlineeLineFragmentRef &Lines)
> final;
> > +
> >    Error finished() final;
> >
> >  protected:
> >    virtual Error handleFileChecksums() { return Error::success(); }
> >    virtual Error handleLines() { return Error::success(); }
> > +  virtual Error handleInlineeLines() { return Error::success(); }
> >
> >    Expected<StringRef> getNameFromStringTable(uint32_t Offset);
> >    Expected<StringRef> getNameFromChecksumsBuffer(uint32_t Offset);
> >
> >    Optional<codeview::ModuleDebugFileChecksumFragmentRef> Checksums;
> > +  std::vector<codeview::ModuleDebugInlineeLineFragmentRef> InlineeLines;
> >    std::vector<codeview::ModuleDebugLineFragmentRef> Lines;
> >
> >    PDBFile &F;
> >
> > Modified: llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp (original)
> > +++ llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp Tue May  2
> 11:56:09 2017
> > @@ -31,14 +31,15 @@ static StringRef getLeafName(TypeLeafKin
> >
> >  CompactTypeDumpVisitor::CompactTypeDumpVisitor(TypeDatabase &TypeDB,
> >                                                 ScopedPrinter *W)
> > -    : W(W), TI(TypeIndex::None()), Offset(0), TypeDB(TypeDB) {}
> > +    : CompactTypeDumpVisitor(TypeDB,
> TypeIndex(TypeIndex::FirstNonSimpleIndex),
> > +                             W) {}
> >
> > -Error CompactTypeDumpVisitor::visitTypeBegin(CVType &Record) {
> > -  if (TI == TypeIndex::None())
> > -    TI.setIndex(TypeIndex::FirstNonSimpleIndex);
> > -  else
> > -    TI.setIndex(TI.getIndex() + 1);
> > +CompactTypeDumpVisitor::CompactTypeDumpVisitor(TypeDatabase &TypeDB,
> > +                                               TypeIndex FirstTI,
> > +                                               ScopedPrinter *W)
> > +    : W(W), TI(FirstTI), Offset(0), TypeDB(TypeDB) {}
> >
> > +Error CompactTypeDumpVisitor::visitTypeBegin(CVType &Record) {
> >    return Error::success();
> >  }
> >
> > @@ -52,6 +53,7 @@ Error CompactTypeDumpVisitor::visitTypeE
> >            .str());
> >
> >    Offset += Record.length();
> > +  TI.setIndex(TI.getIndex() + 1);
> >
> >    return Error::success();
> >  }
> >
> > Modified: llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.h?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.h (original)
> > +++ llvm/trunk/tools/llvm-pdbdump/CompactTypeDumpVisitor.h Tue May  2
> 11:56:09 2017
> > @@ -27,6 +27,8 @@ namespace pdb {
> >  class CompactTypeDumpVisitor : public codeview::TypeVisitorCallbacks {
> >  public:
> >    CompactTypeDumpVisitor(codeview::TypeDatabase &TypeDB, ScopedPrinter
> *W);
> > +  CompactTypeDumpVisitor(codeview::TypeDatabase &TypeDB,
> > +                         codeview::TypeIndex FirstTI, ScopedPrinter *W);
> >
> >    /// Paired begin/end actions for all types. Receives all record data,
> >    /// including the fixed-length record prefix.
> >
> > Modified: llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp (original)
> > +++ llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp Tue May  2
> 11:56:09 2017
> > @@ -20,6 +20,7 @@
> >  #include "llvm/DebugInfo/CodeView/Line.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h"
> > +#include "llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugUnknownFragment.h"
> >  #include "llvm/DebugInfo/CodeView/SymbolDumper.h"
> > @@ -82,10 +83,13 @@ struct PageStats {
> >
> >  class C13RawVisitor : public C13DebugFragmentVisitor {
> >  public:
> > -  C13RawVisitor(ScopedPrinter &P, PDBFile &F)
> > -      : C13DebugFragmentVisitor(F), P(P) {}
> > +  C13RawVisitor(ScopedPrinter &P, PDBFile &F, TypeDatabase &IPI)
> > +      : C13DebugFragmentVisitor(F), P(P), IPI(IPI) {}
> >
> >    Error handleLines() override {
> > +    if (Lines.empty())
> > +      return Error::success();
> > +
> >      DictScope DD(P, "Lines");
> >
> >      for (const auto &Fragment : Lines) {
> > @@ -126,6 +130,9 @@ public:
> >    }
> >
> >    Error handleFileChecksums() override {
> > +    if (!Checksums.hasValue())
> > +      return Error::success();
> > +
> >      DictScope DD(P, "FileChecksums");
> >      for (const auto &CS : *Checksums) {
> >        DictScope DDD(P, "Checksum");
> > @@ -139,7 +146,50 @@ public:
> >      return Error::success();
> >    }
> >
> > +  Error handleInlineeLines() override {
> > +    if (InlineeLines.empty())
> > +      return Error::success();
> > +
> > +    DictScope D(P, "InlineeLines");
> > +    for (const auto &IL : InlineeLines) {
> > +      P.printBoolean("HasExtraFiles", IL.hasExtraFiles());
> > +      ListScope LS(P, "Lines");
> > +      for (const auto &L : IL) {
> > +        DictScope DDD(P, "Inlinee");
> > +        if (auto EC = printFileName("FileName", L.Header->FileID))
> > +          return EC;
> > +
> > +        if (auto EC = dumpTypeRecord("Function", IPI,
> L.Header->Inlinee))
> > +          return EC;
> > +        P.printNumber("SourceLine", L.Header->SourceLineNum);
> > +        if (IL.hasExtraFiles()) {
> > +          ListScope DDDD(P, "ExtraFiles");
> > +          for (const auto &EF : L.ExtraFiles) {
> > +            if (auto EC = printFileName("File", EF))
> > +              return EC;
> > +          }
> > +        }
> > +      }
> > +    }
> > +    return Error::success();
> > +  }
> > +
> >  private:
> > +  Error dumpTypeRecord(StringRef Label, TypeDatabase &DB, TypeIndex
> Index) {
> > +    CompactTypeDumpVisitor CTDV(DB, Index, &P);
> > +    CVTypeVisitor Visitor(CTDV);
> > +    DictScope D(P, Label);
> > +    if (DB.containsTypeIndex(Index)) {
> > +      CVType &Type = DB.getTypeRecord(Index);
> > +      if (auto EC = Visitor.visitTypeRecord(Type))
> > +        return EC;
> > +    } else {
> > +      P.printString(
> > +          llvm::formatv("Index: {0:x} (unknown function)",
> Index.getIndex())
> > +              .str());
> > +    }
> > +    return Error::success();
> > +  }
> >    Error printFileName(StringRef Label, uint32_t Offset) {
> >      if (auto Result = getNameFromChecksumsBuffer(Offset)) {
> >        P.printString(Label, *Result);
> > @@ -149,6 +199,7 @@ private:
> >    }
> >
> >    ScopedPrinter &P;
> > +  TypeDatabase &IPI;
> >  };
> >  }
> >
> > @@ -618,6 +669,7 @@ Error LLVMOutputStyle::dumpTpiStream(uin
> >
> >      if (auto EC = Visitor.visitTypeRecord(Type))
> >        return EC;
> > +    T.setIndex(T.getIndex() + 1);
> >    }
> >    if (HadError)
> >      return make_error<RawError>(raw_error_code::corrupt_file,
> > @@ -750,7 +802,7 @@ Error LLVMOutputStyle::dumpDbiStream() {
> >          if (opts::raw::DumpLineInfo) {
> >            ListScope SS(P, "LineInfo");
> >
> > -          C13RawVisitor V(P, File);
> > +          C13RawVisitor V(P, File, ItemDB);
> >            if (auto EC = codeview::visitModuleDebugFragments(
> >                    ModS.linesAndChecksums(), V))
> >              return EC;
> >
> > Modified: llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp (original)
> > +++ llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp Tue May  2 11:56:09 2017
> > @@ -41,6 +41,8 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::
> >  LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceColumnEntry)
> >  LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceLineBlock)
> >  LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSourceLineInfo)
> > +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbInlineeSite)
> > +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbInlineeInfo)
> >  LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbSymbolRecord)
> >  LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbTpiRecord)
> >  LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::StreamBlockList)
> > @@ -336,6 +338,7 @@ void MappingContextTraits<pdb::yaml::Pdb
> >      mapping(IO &IO, PdbSourceLineInfo &Obj,
> >              pdb::yaml::SerializationContext &Context) {
> >    IO.mapRequired("CodeSize", Obj.CodeSize);
> > +
> >    IO.mapRequired("Flags", Obj.Flags);
> >    IO.mapRequired("RelocOffset", Obj.RelocOffset);
> >    IO.mapRequired("RelocSegment", Obj.RelocSegment);
> > @@ -348,6 +351,21 @@ void MappingContextTraits<pdb::yaml::Pdb
> >              pdb::yaml::SerializationContext &Context) {
> >    IO.mapOptionalWithContext("Checksums", Obj.FileChecksums, Context);
> >    IO.mapOptionalWithContext("Lines", Obj.LineFragments, Context);
> > +  IO.mapOptionalWithContext("InlineeLines", Obj.Inlinees, Context);
> > +}
> > +
> > +void MappingContextTraits<PdbInlineeSite,
> SerializationContext>::mapping(
> > +    IO &IO, PdbInlineeSite &Obj, SerializationContext &Context) {
> > +  IO.mapRequired("FileName", Obj.FileName);
> > +  IO.mapRequired("LineNum", Obj.SourceLineNum);
> > +  IO.mapRequired("Inlinee", Obj.Inlinee);
> > +  IO.mapOptional("ExtraFiles", Obj.ExtraFiles);
> > +}
> > +
> > +void MappingContextTraits<PdbInlineeInfo,
> SerializationContext>::mapping(
> > +    IO &IO, PdbInlineeInfo &Obj, SerializationContext &Context) {
> > +  IO.mapRequired("HasExtraFiles", Obj.HasExtraFiles);
> > +  IO.mapRequired("Sites", Obj.Sites, Context);
> >  }
> >
> >  void MappingContextTraits<PdbTpiRecord,
> pdb::yaml::SerializationContext>::
> >
> > Modified: llvm/trunk/tools/llvm-pdbdump/PdbYaml.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PdbYaml.h?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-pdbdump/PdbYaml.h (original)
> > +++ llvm/trunk/tools/llvm-pdbdump/PdbYaml.h Tue May  2 11:56:09 2017
> > @@ -102,9 +102,22 @@ struct PdbSourceLineInfo {
> >    std::vector<PdbSourceLineBlock> Blocks;
> >  };
> >
> > +struct PdbInlineeSite {
> > +  codeview::TypeIndex Inlinee;
> > +  StringRef FileName;
> > +  uint32_t SourceLineNum;
> > +  std::vector<StringRef> ExtraFiles;
> > +};
> > +
> > +struct PdbInlineeInfo {
> > +  bool HasExtraFiles;
> > +  std::vector<PdbInlineeSite> Sites;
> > +};
> > +
> >  struct PdbSourceFileInfo {
> >    std::vector<PdbSourceFileChecksumEntry> FileChecksums;
> >    std::vector<PdbSourceLineInfo> LineFragments;
> > +  std::vector<PdbInlineeInfo> Inlinees;
> >  };
> >
> >  struct PdbDbiModuleInfo {
> > @@ -258,6 +271,20 @@ struct MappingContextTraits<pdb::yaml::P
> >                        pdb::yaml::SerializationContext &Context);
> >  };
> >
> > +template <>
> > +struct MappingContextTraits<pdb::yaml::PdbInlineeInfo,
> > +                            pdb::yaml::SerializationContext> {
> > +  static void mapping(IO &IO, pdb::yaml::PdbInlineeInfo &Obj,
> > +                      pdb::yaml::SerializationContext &Context);
> > +};
> > +
> > +template <>
> > +struct MappingContextTraits<pdb::yaml::PdbInlineeSite,
> > +                            pdb::yaml::SerializationContext> {
> > +  static void mapping(IO &IO, pdb::yaml::PdbInlineeSite &Obj,
> > +                      pdb::yaml::SerializationContext &Context);
> > +};
> > +
> >  template <>
> >  struct MappingContextTraits<pdb::yaml::PdbTpiRecord,
> >                              pdb::yaml::SerializationContext> {
> >
> > Modified: llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp (original)
> > +++ llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp Tue May  2
> 11:56:09 2017
> > @@ -17,6 +17,7 @@
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugFragmentVisitor.h"
> > +#include "llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugUnknownFragment.h"
> >  #include "llvm/DebugInfo/MSF/MappedBlockStream.h"
> > @@ -146,6 +147,35 @@ public:
> >            }
> >          }
> >        }
> > +    }
> > +    return Error::success();
> > +  }
> > +
> > +  Error handleInlineeLines() override {
> > +    for (const auto &ILF : InlineeLines) {
> > +      Info.Inlinees.emplace_back();
> > +      auto &Inlinee = Info.Inlinees.back();
> > +
> > +      Inlinee.HasExtraFiles = ILF.hasExtraFiles();
> > +      for (const auto &IL : ILF) {
> > +        Inlinee.Sites.emplace_back();
> > +        auto &Site = Inlinee.Sites.back();
> > +        if (auto Result = getNameFromChecksumsBuffer(IL.Header->FileID))
> > +          Site.FileName = *Result;
> > +        else
> > +          return Result.takeError();
> > +
> > +        Site.Inlinee = IL.Header->Inlinee;
> > +        Site.SourceLineNum = IL.Header->SourceLineNum;
> > +        if (ILF.hasExtraFiles()) {
> > +          for (const auto &EF : IL.ExtraFiles) {
> > +            if (auto Result = getNameFromChecksumsBuffer(EF))
> > +              Site.ExtraFiles.push_back(*Result);
> > +            else
> > +              return Result.takeError();
> > +          }
> > +        }
> > +      }
> >      }
> >      return Error::success();
> >    }
> >
> > Modified: llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp (original)
> > +++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp Tue May  2 11:56:09
> 2017
> > @@ -31,6 +31,9 @@
> >  #include "llvm/ADT/STLExtras.h"
> >  #include "llvm/ADT/StringExtras.h"
> >  #include "llvm/Config/config.h"
> > +#include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
> > +#include "llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h"
> > +#include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
> >  #include "llvm/DebugInfo/MSF/MSFBuilder.h"
> >  #include "llvm/DebugInfo/PDB/GenericError.h"
> >  #include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
> > @@ -421,6 +424,21 @@ cl::list<std::string> InputFilename(cl::
> >
> >  static ExitOnError ExitOnErr;
> >
> > +static uint32_t
> > +getFileChecksumOffset(StringRef FileName,
> > +                      ModuleDebugFileChecksumFragment &Checksums,
> > +                      StringTableBuilder &Strings) {
> > +  // The offset in the line info record is the offset of the checksum
> > +  // entry for the corresponding file.  That entry then contains an
> > +  // offset into the global string table of the file name.  So to
> > +  // compute the proper offset to write into the line info record, we
> > +  // must first get its offset in the global string table, then ask the
> > +  // checksum builder to find the offset in its serialized buffer that
> > +  // it mapped that filename string table offset to.
> > +  uint32_t StringOffset = Strings.insert(FileName);
> > +  return Checksums.mapChecksumOffset(StringOffset);
> > +}
> > +
> >  static void yamlToPdb(StringRef Path) {
> >    BumpPtrAllocator Allocator;
> >    ErrorOr<std::unique_ptr<MemoryBuffer>> ErrorOrBuffer =
> > @@ -503,12 +521,19 @@ static void yamlToPdb(StringRef Path) {
> >        if (!FLI.FileChecksums.empty()) {
> >          auto &Strings = Builder.getStringTableBuilder();
> >          for (auto &FC : FLI.FileChecksums) {
> > -          uint32_t STOffset = Strings.getStringIndex(FC.FileName);
> > +          uint32_t STOffset = Strings.insert(FC.FileName);
> >            Checksums->addChecksum(STOffset, FC.Kind,
> FC.ChecksumBytes.Bytes);
> >          }
> >        }
> >        ModiBuilder.setC13FileChecksums(std::move(Checksums));
> >
> > +      // FIXME: StringTable / StringTableBuilder should really be in
> > +      // DebugInfoCodeView.  This would allow us to construct the
> > +      // ModuleDebugLineFragment with a reference to the string table,
> > +      // and we could just pass strings around rather than having to
> > +      // remember how to calculate the right offset.
> > +      auto &Strings = Builder.getStringTableBuilder();
> > +
> >        for (const auto &Fragment : FLI.LineFragments) {
> >          auto Lines = llvm::make_unique<ModuleDebugLineFragment>();
> >          Lines->setCodeSize(Fragment.CodeSize);
> > @@ -516,21 +541,8 @@ static void yamlToPdb(StringRef Path) {
> >                                      Fragment.RelocOffset);
> >          Lines->setFlags(Fragment.Flags);
> >          for (const auto &LC : Fragment.Blocks) {
> > -          // FIXME: StringTable / StringTableBuilder should really be in
> > -          // DebugInfoCodeView.  This would allow us to construct the
> > -          // ModuleDebugLineFragment with a reference to the string
> table,
> > -          // and we could just pass strings around rather than having to
> > -          // remember how to calculate the right offset.
> > -          auto &Strings = Builder.getStringTableBuilder();
> > -          // The offset in the line info record is the offset of the
> checksum
> > -          // entry for the corresponding file.  That entry then
> contains an
> > -          // offset into the global string table of the file name.  So
> to
> > -          // compute the proper offset to write into the line info
> record, we
> > -          // must first get its offset in the global string table, then
> ask the
> > -          // checksum builder to find the offset in its serialized
> buffer that
> > -          // it mapped that filename string table offset to.
> > -          uint32_t StringOffset = Strings.getStringIndex(LC.FileName);
> > -          uint32_t ChecksumOffset =
> ChecksumRef.mapChecksumOffset(StringOffset);
> > +          uint32_t ChecksumOffset =
> > +              getFileChecksumOffset(LC.FileName, ChecksumRef, Strings);
> >
> >            Lines->createBlock(ChecksumOffset);
> >            if (Lines->hasColumnInfo()) {
> > @@ -550,7 +562,26 @@ static void yamlToPdb(StringRef Path) {
> >              }
> >            }
> >          }
> > -        ModiBuilder.addC13LineFragment(std::move(Lines));
> > +        ModiBuilder.addC13Fragment(std::move(Lines));
> > +      }
> > +
> > +      for (const auto &Inlinee : FLI.Inlinees) {
> > +        auto Inlinees =
> llvm::make_unique<ModuleDebugInlineeLineFragment>(
> > +            Inlinee.HasExtraFiles);
> > +        for (const auto &Site : Inlinee.Sites) {
> > +          uint32_t FileOff =
> > +              getFileChecksumOffset(Site.FileName, ChecksumRef,
> Strings);
> > +
> > +          Inlinees->addInlineSite(Site.Inlinee, FileOff,
> Site.SourceLineNum);
> > +          if (!Inlinee.HasExtraFiles)
> > +            continue;
> > +
> > +          for (auto EF : Site.ExtraFiles) {
> > +            FileOff = getFileChecksumOffset(EF, ChecksumRef, Strings);
> > +            Inlinees->addExtraFile(FileOff);
> > +          }
> > +        }
> > +        ModiBuilder.addC13Fragment(std::move(Inlinees));
> >        }
> >      }
> >    }
> >
> > Modified: llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/COFFDumper.cpp?rev=301936&r1=301935&r2=301936&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-readobj/COFFDumper.cpp (original)
> > +++ llvm/trunk/tools/llvm-readobj/COFFDumper.cpp Tue May  2 11:56:09 2017
> > @@ -26,6 +26,7 @@
> >  #include "llvm/DebugInfo/CodeView/CodeView.h"
> >  #include "llvm/DebugInfo/CodeView/Line.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugFileChecksumFragment.h"
> > +#include "llvm/DebugInfo/CodeView/ModuleDebugInlineeLinesFragment.h"
> >  #include "llvm/DebugInfo/CodeView/ModuleDebugLineFragment.h"
> >  #include "llvm/DebugInfo/CodeView/RecordSerialization.h"
> >  #include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
> > @@ -986,27 +987,20 @@ void COFFDumper::printCodeViewFileChecks
> >  void COFFDumper::printCodeViewInlineeLines(StringRef Subsection) {
> >    BinaryByteStream S(Subsection, llvm::support::little);
> >    BinaryStreamReader SR(S);
> > -  uint32_t Signature;
> > -  error(SR.readInteger(Signature));
> > -  bool HasExtraFiles = Signature ==
> unsigned(InlineeLinesSignature::ExtraFiles);
> > -
> > -  while (!SR.empty()) {
> > -    const InlineeSourceLine *ISL;
> > -    error(SR.readObject(ISL));
> > +  ModuleDebugInlineeLineFragmentRef Lines;
> > +  error(Lines.initialize(SR));
> > +
> > +  for (auto &Line : Lines) {
> >      DictScope S(W, "InlineeSourceLine");
> > -    printTypeIndex("Inlinee", ISL->Inlinee);
> > -    printFileNameForOffset("FileID", ISL->FileID);
> > -    W.printNumber("SourceLineNum", ISL->SourceLineNum);
> > -
> > -    if (HasExtraFiles) {
> > -      uint32_t ExtraFileCount;
> > -      error(SR.readInteger(ExtraFileCount));
> > -      W.printNumber("ExtraFileCount", ExtraFileCount);
> > +    printTypeIndex("Inlinee", Line.Header->Inlinee);
> > +    printFileNameForOffset("FileID", Line.Header->FileID);
> > +    W.printNumber("SourceLineNum", Line.Header->SourceLineNum);
> > +
> > +    if (Lines.hasExtraFiles()) {
> > +      W.printNumber("ExtraFileCount", Line.ExtraFiles.size());
> >        ListScope ExtraFiles(W, "ExtraFiles");
> > -      for (unsigned I = 0; I < ExtraFileCount; ++I) {
> > -        uint32_t FileID;
> > -        error(SR.readInteger(FileID));
> > -        printFileNameForOffset("FileID", FileID);
> > +      for (const auto &FID : Line.ExtraFiles) {
> > +        printFileNameForOffset("FileID", FID);
> >        }
> >      }
> >    }
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170503/752f4811/attachment.html>


More information about the llvm-commits mailing list