[llvm] r304738 - [CodeView] Handle Cross Module Imports and Exports.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 6 16:43:35 PDT 2017


Sorry, I just now saw this.  I will fix it now

On Tue, Jun 6, 2017 at 4:34 PM Evgenii Stepanov <eugeni.stepanov at gmail.com>
wrote:

> Still failing!
>
> On Tue, Jun 6, 2017 at 2:20 PM, Evgenii Stepanov
> <eugeni.stepanov at gmail.com> wrote:
> > ==8430==WARNING: MemorySanitizer: use-of-uninitialized-value
> >     #0 0x6df73b in
> >
> llvm::pdb::DbiStream::visitSectionContributions(llvm::pdb::ISectionContribVisitor&)
> > const
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/PDB/Native/DbiStream.cpp:219:7
> >     #1 0x53ba0c in llvm::pdb::LLVMOutputStyle::dumpSectionContribs()
> >
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp:919:8
> >     #2 0x52a525 in llvm::pdb::LLVMOutputStyle::dump()
> >
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp:286:17
> >     #3 0x505f8d in dumpRaw
> >
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp:592:16
> >     #4 0x505f8d 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_msan/include/c++/v1/algorithm:965
> >     #5 0x505f8d in main
> >
> /mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp:963
> >     #6 0x7f42790ed82f in __libc_start_main
> > (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
> >     #7 0x450688 in _start
> >
> (/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm_build_msan/bin/llvm-pdbdump+0x450688)
> >
> >
> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/5488/steps/check-llvm%20msan/logs/stdio
> >
> > On Mon, Jun 5, 2017 at 2:40 PM, Zachary Turner via llvm-commits
> > <llvm-commits at lists.llvm.org> wrote:
> >> Author: zturner
> >> Date: Mon Jun  5 16:40:33 2017
> >> New Revision: 304738
> >>
> >> URL: http://llvm.org/viewvc/llvm-project?rev=304738&view=rev
> >> Log:
> >> [CodeView] Handle Cross Module Imports and Exports.
> >>
> >> While it's not entirely clear why a compiler or linker might
> >> put this information into an object or PDB file, one has been
> >> spotted in the wild which was causing llvm-pdbdump to crash.
> >>
> >> This patch adds support for reading-writing these sections.
> >> Since I don't know how to get one of the native tools to
> >> generate this kind of debug info, the only test here is one
> >> in which we feed YAML into the tool to produce a PDB and
> >> then spit out YAML from the resulting PDB and make sure that
> >> it matches.
> >>
> >> Added:
> >>     llvm/trunk/include/llvm/DebugInfo/CodeView/DebugCrossExSubsection.h
> >>     llvm/trunk/include/llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h
> >>     llvm/trunk/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp
> >>     llvm/trunk/lib/DebugInfo/CodeView/DebugCrossImpSubsection.cpp
> >>     llvm/trunk/test/DebugInfo/PDB/Inputs/cross-module-import-export.yaml
> >>     llvm/trunk/test/DebugInfo/PDB/cross-module-import-export.test
> >> Modified:
> >>     llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h
> >>     llvm/trunk/include/llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h
> >>     llvm/trunk/include/llvm/ObjectYAML/CodeViewYAMLDebugSections.h
> >>     llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt
> >>     llvm/trunk/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp
> >>     llvm/trunk/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp
> >>     llvm/trunk/lib/DebugInfo/PDB/Native/ModuleDebugStream.cpp
> >>     llvm/trunk/lib/DebugInfo/PDB/Native/PublicsStream.cpp
> >>     llvm/trunk/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp
> >>     llvm/trunk/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
> >>     llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp
> >>     llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.h
> >>     llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp
> >>     llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
> >>
> >> Modified: llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h (original)
> >> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/CodeView.h Mon Jun  5
> 16:40:33 2017
> >> @@ -575,6 +575,24 @@ struct FrameData {
> >>    };
> >>  };
> >>
> >> +// Corresponds to LocalIdAndGlobalIdPair structure.
> >> +// This structure information allows cross-referencing between PDBs.
> For
> >> +// example, when a PDB is being built during compilation it is not yet
> known
> >> +// what other modules may end up in the PDB at link time.  So certain
> types of
> >> +// IDs may clash between the various compile time PDBs.  For each
> affected
> >> +// module, a subsection would be put into the PDB containing a mapping
> from its
> >> +// local IDs to a single ID namespace for all items in the PDB file.
> >> +struct CrossModuleExport {
> >> +  support::ulittle32_t Local;
> >> +  support::ulittle32_t Global;
> >> +};
> >> +
> >> +struct CrossModuleImport {
> >> +  support::ulittle32_t ModuleNameOffset;
> >> +  support::ulittle32_t Count; // Number of elements
> >> +  // support::ulittle32_t ids[Count]; // id from referenced module
> >> +};
> >> +
> >>  enum class CodeViewContainer { ObjectFile, Pdb };
> >>
> >>  inline uint32_t alignOf(CodeViewContainer Container) {
> >>
> >> Added:
> llvm/trunk/include/llvm/DebugInfo/CodeView/DebugCrossExSubsection.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/DebugCrossExSubsection.h?rev=304738&view=auto
> >>
> ==============================================================================
> >> --- llvm/trunk/include/llvm/DebugInfo/CodeView/DebugCrossExSubsection.h
> (added)
> >> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/DebugCrossExSubsection.h
> Mon Jun  5 16:40:33 2017
> >> @@ -0,0 +1,64 @@
> >> +//===- DebugCrossExSubsection.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_DEBUGCROSSEXSUBSECTION_H
> >> +#define LLVM_DEBUGINFO_CODEVIEW_DEBUGCROSSEXSUBSECTION_H
> >> +
> >> +#include "llvm/DebugInfo/CodeView/DebugSubsection.h"
> >> +#include "llvm/Support/BinaryStreamArray.h"
> >> +#include "llvm/Support/BinaryStreamReader.h"
> >> +#include "llvm/Support/Endian.h"
> >> +
> >> +#include <map>
> >> +
> >> +namespace llvm {
> >> +namespace codeview {
> >> +class DebugCrossModuleExportsSubsectionRef final : public
> DebugSubsectionRef {
> >> +  typedef FixedStreamArray<CrossModuleExport> ReferenceArray;
> >> +  typedef ReferenceArray::Iterator Iterator;
> >> +
> >> +public:
> >> +  DebugCrossModuleExportsSubsectionRef()
> >> +      : DebugSubsectionRef(DebugSubsectionKind::CrossScopeExports) {}
> >> +
> >> +  static bool classof(const DebugSubsectionRef *S) {
> >> +    return S->kind() == DebugSubsectionKind::CrossScopeExports;
> >> +  }
> >> +
> >> +  Error initialize(BinaryStreamReader Reader);
> >> +  Error initialize(BinaryStreamRef Stream);
> >> +
> >> +  Iterator begin() const { return References.begin(); }
> >> +  Iterator end() const { return References.end(); }
> >> +
> >> +private:
> >> +  FixedStreamArray<CrossModuleExport> References;
> >> +};
> >> +
> >> +class DebugCrossModuleExportsSubsection final : public DebugSubsection
> {
> >> +public:
> >> +  DebugCrossModuleExportsSubsection()
> >> +      : DebugSubsection(DebugSubsectionKind::CrossScopeExports) {}
> >> +
> >> +  static bool classof(const DebugSubsection *S) {
> >> +    return S->kind() == DebugSubsectionKind::CrossScopeExports;
> >> +  }
> >> +
> >> +  void addMapping(uint32_t Local, uint32_t Global);
> >> +
> >> +  uint32_t calculateSerializedSize() const override;
> >> +  Error commit(BinaryStreamWriter &Writer) const override;
> >> +
> >> +private:
> >> +  std::map<uint32_t, uint32_t> Mappings;
> >> +};
> >> +}
> >> +}
> >> +
> >> +#endif
> >>
> >> Added:
> llvm/trunk/include/llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h?rev=304738&view=auto
> >>
> ==============================================================================
> >> ---
> llvm/trunk/include/llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h (added)
> >> +++
> llvm/trunk/include/llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h Mon
> Jun  5 16:40:33 2017
> >> @@ -0,0 +1,88 @@
> >> +//===- DebugCrossExSubsection.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_DEBUGCROSSIMPSUBSECTION_H
> >> +#define LLVM_DEBUGINFO_CODEVIEW_DEBUGCROSSIMPSUBSECTION_H
> >> +
> >> +#include "llvm/ADT/StringMap.h"
> >> +#include "llvm/DebugInfo/CodeView/DebugSubsection.h"
> >> +#include "llvm/Support/BinaryStreamArray.h"
> >> +#include "llvm/Support/BinaryStreamReader.h"
> >> +#include "llvm/Support/Endian.h"
> >> +
> >> +namespace llvm {
> >> +namespace codeview {
> >> +
> >> +struct CrossModuleImportItem {
> >> +  const CrossModuleImport *Header = nullptr;
> >> +  llvm::FixedStreamArray<support::ulittle32_t> Imports;
> >> +};
> >> +}
> >> +}
> >> +
> >> +namespace llvm {
> >> +template <> struct
> VarStreamArrayExtractor<codeview::CrossModuleImportItem> {
> >> +public:
> >> +  typedef void ContextType;
> >> +
> >> +  static Error extract(BinaryStreamRef Stream, uint32_t &Len,
> >> +                       codeview::CrossModuleImportItem &Item);
> >> +};
> >> +}
> >> +
> >> +namespace llvm {
> >> +namespace codeview {
> >> +class DebugStringTableSubsection;
> >> +
> >> +class DebugCrossModuleImportsSubsectionRef final : public
> DebugSubsectionRef {
> >> +  typedef VarStreamArray<CrossModuleImportItem> ReferenceArray;
> >> +  typedef ReferenceArray::Iterator Iterator;
> >> +
> >> +public:
> >> +  DebugCrossModuleImportsSubsectionRef()
> >> +      : DebugSubsectionRef(DebugSubsectionKind::CrossScopeImports) {}
> >> +
> >> +  static bool classof(const DebugSubsectionRef *S) {
> >> +    return S->kind() == DebugSubsectionKind::CrossScopeImports;
> >> +  }
> >> +
> >> +  Error initialize(BinaryStreamReader Reader);
> >> +  Error initialize(BinaryStreamRef Stream);
> >> +
> >> +  Iterator begin() const { return References.begin(); }
> >> +  Iterator end() const { return References.end(); }
> >> +
> >> +private:
> >> +  ReferenceArray References;
> >> +};
> >> +
> >> +class DebugCrossModuleImportsSubsection final : public DebugSubsection
> {
> >> +public:
> >> +  explicit DebugCrossModuleImportsSubsection(
> >> +      DebugStringTableSubsection &Strings)
> >> +      : DebugSubsection(DebugSubsectionKind::CrossScopeImports),
> >> +        Strings(Strings) {}
> >> +
> >> +  static bool classof(const DebugSubsection *S) {
> >> +    return S->kind() == DebugSubsectionKind::CrossScopeImports;
> >> +  }
> >> +
> >> +  void addImport(StringRef Module, uint32_t ImportId);
> >> +
> >> +  uint32_t calculateSerializedSize() const override;
> >> +  Error commit(BinaryStreamWriter &Writer) const override;
> >> +
> >> +private:
> >> +  DebugStringTableSubsection &Strings;
> >> +  StringMap<std::vector<support::ulittle32_t>> Mappings;
> >> +};
> >> +}
> >> +}
> >> +
> >> +#endif
> >>
> >> Modified:
> llvm/trunk/include/llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/include/llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h
> (original)
> >> +++ llvm/trunk/include/llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h
> Mon Jun  5 16:40:33 2017
> >> @@ -20,6 +20,8 @@ namespace codeview {
> >>  class DebugChecksumsSubsectionRef;
> >>  class DebugSubsectionRecord;
> >>  class DebugInlineeLinesSubsectionRef;
> >> +class DebugCrossModuleExportsSubsectionRef;
> >> +class DebugCrossModuleImportsSubsectionRef;
> >>  class DebugLinesSubsectionRef;
> >>  class DebugUnknownSubsectionRef;
> >>
> >> @@ -42,6 +44,16 @@ public:
> >>      return Error::success();
> >>    }
> >>
> >> +  virtual Error
> >> +  visitCrossModuleExports(DebugCrossModuleExportsSubsectionRef &CSE) {
> >> +    return Error::success();
> >> +  }
> >> +
> >> +  virtual Error
> >> +  visitCrossModuleImports(DebugCrossModuleImportsSubsectionRef &CSE) {
> >> +    return Error::success();
> >> +  }
> >> +
> >>    virtual Error finished() { return Error::success(); }
> >>  };
> >>
> >>
> >> Modified: llvm/trunk/include/llvm/ObjectYAML/CodeViewYAMLDebugSections.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/CodeViewYAMLDebugSections.h?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/include/llvm/ObjectYAML/CodeViewYAMLDebugSections.h
> (original)
> >> +++ llvm/trunk/include/llvm/ObjectYAML/CodeViewYAMLDebugSections.h Mon
> Jun  5 16:40:33 2017
> >> @@ -33,6 +33,11 @@ namespace detail {
> >>  struct YAMLSubsectionBase;
> >>  }
> >>
> >> +struct YAMLCrossModuleImport {
> >> +  StringRef ModuleName;
> >> +  std::vector<uint32_t> ImportIds;
> >> +};
> >> +
> >>  struct SourceLineEntry {
> >>    uint32_t Offset;
> >>    uint32_t LineStart;
> >>
> >> Modified: llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt (original)
> >> +++ llvm/trunk/lib/DebugInfo/CodeView/CMakeLists.txt Mon Jun  5
> 16:40:33 2017
> >> @@ -3,11 +3,9 @@ add_llvm_library(LLVMDebugInfoCodeView
> >>    CodeViewRecordIO.cpp
> >>    CVSymbolVisitor.cpp
> >>    CVTypeVisitor.cpp
> >> -  EnumTables.cpp
> >> -  Formatters.cpp
> >> -  LazyRandomTypeCollection.cpp
> >> -  Line.cpp
> >>    DebugChecksumsSubsection.cpp
> >> +  DebugCrossExSubsection.cpp
> >> +  DebugCrossImpSubsection.cpp
> >>    DebugFrameDataSubsection.cpp
> >>    DebugInlineeLinesSubsection.cpp
> >>    DebugLinesSubsection.cpp
> >> @@ -16,6 +14,10 @@ add_llvm_library(LLVMDebugInfoCodeView
> >>    DebugSubsectionRecord.cpp
> >>    DebugSubsectionVisitor.cpp
> >>    DebugSymbolsSubsection.cpp
> >> +  EnumTables.cpp
> >> +  Formatters.cpp
> >> +  LazyRandomTypeCollection.cpp
> >> +  Line.cpp
> >>    RecordSerialization.cpp
> >>    SymbolRecordMapping.cpp
> >>    SymbolDumper.cpp
> >>
> >> Added: llvm/trunk/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp?rev=304738&view=auto
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp (added)
> >> +++ llvm/trunk/lib/DebugInfo/CodeView/DebugCrossExSubsection.cpp Mon
> Jun  5 16:40:33 2017
> >> @@ -0,0 +1,49 @@
> >> +//===- DebugCrossExSubsection.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/DebugCrossExSubsection.h"
> >> +
> >> +#include "llvm/DebugInfo/CodeView/CodeViewError.h"
> >> +
> >> +using namespace llvm;
> >> +using namespace llvm::codeview;
> >> +
> >> +Error DebugCrossModuleExportsSubsectionRef::initialize(
> >> +    BinaryStreamReader Reader) {
> >> +  if (Reader.bytesRemaining() % sizeof(CrossModuleExport) != 0)
> >> +    return make_error<CodeViewError>(
> >> +        cv_error_code::corrupt_record,
> >> +        "Cross Scope Exports section is an invalid size!");
> >> +
> >> +  uint32_t Size = Reader.bytesRemaining() / sizeof(CrossModuleExport);
> >> +  return Reader.readArray(References, Size);
> >> +}
> >> +
> >> +Error DebugCrossModuleExportsSubsectionRef::initialize(BinaryStreamRef
> Stream) {
> >> +  BinaryStreamReader Reader(Stream);
> >> +  return initialize(Reader);
> >> +}
> >> +
> >> +void DebugCrossModuleExportsSubsection::addMapping(uint32_t Local,
> >> +                                                   uint32_t Global) {
> >> +  Mappings[Local] = Global;
> >> +}
> >> +
> >> +uint32_t DebugCrossModuleExportsSubsection::calculateSerializedSize()
> const {
> >> +  return Mappings.size() * sizeof(CrossModuleExport);
> >> +}
> >> +
> >> +Error DebugCrossModuleExportsSubsection::commit(
> >> +    BinaryStreamWriter &Writer) const {
> >> +  for (const auto &M : Mappings) {
> >> +    if (auto EC = Writer.writeObject(M))
> >> +      return EC;
> >> +  }
> >> +  return Error::success();
> >> +}
> >>
> >> Added: llvm/trunk/lib/DebugInfo/CodeView/DebugCrossImpSubsection.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/DebugCrossImpSubsection.cpp?rev=304738&view=auto
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/DebugInfo/CodeView/DebugCrossImpSubsection.cpp
> (added)
> >> +++ llvm/trunk/lib/DebugInfo/CodeView/DebugCrossImpSubsection.cpp Mon
> Jun  5 16:40:33 2017
> >> @@ -0,0 +1,91 @@
> >> +//===- DebugCrossImpSubsection.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/DebugCrossImpSubsection.h"
> >> +
> >> +#include "llvm/DebugInfo/CodeView/CodeViewError.h"
> >> +#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
> >> +
> >> +using namespace llvm;
> >> +using namespace llvm::codeview;
> >> +
> >> +namespace llvm {
> >> +Error VarStreamArrayExtractor<CrossModuleImportItem>::extract(
> >> +    BinaryStreamRef Stream, uint32_t &Len,
> >> +    codeview::CrossModuleImportItem &Item) {
> >> +  BinaryStreamReader Reader(Stream);
> >> +  if (Reader.bytesRemaining() < sizeof(CrossModuleImport))
> >> +    return make_error<CodeViewError>(
> >> +        cv_error_code::insufficient_buffer,
> >> +        "Not enough bytes for a Cross Module Import Header!");
> >> +  if (auto EC = Reader.readObject(Item.Header))
> >> +    return EC;
> >> +  if (Reader.bytesRemaining() < Item.Header->Count * sizeof(uint32_t))
> >> +    return make_error<CodeViewError>(
> >> +        cv_error_code::insufficient_buffer,
> >> +        "Not enough to read specified number of Cross Module
> References!");
> >> +  if (auto EC = Reader.readArray(Item.Imports, Item.Header->Count))
> >> +    return EC;
> >> +  return Error::success();
> >> +}
> >> +}
> >> +
> >> +Error DebugCrossModuleImportsSubsectionRef::initialize(
> >> +    BinaryStreamReader Reader) {
> >> +  return Reader.readArray(References, Reader.bytesRemaining());
> >> +}
> >> +
> >> +Error DebugCrossModuleImportsSubsectionRef::initialize(BinaryStreamRef
> Stream) {
> >> +  BinaryStreamReader Reader(Stream);
> >> +  return initialize(Reader);
> >> +}
> >> +
> >> +void DebugCrossModuleImportsSubsection::addImport(StringRef Module,
> >> +                                                  uint32_t ImportId) {
> >> +  Strings.insert(Module);
> >> +  std::vector<support::ulittle32_t> Targets =
> {support::ulittle32_t(ImportId)};
> >> +  auto Result = Mappings.insert(std::make_pair(Module, Targets));
> >> +  if (!Result.second)
> >> +    Result.first->getValue().push_back(Targets[0]);
> >> +}
> >> +
> >> +uint32_t DebugCrossModuleImportsSubsection::calculateSerializedSize()
> const {
> >> +  uint32_t Size = 0;
> >> +  for (const auto &Item : Mappings) {
> >> +    Size += sizeof(CrossModuleImport);
> >> +    Size += sizeof(support::ulittle32_t) * Item.second.size();
> >> +  }
> >> +  return Size;
> >> +}
> >> +
> >> +Error DebugCrossModuleImportsSubsection::commit(
> >> +    BinaryStreamWriter &Writer) const {
> >> +  using T = decltype(&*Mappings.begin());
> >> +  std::vector<T> Ids;
> >> +  Ids.reserve(Mappings.size());
> >> +
> >> +  for (const auto &M : Mappings)
> >> +    Ids.push_back(&M);
> >> +
> >> +  std::sort(Ids.begin(), Ids.end(), [this](const T &L1, const T &L2) {
> >> +    return Strings.getStringId(L1->getKey()) <
> >> +           Strings.getStringId(L2->getKey());
> >> +  });
> >> +
> >> +  for (const auto &Item : Ids) {
> >> +    CrossModuleImport Imp;
> >> +    Imp.ModuleNameOffset = Strings.getStringId(Item->getKey());
> >> +    Imp.Count = Item->getValue().size();
> >> +    if (auto EC = Writer.writeObject(Imp))
> >> +      return EC;
> >> +    if (auto EC = Writer.writeArray(makeArrayRef(Item->getValue())))
> >> +      return EC;
> >> +  }
> >> +  return Error::success();
> >> +}
> >>
> >> Modified: llvm/trunk/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp
> (original)
> >> +++ llvm/trunk/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp Mon
> Jun  5 16:40:33 2017
> >> @@ -38,6 +38,8 @@ Error DebugSubsectionRecord::initialize(
> >>    case DebugSubsectionKind::FileChecksums:
> >>    case DebugSubsectionKind::Lines:
> >>    case DebugSubsectionKind::InlineeLines:
> >> +  case DebugSubsectionKind::CrossScopeExports:
> >> +  case DebugSubsectionKind::CrossScopeImports:
> >>      break;
> >>    default:
> >>      llvm_unreachable("Unexpected debug fragment kind!");
> >>
> >> Modified: llvm/trunk/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp
> (original)
> >> +++ llvm/trunk/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp Mon
> Jun  5 16:40:33 2017
> >> @@ -10,6 +10,8 @@
> >>  #include "llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h"
> >>
> >>  #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
> >> +#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
> >> +#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
> >> @@ -44,6 +46,18 @@ Error llvm::codeview::visitDebugSubsecti
> >>        return EC;
> >>      return V.visitInlineeLines(Fragment);
> >>    }
> >> +  case DebugSubsectionKind::CrossScopeExports: {
> >> +    DebugCrossModuleExportsSubsectionRef Section;
> >> +    if (auto EC = Section.initialize(Reader))
> >> +      return EC;
> >> +    return V.visitCrossModuleExports(Section);
> >> +  }
> >> +  case DebugSubsectionKind::CrossScopeImports: {
> >> +    DebugCrossModuleImportsSubsectionRef Section;
> >> +    if (auto EC = Section.initialize(Reader))
> >> +      return EC;
> >> +    return V.visitCrossModuleImports(Section);
> >> +  }
> >>    default: {
> >>      DebugUnknownSubsectionRef Fragment(R.kind(), R.getRecordData());
> >>      return V.visitUnknown(Fragment);
> >>
> >> 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=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/DebugInfo/PDB/Native/ModuleDebugStream.cpp (original)
> >> +++ llvm/trunk/lib/DebugInfo/PDB/Native/ModuleDebugStream.cpp Mon Jun
> 5 16:40:33 2017
> >> @@ -90,14 +90,14 @@ Error ModuleDebugStreamRef::commit() { r
> >>
> >>  Expected<codeview::DebugChecksumsSubsectionRef>
> >>  ModuleDebugStreamRef::findChecksumsSubsection() const {
> >> +  codeview::DebugChecksumsSubsectionRef Result;
> >>    for (const auto &SS : subsections()) {
> >>      if (SS.kind() != DebugSubsectionKind::FileChecksums)
> >>        continue;
> >>
> >> -    codeview::DebugChecksumsSubsectionRef Result;
> >>      if (auto EC = Result.initialize(SS.getRecordData()))
> >>        return std::move(EC);
> >>      return Result;
> >>    }
> >> -  return make_error<RawError>(raw_error_code::no_entry);
> >> +  return Result;
> >>  }
> >>
> >> Modified: llvm/trunk/lib/DebugInfo/PDB/Native/PublicsStream.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/PDB/Native/PublicsStream.cpp?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/DebugInfo/PDB/Native/PublicsStream.cpp (original)
> >> +++ llvm/trunk/lib/DebugInfo/PDB/Native/PublicsStream.cpp Mon Jun  5
> 16:40:33 2017
> >> @@ -105,10 +105,12 @@ Error PublicsStream::reload() {
> >>                                             "Could not read a thunk
> map."));
> >>
> >>    // Something called "section map" follows.
> >> -  if (auto EC = Reader.readArray(SectionOffsets, Header->NumSections))
> >> -    return joinErrors(std::move(EC),
> >> -
> make_error<RawError>(raw_error_code::corrupt_file,
> >> -                                           "Could not read a section
> map."));
> >> +  if (Reader.bytesRemaining() > 0) {
> >> +    if (auto EC = Reader.readArray(SectionOffsets,
> Header->NumSections))
> >> +      return joinErrors(std::move(EC),
> >> +
> make_error<RawError>(raw_error_code::corrupt_file,
> >> +                                             "Could not read a section
> map."));
> >> +  }
> >>
> >>    if (Reader.bytesRemaining() > 0)
> >>      return make_error<RawError>(raw_error_code::corrupt_file,
> >>
> >> Modified: llvm/trunk/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp (original)
> >> +++ llvm/trunk/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp Mon Jun  5
> 16:40:33 2017
> >> @@ -18,6 +18,8 @@
> >>  #include "llvm/ADT/StringSwitch.h"
> >>  #include "llvm/DebugInfo/CodeView/CodeViewError.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
> >> +#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
> >> +#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
> >> @@ -38,13 +40,19 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineB
> >>  LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineInfo)
> >>  LLVM_YAML_IS_SEQUENCE_VECTOR(InlineeSite)
> >>  LLVM_YAML_IS_SEQUENCE_VECTOR(InlineeInfo)
> >> +LLVM_YAML_IS_SEQUENCE_VECTOR(CrossModuleExport)
> >> +LLVM_YAML_IS_SEQUENCE_VECTOR(YAMLCrossModuleImport)
> >>  LLVM_YAML_IS_SEQUENCE_VECTOR(StringRef)
> >> +LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(uint32_t)
> >>
> >>  LLVM_YAML_DECLARE_SCALAR_TRAITS(HexFormattedString, false)
> >>  LLVM_YAML_DECLARE_ENUM_TRAITS(DebugSubsectionKind)
> >>  LLVM_YAML_DECLARE_ENUM_TRAITS(FileChecksumKind)
> >>  LLVM_YAML_DECLARE_BITSET_TRAITS(LineFlags)
> >>
> >> +LLVM_YAML_DECLARE_MAPPING_TRAITS(CrossModuleExport)
> >> +LLVM_YAML_DECLARE_MAPPING_TRAITS(YAMLCrossModuleImport)
> >> +LLVM_YAML_DECLARE_MAPPING_TRAITS(CrossModuleImportItem)
> >>  LLVM_YAML_DECLARE_MAPPING_TRAITS(SourceLineEntry)
> >>  LLVM_YAML_DECLARE_MAPPING_TRAITS(SourceColumnEntry)
> >>  LLVM_YAML_DECLARE_MAPPING_TRAITS(SourceFileChecksumEntry)
> >> @@ -114,6 +122,35 @@ struct YAMLInlineeLinesSubsection : publ
> >>
> >>    InlineeInfo InlineeLines;
> >>  };
> >> +
> >> +struct YAMLCrossModuleExportsSubsection : public YAMLSubsectionBase {
> >> +  YAMLCrossModuleExportsSubsection()
> >> +      : YAMLSubsectionBase(DebugSubsectionKind::CrossScopeExports) {}
> >> +
> >> +  void map(IO &IO) override;
> >> +  std::unique_ptr<DebugSubsection>
> >> +  toCodeViewSubsection(DebugStringTableSubsection *Strings,
> >> +                       DebugChecksumsSubsection *Checksums) const
> override;
> >> +  static Expected<std::shared_ptr<YAMLCrossModuleExportsSubsection>>
> >> +  fromCodeViewSubsection(const DebugCrossModuleExportsSubsectionRef
> &Exports);
> >> +
> >> +  std::vector<CrossModuleExport> Exports;
> >> +};
> >> +
> >> +struct YAMLCrossModuleImportsSubsection : public YAMLSubsectionBase {
> >> +  YAMLCrossModuleImportsSubsection()
> >> +      : YAMLSubsectionBase(DebugSubsectionKind::CrossScopeImports) {}
> >> +
> >> +  void map(IO &IO) override;
> >> +  std::unique_ptr<DebugSubsection>
> >> +  toCodeViewSubsection(DebugStringTableSubsection *Strings,
> >> +                       DebugChecksumsSubsection *Checksums) const
> override;
> >> +  static Expected<std::shared_ptr<YAMLCrossModuleImportsSubsection>>
> >> +  fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings,
> >> +                         const DebugCrossModuleImportsSubsectionRef
> &Imports);
> >> +
> >> +  std::vector<YAMLCrossModuleImport> Imports;
> >> +};
> >>  }
> >>
> >>  void ScalarBitSetTraits<LineFlags>::bitset(IO &io, LineFlags &Flags) {
> >> @@ -161,6 +198,17 @@ void MappingTraits<SourceLineBlock>::map
> >>    IO.mapRequired("Columns", Obj.Columns);
> >>  }
> >>
> >> +void MappingTraits<CrossModuleExport>::mapping(IO &IO,
> CrossModuleExport &Obj) {
> >> +  IO.mapRequired("LocalId", Obj.Local);
> >> +  IO.mapRequired("GlobalId", Obj.Global);
> >> +}
> >> +
> >> +void MappingTraits<YAMLCrossModuleImport>::mapping(IO &IO,
> >> +
>  YAMLCrossModuleImport &Obj) {
> >> +  IO.mapRequired("Module", Obj.ModuleName);
> >> +  IO.mapRequired("Imports", Obj.ImportIds);
> >> +}
> >> +
> >>  void MappingTraits<SourceFileChecksumEntry>::mapping(
> >>      IO &IO, SourceFileChecksumEntry &Obj) {
> >>    IO.mapRequired("FileName", Obj.FileName);
> >> @@ -196,6 +244,16 @@ void YAMLInlineeLinesSubsection::map(IO
> >>    IO.mapRequired("Sites", InlineeLines.Sites);
> >>  }
> >>
> >> +void YAMLCrossModuleExportsSubsection::map(IO &IO) {
> >> +  IO.mapTag("!CrossModuleExports", true);
> >> +  IO.mapOptional("Exports", Exports);
> >> +}
> >> +
> >> +void YAMLCrossModuleImportsSubsection::map(IO &IO) {
> >> +  IO.mapTag("!CrossModuleImports", true);
> >> +  IO.mapOptional("Imports", Imports);
> >> +}
> >> +
> >>  void MappingTraits<YAMLDebugSubsection>::mapping(
> >>      IO &IO, YAMLDebugSubsection &Subsection) {
> >>    if (!IO.outputting()) {
> >> @@ -206,6 +264,12 @@ void MappingTraits<YAMLDebugSubsection>:
> >>        Subsection.Subsection = std::make_shared<YAMLLinesSubsection>();
> >>      } else if (IO.mapTag("!InlineeLines")) {
> >>        Subsection.Subsection =
> std::make_shared<YAMLInlineeLinesSubsection>();
> >> +    } else if (IO.mapTag("!CrossModuleExports")) {
> >> +      Subsection.Subsection =
> >> +          std::make_shared<YAMLCrossModuleExportsSubsection>();
> >> +    } else if (IO.mapTag("!CrossModuleImports")) {
> >> +      Subsection.Subsection =
> >> +          std::make_shared<YAMLCrossModuleImportsSubsection>();
> >>      } else {
> >>        llvm_unreachable("Unexpected subsection tag!");
> >>      }
> >> @@ -213,14 +277,15 @@ void MappingTraits<YAMLDebugSubsection>:
> >>    Subsection.Subsection->map(IO);
> >>  }
> >>
> >> -static Expected<const YAMLChecksumsSubsection &>
> >> +static std::shared_ptr<YAMLChecksumsSubsection>
> >>  findChecksums(ArrayRef<YAMLDebugSubsection> Subsections) {
> >>    for (const auto &SS : Subsections) {
> >>      if (SS.Subsection->Kind == DebugSubsectionKind::FileChecksums) {
> >> -      return static_cast<const YAMLChecksumsSubsection
> &>(*SS.Subsection);
> >> +      return
> std::static_pointer_cast<YAMLChecksumsSubsection>(SS.Subsection);
> >>      }
> >>    }
> >> -  return make_error<CodeViewError>(cv_error_code::no_records);
> >> +
> >> +  return nullptr;
> >>  }
> >>
> >>  std::unique_ptr<DebugSubsection>
> YAMLChecksumsSubsection::toCodeViewSubsection(
> >> @@ -285,6 +350,28 @@ YAMLInlineeLinesSubsection::toCodeViewSu
> >>    return llvm::cast<DebugSubsection>(std::move(Result));
> >>  }
> >>
> >> +std::unique_ptr<DebugSubsection>
> >> +YAMLCrossModuleExportsSubsection::toCodeViewSubsection(
> >> +    DebugStringTableSubsection *Strings,
> >> +    DebugChecksumsSubsection *Checksums) const {
> >> +  auto Result = llvm::make_unique<DebugCrossModuleExportsSubsection>();
> >> +  for (const auto &M : Exports)
> >> +    Result->addMapping(M.Local, M.Global);
> >> +  return llvm::cast<DebugSubsection>(std::move(Result));
> >> +}
> >> +
> >> +std::unique_ptr<DebugSubsection>
> >> +YAMLCrossModuleImportsSubsection::toCodeViewSubsection(
> >> +    DebugStringTableSubsection *Strings,
> >> +    DebugChecksumsSubsection *Checksums) const {
> >> +  auto Result =
> llvm::make_unique<DebugCrossModuleImportsSubsection>(*Strings);
> >> +  for (const auto &M : Imports) {
> >> +    for (const auto Id : M.ImportIds)
> >> +      Result->addImport(M.ModuleName, Id);
> >> +  }
> >> +  return llvm::cast<DebugSubsection>(std::move(Result));
> >> +}
> >> +
> >>  static Expected<SourceFileChecksumEntry>
> >>  convertOneChecksum(const DebugStringTableSubsectionRef &Strings,
> >>                     const FileChecksumEntry &CS) {
> >> @@ -391,6 +478,31 @@ YAMLInlineeLinesSubsection::fromCodeView
> >>    return Result;
> >>  }
> >>
> >> +Expected<std::shared_ptr<YAMLCrossModuleExportsSubsection>>
> >> +YAMLCrossModuleExportsSubsection::fromCodeViewSubsection(
> >> +    const DebugCrossModuleExportsSubsectionRef &Exports) {
> >> +  auto Result = std::make_shared<YAMLCrossModuleExportsSubsection>();
> >> +  Result->Exports.assign(Exports.begin(), Exports.end());
> >> +  return Result;
> >> +}
> >> +
> >> +Expected<std::shared_ptr<YAMLCrossModuleImportsSubsection>>
> >> +YAMLCrossModuleImportsSubsection::fromCodeViewSubsection(
> >> +    const DebugStringTableSubsectionRef &Strings,
> >> +    const DebugCrossModuleImportsSubsectionRef &Imports) {
> >> +  auto Result = std::make_shared<YAMLCrossModuleImportsSubsection>();
> >> +  for (const auto &CMI : Imports) {
> >> +    YAMLCrossModuleImport YCMI;
> >> +    auto ExpectedStr = Strings.getString(CMI.Header->ModuleNameOffset);
> >> +    if (!ExpectedStr)
> >> +      return ExpectedStr.takeError();
> >> +    YCMI.ModuleName = *ExpectedStr;
> >> +    YCMI.ImportIds.assign(CMI.Imports.begin(), CMI.Imports.end());
> >> +    Result->Imports.push_back(YCMI);
> >> +  }
> >> +  return Result;
> >> +}
> >> +
> >>  Expected<std::vector<std::unique_ptr<DebugSubsection>>>
> >>  llvm::CodeViewYAML::convertSubsectionList(
> >>      ArrayRef<YAMLDebugSubsection> Subsections,
> >> @@ -400,11 +512,11 @@ llvm::CodeViewYAML::convertSubsectionLis
> >>      return std::move(Result);
> >>
> >>    auto Checksums = findChecksums(Subsections);
> >> -  if (!Checksums)
> >> -    return Checksums.takeError();
> >> -  auto ChecksumsBase = Checksums->toCodeViewSubsection(&Strings,
> nullptr);
> >> -  DebugChecksumsSubsection &CS =
> >> -      llvm::cast<DebugChecksumsSubsection>(*ChecksumsBase);
> >> +  std::unique_ptr<DebugSubsection> ChecksumsBase;
> >> +  if (Checksums)
> >> +    ChecksumsBase = Checksums->toCodeViewSubsection(&Strings, nullptr);
> >> +  DebugChecksumsSubsection *CS =
> >> +      static_cast<DebugChecksumsSubsection *>(ChecksumsBase.get());
> >>    for (const auto &SS : Subsections) {
> >>      // We've already converted the checksums subsection, don't do it
> >>      // twice.
> >> @@ -412,7 +524,8 @@ llvm::CodeViewYAML::convertSubsectionLis
> >>      if (SS.Subsection->Kind == DebugSubsectionKind::FileChecksums)
> >>        CVS = std::move(ChecksumsBase);
> >>      else
> >> -      CVS = SS.Subsection->toCodeViewSubsection(&Strings, &CS);
> >> +      CVS = SS.Subsection->toCodeViewSubsection(&Strings, CS);
> >> +    assert(CVS != nullptr);
> >>      Result.push_back(std::move(CVS));
> >>    }
> >>    return std::move(Result);
> >> @@ -429,6 +542,10 @@ struct SubsectionConversionVisitor : pub
> >>    Error visitLines(DebugLinesSubsectionRef &Lines) override;
> >>    Error visitFileChecksums(DebugChecksumsSubsectionRef &Checksums)
> override;
> >>    Error visitInlineeLines(DebugInlineeLinesSubsectionRef &Inlinees)
> override;
> >> +  Error visitCrossModuleExports(
> >> +      DebugCrossModuleExportsSubsectionRef &Checksums) override;
> >> +  Error visitCrossModuleImports(
> >> +      DebugCrossModuleImportsSubsectionRef &Inlinees) override;
> >>
> >>    YAMLDebugSubsection Subsection;
> >>
> >> @@ -468,6 +585,26 @@ Error SubsectionConversionVisitor::visit
> >>    if (!Result)
> >>      return Result.takeError();
> >>    Subsection.Subsection = *Result;
> >> +  return Error::success();
> >> +}
> >> +
> >> +Error SubsectionConversionVisitor::visitCrossModuleExports(
> >> +    DebugCrossModuleExportsSubsectionRef &Exports) {
> >> +  auto Result =
> >> +
> YAMLCrossModuleExportsSubsection::fromCodeViewSubsection(Exports);
> >> +  if (!Result)
> >> +    return Result.takeError();
> >> +  Subsection.Subsection = *Result;
> >> +  return Error::success();
> >> +}
> >> +
> >> +Error SubsectionConversionVisitor::visitCrossModuleImports(
> >> +    DebugCrossModuleImportsSubsectionRef &Imports) {
> >> +  auto Result =
> YAMLCrossModuleImportsSubsection::fromCodeViewSubsection(
> >> +      Strings, Imports);
> >> +  if (!Result)
> >> +    return Result.takeError();
> >> +  Subsection.Subsection = *Result;
> >>    return Error::success();
> >>  }
> >>  }
> >>
> >> Modified: llvm/trunk/lib/ObjectYAML/CodeViewYAMLSymbols.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/CodeViewYAMLSymbols.cpp?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/ObjectYAML/CodeViewYAMLSymbols.cpp (original)
> >> +++ llvm/trunk/lib/ObjectYAML/CodeViewYAMLSymbols.cpp Mon Jun  5
> 16:40:33 2017
> >> @@ -47,6 +47,18 @@ LLVM_YAML_DECLARE_ENUM_TRAITS(RegisterId
> >>  LLVM_YAML_DECLARE_ENUM_TRAITS(TrampolineType)
> >>  LLVM_YAML_DECLARE_ENUM_TRAITS(ThunkOrdinal)
> >>
> >> +LLVM_YAML_STRONG_TYPEDEF(llvm::StringRef, TypeName)
> >> +
> >> +LLVM_YAML_DECLARE_SCALAR_TRAITS(TypeName, true)
> >> +
> >> +StringRef ScalarTraits<TypeName>::input(StringRef S, void *V, TypeName
> &T) {
> >> +  return ScalarTraits<StringRef>::input(S, V, T.value);
> >> +}
> >> +void ScalarTraits<TypeName>::output(const TypeName &T, void *V,
> >> +                                    llvm::raw_ostream &R) {
> >> +  ScalarTraits<StringRef>::output(T.value, V, R);
> >> +}
> >> +
> >>  void ScalarEnumerationTraits<SymbolKind>::enumeration(IO &io,
> >>                                                        SymbolKind
> &Value) {
> >>    auto SymbolNames = getSymbolTypeNames();
> >> @@ -264,6 +276,7 @@ template <> void SymbolRecordImpl<Inline
> >>  template <> void SymbolRecordImpl<LocalSym>::map(IO &IO) {
> >>    IO.mapRequired("Type", Symbol.Type);
> >>    IO.mapRequired("Flags", Symbol.Flags);
> >> +
> >>    IO.mapRequired("VarName", Symbol.Name);
> >>  }
> >>
> >>
> >> Added:
> llvm/trunk/test/DebugInfo/PDB/Inputs/cross-module-import-export.yaml
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/Inputs/cross-module-import-export.yaml?rev=304738&view=auto
> >>
> ==============================================================================
> >> ---
> llvm/trunk/test/DebugInfo/PDB/Inputs/cross-module-import-export.yaml (added)
> >> +++
> llvm/trunk/test/DebugInfo/PDB/Inputs/cross-module-import-export.yaml Mon
> Jun  5 16:40:33 2017
> >> @@ -0,0 +1,24 @@
> >> +DbiStream:
> >> +  Modules:
> >> +    - Module:          'Foo.obj'
> >> +      ObjFile:         'Foo.obj'
> >> +      Subsections:
> >> +        - !CrossModuleExports
> >> +          Exports:
> >> +            - LocalId:         4852
> >> +              GlobalId:        9283
> >> +            - LocalId:         2147487875 <(214)%20748-7875>
> >> +              GlobalId:        9123
> >> +    - Module:          'Bar.obj'
> >> +      ObjFile:         'Bar.obj'
> >> +      Subsections:
> >> +        - !CrossModuleExports
> >> +          Exports:
> >> +            - LocalId:         4265
> >> +              GlobalId:        6097
> >> +            - LocalId:         4297
> >> +              GlobalId:        4677
> >> +        - !CrossModuleImports
> >> +          Imports:
> >> +            - Module:          'Foo.obj'
> >> +              Imports:         [ 4852, 2147487875 <(214)%20748-7875> ]
> >>
> >> Added: llvm/trunk/test/DebugInfo/PDB/cross-module-import-export.test
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/cross-module-import-export.test?rev=304738&view=auto
> >>
> ==============================================================================
> >> --- llvm/trunk/test/DebugInfo/PDB/cross-module-import-export.test
> (added)
> >> +++ llvm/trunk/test/DebugInfo/PDB/cross-module-import-export.test Mon
> Jun  5 16:40:33 2017
> >> @@ -0,0 +1,60 @@
> >> +; RUN: llvm-pdbdump yaml2pdb -pdb=%t.pdb
> %p/Inputs/cross-module-import-export.yaml
> >> +
> >> +; RUN: llvm-pdbdump pdb2yaml -all -no-file-headers %t.pdb | FileCheck
> --check-prefix=YAML %s
> >> +; RUN: llvm-pdbdump raw -all %t.pdb | FileCheck --check-prefix=RAW %s
> >> +
> >> +YAML:      Modules:
> >> +YAML-NEXT:   - Module:          Foo.obj
> >> +YAML-NEXT:     ObjFile:         Foo.obj
> >> +YAML-NEXT:     Subsections:
> >> +YAML-NEXT:       - !CrossModuleExports
> >> +YAML-NEXT:         Exports:
> >> +YAML-NEXT:           - LocalId:         4852
> >> +YAML-NEXT:             GlobalId:        9283
> >> +YAML-NEXT:           - LocalId:         2147487875 <(214)%20748-7875>
> >> +YAML-NEXT:             GlobalId:        9123
> >> +YAML:        - Module:          Bar.obj
> >> +YAML-NEXT:     ObjFile:         Bar.obj
> >> +YAML-NEXT:     Subsections:
> >> +YAML-NEXT:       - !CrossModuleExports
> >> +YAML-NEXT:         Exports:
> >> +YAML-NEXT:           - LocalId:         4265
> >> +YAML-NEXT:             GlobalId:        6097
> >> +YAML-NEXT:           - LocalId:         4297
> >> +YAML-NEXT:             GlobalId:        4677
> >> +YAML-NEXT:       - !CrossModuleImports
> >> +YAML-NEXT:         Imports:
> >> +YAML-NEXT:           - Module:          Foo.obj
> >> +YAML-NEXT:             Imports:         [ 4852, 2147487875
> <(214)%20748-7875> ]
> >> +
> >> +
> >> +RAW:      DBI Stream {
> >> +RAW:        Modules [
> >> +RAW-NEXT:     {
> >> +RAW-NEXT:       Name: Foo.obj
> >> +RAW:            LineInfo [
> >> +RAW-NEXT:         CrossModuleExports {
> >> +RAW-NEXT:           Local: 0x12F4
> >> +RAW-NEXT:           Global: 0x2443
> >> +RAW-NEXT:           Local: 0x80001083
> >> +RAW-NEXT:           Global: 0x23A3
> >> +RAW-NEXT:         }
> >> +RAW-NEXT:       ]
> >> +RAW-NEXT:     }
> >> +RAW-NEXT:     {
> >> +RAW-NEXT:       Name: Bar.obj
> >> +RAW:            LineInfo [
> >> +RAW-NEXT:         CrossModuleExports {
> >> +RAW-NEXT:           Local: 0x10A9
> >> +RAW-NEXT:           Global: 0x17D1
> >> +RAW-NEXT:           Local: 0x10C9
> >> +RAW-NEXT:           Global: 0x1245
> >> +RAW-NEXT:         }
> >> +RAW-NEXT:         CrossModuleImports {
> >> +RAW-NEXT:           Module: Foo.obj
> >> +RAW-NEXT:           Imports: [0x12F4, 0x80001083]
> >> +RAW-NEXT:         }
> >> +RAW-NEXT:       ]
> >> +RAW-NEXT:     }
> >> +RAW-NEXT:   ]
> >> +RAW-NEXT: }
> >> \ No newline at end of file
> >>
> >> Modified: llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp (original)
> >> +++ llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.cpp Mon Jun
> 5 16:40:33 2017
> >> @@ -10,6 +10,8 @@
> >>  #include "C13DebugFragmentVisitor.h"
> >>
> >>  #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
> >> +#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
> >> +#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
> >>  #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
> >> @@ -48,18 +50,34 @@ Error C13DebugFragmentVisitor::visitInli
> >>    return Error::success();
> >>  }
> >>
> >> +Error C13DebugFragmentVisitor::visitCrossModuleExports(
> >> +    codeview::DebugCrossModuleExportsSubsectionRef &Exports) {
> >> +  this->CrossExports.push_back(Exports);
> >> +  return Error::success();
> >> +}
> >> +
> >> +Error C13DebugFragmentVisitor::visitCrossModuleImports(
> >> +    codeview::DebugCrossModuleImportsSubsectionRef &Imports) {
> >> +  this->CrossImports.push_back(Imports);
> >> +  return Error::success();
> >> +}
> >> +
> >>  Error C13DebugFragmentVisitor::finished() {
> >> -  if (!Checksums.hasValue()) {
> >> -    assert(Lines.empty());
> >> -    return Error::success();
> >> +  if (Checksums.hasValue()) {
> >> +    if (auto EC = handleFileChecksums())
> >> +      return EC;
> >> +
> >> +    if (auto EC = handleLines())
> >> +      return EC;
> >> +
> >> +    if (auto EC = handleInlineeLines())
> >> +      return EC;
> >>    }
> >> -  if (auto EC = handleFileChecksums())
> >> -    return EC;
> >>
> >> -  if (auto EC = handleLines())
> >> +  if (auto EC = handleCrossModuleExports())
> >>      return EC;
> >>
> >> -  if (auto EC = handleInlineeLines())
> >> +  if (auto EC = handleCrossModuleImports())
> >>      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=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.h (original)
> >> +++ llvm/trunk/tools/llvm-pdbdump/C13DebugFragmentVisitor.h Mon Jun  5
> 16:40:33 2017
> >> @@ -38,12 +38,20 @@ public:
> >>    Error
> >>    visitInlineeLines(codeview::DebugInlineeLinesSubsectionRef &Lines)
> final;
> >>
> >> +  Error visitCrossModuleExports(
> >> +      codeview::DebugCrossModuleExportsSubsectionRef &Lines) final;
> >> +
> >> +  Error visitCrossModuleImports(
> >> +      codeview::DebugCrossModuleImportsSubsectionRef &Imports) final;
> >> +
> >>    Error finished() final;
> >>
> >>  protected:
> >>    virtual Error handleFileChecksums() { return Error::success(); }
> >>    virtual Error handleLines() { return Error::success(); }
> >>    virtual Error handleInlineeLines() { return Error::success(); }
> >> +  virtual Error handleCrossModuleExports() { return Error::success(); }
> >> +  virtual Error handleCrossModuleImports() { return Error::success(); }
> >>
> >>    Expected<StringRef> getNameFromStringTable(uint32_t Offset);
> >>    Expected<StringRef> getNameFromChecksumsBuffer(uint32_t Offset);
> >> @@ -51,6 +59,8 @@ protected:
> >>    Optional<codeview::DebugChecksumsSubsectionRef> Checksums;
> >>    std::vector<codeview::DebugInlineeLinesSubsectionRef> InlineeLines;
> >>    std::vector<codeview::DebugLinesSubsectionRef> Lines;
> >> +  std::vector<codeview::DebugCrossModuleExportsSubsectionRef>
> CrossExports;
> >> +  std::vector<codeview::DebugCrossModuleImportsSubsectionRef>
> CrossImports;
> >>
> >>    PDBFile &F;
> >>  };
> >>
> >> Modified: llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp (original)
> >> +++ llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp Mon Jun  5
> 16:40:33 2017
> >> @@ -16,6 +16,8 @@
> >>
> >>  #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
> >> +#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
> >> +#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h"
> >> @@ -172,6 +174,32 @@ public:
> >>        }
> >>      }
> >>      return Error::success();
> >> +  }
> >> +
> >> +  Error handleCrossModuleExports() override {
> >> +    for (const auto &M : CrossExports) {
> >> +      DictScope D(P, "CrossModuleExports");
> >> +      for (const auto &E : M) {
> >> +        P.printHex("Local", E.Local);
> >> +        P.printHex("Global", E.Global);
> >> +      }
> >> +    }
> >> +    return Error::success();
> >> +  }
> >> +
> >> +  Error handleCrossModuleImports() override {
> >> +    for (const auto &M : CrossImports) {
> >> +      DictScope D(P, "CrossModuleImports");
> >> +      for (const auto &ImportGroup : M) {
> >> +        auto Name =
> >> +
> getNameFromStringTable(ImportGroup.Header->ModuleNameOffset);
> >> +        if (!Name)
> >> +          return Name.takeError();
> >> +        P.printString("Module", *Name);
> >> +        P.printHexList("Imports", ImportGroup.Imports);
> >> +      }
> >> +    }
> >> +    return Error::success();
> >>    }
> >>
> >>  private:
> >>
> >> Modified: llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp?rev=304738&r1=304737&r2=304738&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp (original)
> >> +++ llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp Mon Jun  5
> 16:40:33 2017
> >> @@ -17,7 +17,6 @@
> >>  #include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugSubsection.h"
> >> -#include "llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h"
> >>  #include "llvm/DebugInfo/CodeView/DebugUnknownSubsection.h"
> >>  #include "llvm/DebugInfo/CodeView/Line.h"
> >>  #include "llvm/DebugInfo/MSF/MappedBlockStream.h"
> >>
> >>
> >> _______________________________________________
> >> 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/20170606/ac096c0c/attachment.html>


More information about the llvm-commits mailing list