[llvm] r304738 - [CodeView] Handle Cross Module Imports and Exports.
Zachary Turner via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 6 16:55:26 PDT 2017
Should be fixed in r304846.
On Tue, Jun 6, 2017 at 4:43 PM Zachary Turner <zturner at google.com> wrote:
> 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/90cce477/attachment-0001.html>
More information about the llvm-commits
mailing list