From 76c210df336442c8a8baccc8c8c49349bea0933c Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Wed, 14 Jun 2017 06:24:24 +0000 Subject: [PATCH] Revert "[codeview] Make obj2yaml/yaml2obj support .debug$S..." This is causing failures on linux bots with an invalid stream read. It doesn't repro in any configuration on Windows, so reverting until I have a chance to investigate on Linux. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@305371 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../CodeView/DebugFrameDataSubsection.h | 1 - .../CodeView/DebugSubsectionRecord.h | 7 +- .../CodeView/DebugSubsectionVisitor.h | 80 ++++- .../DebugInfo/CodeView/StringsAndChecksums.h | 104 ------ .../PDB/Native/DbiModuleDescriptorBuilder.h | 2 +- .../PDB/Native/PDBStringTableBuilder.h | 5 +- include/llvm/ObjectYAML/COFFYAML.h | 4 - .../ObjectYAML/CodeViewYAMLDebugSections.h | 25 +- include/llvm/ObjectYAML/CodeViewYAMLTypes.h | 3 - lib/DebugInfo/CodeView/CMakeLists.txt | 3 +- .../CodeView/DebugStringTableSubsection.cpp | 5 - .../CodeView/DebugSubsectionRecord.cpp | 2 +- .../CodeView/DebugSubsectionVisitor.cpp | 37 +- .../CodeView/StringsAndChecksums.cpp | 48 --- .../PDB/Native/DbiModuleDescriptorBuilder.cpp | 2 +- .../PDB/Native/PDBStringTableBuilder.cpp | 5 - lib/ObjectYAML/COFFYAML.cpp | 11 +- lib/ObjectYAML/CodeViewYAMLDebugSections.cpp | 327 +++++++++--------- lib/ObjectYAML/CodeViewYAMLTypes.cpp | 40 --- tools/llvm-pdbutil/LLVMOutputStyle.cpp | 27 +- tools/llvm-pdbutil/YAMLOutputStyle.cpp | 7 +- tools/llvm-pdbutil/llvm-pdbutil.cpp | 17 +- tools/obj2yaml/coff2yaml.cpp | 57 --- tools/yaml2obj/yaml2coff.cpp | 56 --- 24 files changed, 308 insertions(+), 567 deletions(-) delete mode 100644 include/llvm/DebugInfo/CodeView/StringsAndChecksums.h delete mode 100644 lib/DebugInfo/CodeView/StringsAndChecksums.cpp diff --git a/include/llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h b/include/llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h index 1e329c7c3f1..686b5c4f242 100644 --- a/include/llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h +++ b/include/llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h @@ -49,7 +49,6 @@ public: Error commit(BinaryStreamWriter &Writer) const override; void addFrameData(const FrameData &Frame); - void setFrames(ArrayRef Frames); private: std::vector Frames; diff --git a/include/llvm/DebugInfo/CodeView/DebugSubsectionRecord.h b/include/llvm/DebugInfo/CodeView/DebugSubsectionRecord.h index 69473174206..49a269d92e3 100644 --- a/include/llvm/DebugInfo/CodeView/DebugSubsectionRecord.h +++ b/include/llvm/DebugInfo/CodeView/DebugSubsectionRecord.h @@ -49,13 +49,13 @@ private: class DebugSubsectionRecordBuilder { public: - DebugSubsectionRecordBuilder(std::shared_ptr Subsection, + DebugSubsectionRecordBuilder(std::unique_ptr Subsection, CodeViewContainer Container); uint32_t calculateSerializedLength(); Error commit(BinaryStreamWriter &Writer) const; private: - std::shared_ptr Subsection; + std::unique_ptr Subsection; CodeViewContainer Container; }; @@ -64,9 +64,6 @@ private: template <> struct VarStreamArrayExtractor { Error operator()(BinaryStreamRef Stream, uint32_t &Length, codeview::DebugSubsectionRecord &Info) { - // FIXME: We need to pass the container type through to this function. In - // practice this isn't super important since the subsection header describes - // its length and we can just skip it. It's more important when writing. if (auto EC = codeview::DebugSubsectionRecord::initialize( Stream, Info, codeview::CodeViewContainer::Pdb)) return EC; diff --git a/include/llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h b/include/llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h index 75f749dfa93..d4a3d9195a3 100644 --- a/include/llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h +++ b/include/llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h @@ -12,7 +12,6 @@ #include "llvm/DebugInfo/CodeView/CodeView.h" #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" -#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" #include "llvm/Support/Error.h" #include @@ -31,7 +30,56 @@ class DebugStringTableSubsectionRef; class DebugSymbolRVASubsectionRef; class DebugSymbolsSubsectionRef; class DebugUnknownSubsectionRef; -class StringsAndChecksumsRef; + +struct DebugSubsectionState { +public: + // If no subsections are known about initially, we find as much as we can. + DebugSubsectionState(); + + // If only a string table subsection is given, we find a checksums subsection. + explicit DebugSubsectionState(const DebugStringTableSubsectionRef &Strings); + + // If both subsections are given, we don't need to find anything. + DebugSubsectionState(const DebugStringTableSubsectionRef &Strings, + const DebugChecksumsSubsectionRef &Checksums); + + template void initialize(T &&FragmentRange) { + for (const DebugSubsectionRecord &R : FragmentRange) { + if (Strings && Checksums) + return; + if (R.kind() == DebugSubsectionKind::FileChecksums) { + initializeChecksums(R); + continue; + } + if (R.kind() == DebugSubsectionKind::StringTable && !Strings) { + // While in practice we should never encounter a string table even + // though the string table is already initialized, in theory it's + // possible. PDBs are supposed to have one global string table and + // then this subsection should not appear. Whereas object files are + // supposed to have this subsection appear exactly once. However, + // for testing purposes it's nice to be able to test this subsection + // independently of one format or the other, so for some tests we + // manually construct a PDB that contains this subsection in addition + // to a global string table. + initializeStrings(R); + continue; + } + } + } + + const DebugStringTableSubsectionRef &strings() const { return *Strings; } + const DebugChecksumsSubsectionRef &checksums() const { return *Checksums; } + +private: + void initializeStrings(const DebugSubsectionRecord &SR); + void initializeChecksums(const DebugSubsectionRecord &FCR); + + std::unique_ptr OwnedStrings; + std::unique_ptr OwnedChecksums; + + const DebugStringTableSubsectionRef *Strings = nullptr; + const DebugChecksumsSubsectionRef *Checksums = nullptr; +}; class DebugSubsectionVisitor { public: @@ -41,38 +89,38 @@ public: return Error::success(); } virtual Error visitLines(DebugLinesSubsectionRef &Lines, - const StringsAndChecksumsRef &State) = 0; + const DebugSubsectionState &State) = 0; virtual Error visitFileChecksums(DebugChecksumsSubsectionRef &Checksums, - const StringsAndChecksumsRef &State) = 0; + const DebugSubsectionState &State) = 0; virtual Error visitInlineeLines(DebugInlineeLinesSubsectionRef &Inlinees, - const StringsAndChecksumsRef &State) = 0; + const DebugSubsectionState &State) = 0; virtual Error visitCrossModuleExports(DebugCrossModuleExportsSubsectionRef &CSE, - const StringsAndChecksumsRef &State) = 0; + const DebugSubsectionState &State) = 0; virtual Error visitCrossModuleImports(DebugCrossModuleImportsSubsectionRef &CSE, - const StringsAndChecksumsRef &State) = 0; + const DebugSubsectionState &State) = 0; virtual Error visitStringTable(DebugStringTableSubsectionRef &ST, - const StringsAndChecksumsRef &State) = 0; + const DebugSubsectionState &State) = 0; virtual Error visitSymbols(DebugSymbolsSubsectionRef &CSE, - const StringsAndChecksumsRef &State) = 0; + const DebugSubsectionState &State) = 0; virtual Error visitFrameData(DebugFrameDataSubsectionRef &FD, - const StringsAndChecksumsRef &State) = 0; + const DebugSubsectionState &State) = 0; virtual Error visitCOFFSymbolRVAs(DebugSymbolRVASubsectionRef &RVAs, - const StringsAndChecksumsRef &State) = 0; + const DebugSubsectionState &State) = 0; }; Error visitDebugSubsection(const DebugSubsectionRecord &R, DebugSubsectionVisitor &V, - const StringsAndChecksumsRef &State); + const DebugSubsectionState &State); namespace detail { template Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V, - StringsAndChecksumsRef &State) { + DebugSubsectionState &State) { State.initialize(std::forward(FragmentRange)); for (const DebugSubsectionRecord &L : FragmentRange) { @@ -85,7 +133,7 @@ Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V, template Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V) { - StringsAndChecksumsRef State; + DebugSubsectionState State; return detail::visitDebugSubsections(std::forward(FragmentRange), V, State); } @@ -93,7 +141,7 @@ Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V) { template Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V, const DebugStringTableSubsectionRef &Strings) { - StringsAndChecksumsRef State(Strings); + DebugSubsectionState State(Strings); return detail::visitDebugSubsections(std::forward(FragmentRange), V, State); } @@ -102,7 +150,7 @@ template Error visitDebugSubsections(T &&FragmentRange, DebugSubsectionVisitor &V, const DebugStringTableSubsectionRef &Strings, const DebugChecksumsSubsectionRef &Checksums) { - StringsAndChecksumsRef State(Strings, Checksums); + DebugSubsectionState State(Strings, Checksums); return detail::visitDebugSubsections(std::forward(FragmentRange), V, State); } diff --git a/include/llvm/DebugInfo/CodeView/StringsAndChecksums.h b/include/llvm/DebugInfo/CodeView/StringsAndChecksums.h deleted file mode 100644 index 4fe5d450e2e..00000000000 --- a/include/llvm/DebugInfo/CodeView/StringsAndChecksums.h +++ /dev/null @@ -1,104 +0,0 @@ -//===- StringsAndChecksums.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_STRINGS_AND_CHECKSUMS_H -#define LLVM_DEBUGINFO_CODEVIEW_STRINGS_AND_CHECKSUMS_H - -#include "llvm/DebugInfo/CodeView/CodeView.h" -#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" - -#include - -namespace llvm { -namespace codeview { - -class DebugSubsectionRecord; -class DebugChecksumsSubsectionRef; -class DebugStringTableSubsectionRef; -class DebugChecksumsSubsection; -class DebugStringTableSubsection; - -class StringsAndChecksumsRef { -public: - // If no subsections are known about initially, we find as much as we can. - StringsAndChecksumsRef(); - - // If only a string table subsection is given, we find a checksums subsection. - explicit StringsAndChecksumsRef(const DebugStringTableSubsectionRef &Strings); - - // If both subsections are given, we don't need to find anything. - StringsAndChecksumsRef(const DebugStringTableSubsectionRef &Strings, - const DebugChecksumsSubsectionRef &Checksums); - - template void initialize(T &&FragmentRange) { - for (const DebugSubsectionRecord &R : FragmentRange) { - if (Strings && Checksums) - return; - if (R.kind() == DebugSubsectionKind::FileChecksums) { - initializeChecksums(R); - continue; - } - if (R.kind() == DebugSubsectionKind::StringTable && !Strings) { - // While in practice we should never encounter a string table even - // though the string table is already initialized, in theory it's - // possible. PDBs are supposed to have one global string table and - // then this subsection should not appear. Whereas object files are - // supposed to have this subsection appear exactly once. However, - // for testing purposes it's nice to be able to test this subsection - // independently of one format or the other, so for some tests we - // manually construct a PDB that contains this subsection in addition - // to a global string table. - initializeStrings(R); - continue; - } - } - } - - const DebugStringTableSubsectionRef &strings() const { return *Strings; } - const DebugChecksumsSubsectionRef &checksums() const { return *Checksums; } - - bool hasStrings() const { return Strings != nullptr; } - bool hasChecksums() const { return Checksums != nullptr; } - -private: - void initializeStrings(const DebugSubsectionRecord &SR); - void initializeChecksums(const DebugSubsectionRecord &FCR); - - std::unique_ptr OwnedStrings; - std::unique_ptr OwnedChecksums; - - const DebugStringTableSubsectionRef *Strings = nullptr; - const DebugChecksumsSubsectionRef *Checksums = nullptr; -}; - -class StringsAndChecksums { -public: - using StringsPtr = std::shared_ptr; - using ChecksumsPtr = std::shared_ptr; - // If no subsections are known about initially, we find as much as we can. - StringsAndChecksums() {} - - void setStrings(const StringsPtr &SP) { Strings = SP; } - void setChecksums(const ChecksumsPtr &CP) { Checksums = CP; } - - const StringsPtr &strings() const { return Strings; } - const ChecksumsPtr &checksums() const { return Checksums; } - - bool hasStrings() const { return Strings != nullptr; } - bool hasChecksums() const { return Checksums != nullptr; } - -private: - StringsPtr Strings; - ChecksumsPtr Checksums; -}; - -} // namespace codeview -} // namespace llvm - -#endif diff --git a/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h b/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h index a89e26ae943..8d2049ad225 100644 --- a/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h +++ b/include/llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h @@ -50,7 +50,7 @@ public: void addSymbol(codeview::CVSymbol Symbol); void - addDebugSubsection(std::shared_ptr Subsection); + addDebugSubsection(std::unique_ptr Subsection); uint16_t getStreamIndex() const; StringRef getModuleName() const { return ModuleName; } diff --git a/include/llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h b/include/llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h index b57707ee792..0faa02dc452 100644 --- a/include/llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h +++ b/include/llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h @@ -41,7 +41,10 @@ public: uint32_t calculateSerializedSize() const; Error commit(BinaryStreamWriter &Writer) const; - void setStrings(const codeview::DebugStringTableSubsection &Strings); + codeview::DebugStringTableSubsection &getStrings() { return Strings; } + const codeview::DebugStringTableSubsection &getStrings() const { + return Strings; + } private: uint32_t calculateHashTableSize() const; diff --git a/include/llvm/ObjectYAML/COFFYAML.h b/include/llvm/ObjectYAML/COFFYAML.h index 719cb1acf6e..1b5f7b00239 100644 --- a/include/llvm/ObjectYAML/COFFYAML.h +++ b/include/llvm/ObjectYAML/COFFYAML.h @@ -16,8 +16,6 @@ #include "llvm/ADT/Optional.h" #include "llvm/BinaryFormat/COFF.h" -#include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h" -#include "llvm/ObjectYAML/CodeViewYAMLTypes.h" #include "llvm/ObjectYAML/YAML.h" namespace llvm { @@ -58,8 +56,6 @@ namespace COFFYAML { COFF::section Header; unsigned Alignment = 0; yaml::BinaryRef SectionData; - std::vector DebugS; - std::vector DebugT; std::vector Relocations; StringRef Name; Section(); diff --git a/include/llvm/ObjectYAML/CodeViewYAMLDebugSections.h b/include/llvm/ObjectYAML/CodeViewYAMLDebugSections.h index 8180e0fc83f..faa3ed8a6c5 100644 --- a/include/llvm/ObjectYAML/CodeViewYAMLDebugSections.h +++ b/include/llvm/ObjectYAML/CodeViewYAMLDebugSections.h @@ -28,8 +28,6 @@ class DebugStringTableSubsectionRef; class DebugChecksumsSubsectionRef; class DebugStringTableSubsection; class DebugChecksumsSubsection; -class StringsAndChecksums; -class StringsAndChecksumsRef; } namespace CodeViewYAML { @@ -105,24 +103,25 @@ struct InlineeInfo { struct YAMLDebugSubsection { static Expected - fromCodeViewSubection(const codeview::StringsAndChecksumsRef &SC, + fromCodeViewSubection(const codeview::DebugStringTableSubsectionRef &Strings, + const codeview::DebugChecksumsSubsectionRef &Checksums, const codeview::DebugSubsectionRecord &SS); std::shared_ptr Subsection; }; -struct DebugSubsectionState {}; - -Expected>> +Expected>> toCodeViewSubsectionList(BumpPtrAllocator &Allocator, ArrayRef Subsections, - const codeview::StringsAndChecksums &SC); - -std::vector -fromDebugS(ArrayRef Data, const codeview::StringsAndChecksumsRef &SC); - -void initializeStringsAndChecksums(ArrayRef Sections, - codeview::StringsAndChecksums &SC); + codeview::DebugStringTableSubsection &Strings); +Expected>> +toCodeViewSubsectionList( + BumpPtrAllocator &Allocator, ArrayRef Subsections, + std::unique_ptr &TakeStrings, + codeview::DebugStringTableSubsection *StringsRef); + +std::unique_ptr +findStringTable(ArrayRef Sections); } // namespace CodeViewYAML } // namespace llvm diff --git a/include/llvm/ObjectYAML/CodeViewYAMLTypes.h b/include/llvm/ObjectYAML/CodeViewYAMLTypes.h index e97d5f92bf7..91b75aabe7a 100644 --- a/include/llvm/ObjectYAML/CodeViewYAMLTypes.h +++ b/include/llvm/ObjectYAML/CodeViewYAMLTypes.h @@ -41,9 +41,6 @@ struct LeafRecord { codeview::CVType toCodeViewRecord(codeview::TypeTableBuilder &TS) const; static Expected fromCodeViewRecord(codeview::CVType Type); }; - -std::vector fromDebugT(ArrayRef DebugT); -ArrayRef toDebugT(ArrayRef, BumpPtrAllocator &Alloc); } // namespace CodeViewYAML } // namespace llvm diff --git a/lib/DebugInfo/CodeView/CMakeLists.txt b/lib/DebugInfo/CodeView/CMakeLists.txt index f916695a843..2f9e8981b69 100644 --- a/lib/DebugInfo/CodeView/CMakeLists.txt +++ b/lib/DebugInfo/CodeView/CMakeLists.txt @@ -20,7 +20,6 @@ add_llvm_library(LLVMDebugInfoCodeView LazyRandomTypeCollection.cpp Line.cpp RecordSerialization.cpp - StringsAndChecksums.cpp SymbolRecordMapping.cpp SymbolDumper.cpp SymbolSerializer.cpp @@ -33,7 +32,7 @@ add_llvm_library(LLVMDebugInfoCodeView TypeSerializer.cpp TypeStreamMerger.cpp TypeTableCollection.cpp - + ADDITIONAL_HEADER_DIRS ${LLVM_MAIN_INCLUDE_DIR}/llvm/DebugInfo/CodeView ) diff --git a/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp b/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp index de02525270c..6e647c4b976 100644 --- a/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp +++ b/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp @@ -58,10 +58,6 @@ Error DebugStringTableSubsection::commit(BinaryStreamWriter &Writer) const { uint32_t Begin = Writer.getOffset(); uint32_t End = Begin + StringSize; - // Write a null string at the beginning. - if (auto EC = Writer.writeCString(StringRef())) - return EC; - for (auto &Pair : Strings) { StringRef S = Pair.getKey(); uint32_t Offset = Begin + Pair.getValue(); @@ -72,7 +68,6 @@ Error DebugStringTableSubsection::commit(BinaryStreamWriter &Writer) const { } Writer.setOffset(End); - assert((End - Begin) == StringSize); return Error::success(); } diff --git a/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp b/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp index 334c5e002bb..e9124e68fe8 100644 --- a/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp +++ b/lib/DebugInfo/CodeView/DebugSubsectionRecord.cpp @@ -50,7 +50,7 @@ DebugSubsectionKind DebugSubsectionRecord::kind() const { return Kind; } BinaryStreamRef DebugSubsectionRecord::getRecordData() const { return Data; } DebugSubsectionRecordBuilder::DebugSubsectionRecordBuilder( - std::shared_ptr Subsection, CodeViewContainer Container) + std::unique_ptr Subsection, CodeViewContainer Container) : Subsection(std::move(Subsection)), Container(Container) {} uint32_t DebugSubsectionRecordBuilder::calculateSerializedLength() { diff --git a/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp b/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp index 9b824333369..8550107741c 100644 --- a/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp +++ b/lib/DebugInfo/CodeView/DebugSubsectionVisitor.cpp @@ -26,9 +26,40 @@ using namespace llvm; using namespace llvm::codeview; -Error llvm::codeview::visitDebugSubsection( - const DebugSubsectionRecord &R, DebugSubsectionVisitor &V, - const StringsAndChecksumsRef &State) { +DebugSubsectionState::DebugSubsectionState() {} + +DebugSubsectionState::DebugSubsectionState( + const DebugStringTableSubsectionRef &Strings) + : Strings(&Strings) {} + +DebugSubsectionState::DebugSubsectionState( + const DebugStringTableSubsectionRef &Strings, + const DebugChecksumsSubsectionRef &Checksums) + : Strings(&Strings), Checksums(&Checksums) {} + +void DebugSubsectionState::initializeStrings(const DebugSubsectionRecord &SR) { + assert(SR.kind() == DebugSubsectionKind::StringTable); + assert(!Strings && "Found a string table even though we already have one!"); + + OwnedStrings = llvm::make_unique(); + consumeError(OwnedStrings->initialize(SR.getRecordData())); + Strings = OwnedStrings.get(); +} + +void DebugSubsectionState::initializeChecksums( + const DebugSubsectionRecord &FCR) { + assert(FCR.kind() == DebugSubsectionKind::FileChecksums); + if (Checksums) + return; + + OwnedChecksums = llvm::make_unique(); + consumeError(OwnedChecksums->initialize(FCR.getRecordData())); + Checksums = OwnedChecksums.get(); +} + +Error llvm::codeview::visitDebugSubsection(const DebugSubsectionRecord &R, + DebugSubsectionVisitor &V, + const DebugSubsectionState &State) { BinaryStreamReader Reader(R.getRecordData()); switch (R.kind()) { case DebugSubsectionKind::Lines: { diff --git a/lib/DebugInfo/CodeView/StringsAndChecksums.cpp b/lib/DebugInfo/CodeView/StringsAndChecksums.cpp deleted file mode 100644 index ccd9aba45ea..00000000000 --- a/lib/DebugInfo/CodeView/StringsAndChecksums.cpp +++ /dev/null @@ -1,48 +0,0 @@ -//===- StringsAndChecksums.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/StringsAndChecksums.h" -#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" -#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h" -#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" - -using namespace llvm; -using namespace llvm::codeview; - -StringsAndChecksumsRef::StringsAndChecksumsRef() {} - -StringsAndChecksumsRef::StringsAndChecksumsRef( - const DebugStringTableSubsectionRef &Strings) - : Strings(&Strings) {} - -StringsAndChecksumsRef::StringsAndChecksumsRef( - const DebugStringTableSubsectionRef &Strings, - const DebugChecksumsSubsectionRef &Checksums) - : Strings(&Strings), Checksums(&Checksums) {} - -void StringsAndChecksumsRef::initializeStrings( - const DebugSubsectionRecord &SR) { - assert(SR.kind() == DebugSubsectionKind::StringTable); - assert(!Strings && "Found a string table even though we already have one!"); - - OwnedStrings = llvm::make_unique(); - consumeError(OwnedStrings->initialize(SR.getRecordData())); - Strings = OwnedStrings.get(); -} - -void StringsAndChecksumsRef::initializeChecksums( - const DebugSubsectionRecord &FCR) { - assert(FCR.kind() == DebugSubsectionKind::FileChecksums); - if (Checksums) - return; - - OwnedChecksums = llvm::make_unique(); - consumeError(OwnedChecksums->initialize(FCR.getRecordData())); - Checksums = OwnedChecksums.get(); -} diff --git a/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp b/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp index 81a9d3eeec6..396dffaa68b 100644 --- a/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp +++ b/lib/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.cpp @@ -177,7 +177,7 @@ Error DbiModuleDescriptorBuilder::commit(BinaryStreamWriter &ModiWriter, } void DbiModuleDescriptorBuilder::addDebugSubsection( - std::shared_ptr Subsection) { + std::unique_ptr Subsection) { assert(Subsection); C13Builders.push_back(llvm::make_unique( std::move(Subsection), CodeViewContainer::Pdb)); diff --git a/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp b/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp index 90acfadd311..a472181a489 100644 --- a/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp +++ b/lib/DebugInfo/PDB/Native/PDBStringTableBuilder.cpp @@ -52,11 +52,6 @@ uint32_t PDBStringTableBuilder::calculateSerializedSize() const { return Size; } -void PDBStringTableBuilder::setStrings( - const codeview::DebugStringTableSubsection &Strings) { - this->Strings = Strings; -} - Error PDBStringTableBuilder::writeHeader(BinaryStreamWriter &Writer) const { // Write a header PDBStringTableHeader H; diff --git a/lib/ObjectYAML/COFFYAML.cpp b/lib/ObjectYAML/COFFYAML.cpp index c8cbea1490f..7f9f4c1f8c2 100644 --- a/lib/ObjectYAML/COFFYAML.cpp +++ b/lib/ObjectYAML/COFFYAML.cpp @@ -488,16 +488,7 @@ void MappingTraits::mapping(IO &IO, COFFYAML::Section &Sec) { IO.mapOptional("VirtualAddress", Sec.Header.VirtualAddress, 0U); IO.mapOptional("VirtualSize", Sec.Header.VirtualSize, 0U); IO.mapOptional("Alignment", Sec.Alignment, 0U); - - // If this is a .debug$S or .debug$T section parse the semantic representation - // of the symbols/types. If it is any other kind of section, just deal in raw - // bytes. - IO.mapOptional("SectionData", Sec.SectionData); - if (Sec.Name == ".debug$S") - IO.mapOptional("Subsections", Sec.DebugS); - else if (Sec.Name == ".debug$T") - IO.mapOptional("Types", Sec.DebugT); - + IO.mapRequired("SectionData", Sec.SectionData); IO.mapOptional("Relocations", Sec.Relocations); } diff --git a/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp b/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp index 728079a2a6b..08a4bb715fa 100644 --- a/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp +++ b/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp @@ -28,7 +28,6 @@ #include "llvm/DebugInfo/CodeView/DebugSymbolRVASubsection.h" #include "llvm/DebugInfo/CodeView/DebugSymbolsSubsection.h" #include "llvm/DebugInfo/CodeView/EnumTables.h" -#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" #include "llvm/DebugInfo/CodeView/SymbolRecord.h" #include "llvm/DebugInfo/CodeView/SymbolSerializer.h" #include "llvm/ObjectYAML/CodeViewYAMLSymbols.h" @@ -76,9 +75,10 @@ struct YAMLSubsectionBase { virtual ~YAMLSubsectionBase() {} virtual void map(IO &IO) = 0; - virtual std::shared_ptr + virtual std::unique_ptr toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const = 0; + DebugStringTableSubsection *UseStrings, + DebugChecksumsSubsection *UseChecksums) const = 0; }; } } @@ -90,9 +90,10 @@ struct YAMLChecksumsSubsection : public YAMLSubsectionBase { : YAMLSubsectionBase(DebugSubsectionKind::FileChecksums) {} void map(IO &IO) override; - std::shared_ptr + std::unique_ptr toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; + DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const override; static Expected> fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings, const DebugChecksumsSubsectionRef &FC); @@ -104,9 +105,10 @@ struct YAMLLinesSubsection : public YAMLSubsectionBase { YAMLLinesSubsection() : YAMLSubsectionBase(DebugSubsectionKind::Lines) {} void map(IO &IO) override; - std::shared_ptr + std::unique_ptr toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; + DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const override; static Expected> fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings, const DebugChecksumsSubsectionRef &Checksums, @@ -120,9 +122,10 @@ struct YAMLInlineeLinesSubsection : public YAMLSubsectionBase { : YAMLSubsectionBase(DebugSubsectionKind::InlineeLines) {} void map(IO &IO) override; - std::shared_ptr + std::unique_ptr toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; + DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const override; static Expected> fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings, const DebugChecksumsSubsectionRef &Checksums, @@ -136,9 +139,10 @@ struct YAMLCrossModuleExportsSubsection : public YAMLSubsectionBase { : YAMLSubsectionBase(DebugSubsectionKind::CrossScopeExports) {} void map(IO &IO) override; - std::shared_ptr + std::unique_ptr toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; + DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const override; static Expected> fromCodeViewSubsection(const DebugCrossModuleExportsSubsectionRef &Exports); @@ -150,9 +154,10 @@ struct YAMLCrossModuleImportsSubsection : public YAMLSubsectionBase { : YAMLSubsectionBase(DebugSubsectionKind::CrossScopeImports) {} void map(IO &IO) override; - std::shared_ptr + std::unique_ptr toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; + DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const override; static Expected> fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings, const DebugCrossModuleImportsSubsectionRef &Imports); @@ -164,9 +169,10 @@ struct YAMLSymbolsSubsection : public YAMLSubsectionBase { YAMLSymbolsSubsection() : YAMLSubsectionBase(DebugSubsectionKind::Symbols) {} void map(IO &IO) override; - std::shared_ptr + std::unique_ptr toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; + DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const override; static Expected> fromCodeViewSubsection(const DebugSymbolsSubsectionRef &Symbols); @@ -178,9 +184,10 @@ struct YAMLStringTableSubsection : public YAMLSubsectionBase { : YAMLSubsectionBase(DebugSubsectionKind::StringTable) {} void map(IO &IO) override; - std::shared_ptr + std::unique_ptr toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; + DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const override; static Expected> fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings); @@ -192,9 +199,10 @@ struct YAMLFrameDataSubsection : public YAMLSubsectionBase { : YAMLSubsectionBase(DebugSubsectionKind::FrameData) {} void map(IO &IO) override; - std::shared_ptr + std::unique_ptr toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; + DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const override; static Expected> fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings, const DebugFrameDataSubsectionRef &Frames); @@ -207,9 +215,10 @@ struct YAMLCoffSymbolRVASubsection : public YAMLSubsectionBase { : YAMLSubsectionBase(DebugSubsectionKind::CoffSymbolRVA) {} void map(IO &IO) override; - std::shared_ptr + std::unique_ptr toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; + DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const override; static Expected> fromCodeViewSubsection(const DebugSymbolRVASubsectionRef &RVAs); @@ -391,23 +400,23 @@ findChecksums(ArrayRef Subsections) { return nullptr; } -std::shared_ptr YAMLChecksumsSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - assert(SC.hasStrings()); - auto Result = std::make_shared(*SC.strings()); +std::unique_ptr YAMLChecksumsSubsection::toCodeViewSubsection( + BumpPtrAllocator &Allocator, DebugStringTableSubsection *UseStrings, + DebugChecksumsSubsection *UseChecksums) const { + assert(UseStrings && !UseChecksums); + auto Result = llvm::make_unique(*UseStrings); for (const auto &CS : Checksums) { Result->addChecksum(CS.FileName, CS.Kind, CS.ChecksumBytes.Bytes); } - return Result; + return std::move(Result); } -std::shared_ptr YAMLLinesSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - assert(SC.hasStrings() && SC.hasChecksums()); +std::unique_ptr YAMLLinesSubsection::toCodeViewSubsection( + BumpPtrAllocator &Allocator, DebugStringTableSubsection *UseStrings, + DebugChecksumsSubsection *UseChecksums) const { + assert(UseStrings && UseChecksums); auto Result = - std::make_shared(*SC.checksums(), *SC.strings()); + llvm::make_unique(*UseChecksums, *UseStrings); Result->setCodeSize(Lines.CodeSize); Result->setRelocationAddress(Lines.RelocSegment, Lines.RelocOffset); Result->setFlags(Lines.Flags); @@ -429,16 +438,16 @@ std::shared_ptr YAMLLinesSubsection::toCodeViewSubsection( } } } - return Result; + return llvm::cast(std::move(Result)); } -std::shared_ptr +std::unique_ptr YAMLInlineeLinesSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - assert(SC.hasChecksums()); - auto Result = std::make_shared( - *SC.checksums(), InlineeLines.HasExtraFiles); + BumpPtrAllocator &Allocator, DebugStringTableSubsection *UseStrings, + DebugChecksumsSubsection *UseChecksums) const { + assert(UseChecksums); + auto Result = llvm::make_unique( + *UseChecksums, InlineeLines.HasExtraFiles); for (const auto &Site : InlineeLines.Sites) { Result->addInlineSite(TypeIndex(Site.Inlinee), Site.FileName, @@ -450,60 +459,56 @@ YAMLInlineeLinesSubsection::toCodeViewSubsection( Result->addExtraFile(EF); } } - return Result; + return llvm::cast(std::move(Result)); } -std::shared_ptr +std::unique_ptr YAMLCrossModuleExportsSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - auto Result = std::make_shared(); + BumpPtrAllocator &Allocator, DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const { + auto Result = llvm::make_unique(); for (const auto &M : Exports) Result->addMapping(M.Local, M.Global); - return Result; + return llvm::cast(std::move(Result)); } -std::shared_ptr +std::unique_ptr YAMLCrossModuleImportsSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - assert(SC.hasStrings()); - - auto Result = - std::make_shared(*SC.strings()); + BumpPtrAllocator &Allocator, DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const { + auto Result = llvm::make_unique(*Strings); for (const auto &M : Imports) { for (const auto Id : M.ImportIds) Result->addImport(M.ModuleName, Id); } - return Result; + return llvm::cast(std::move(Result)); } -std::shared_ptr YAMLSymbolsSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - auto Result = std::make_shared(); +std::unique_ptr YAMLSymbolsSubsection::toCodeViewSubsection( + BumpPtrAllocator &Allocator, DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const { + auto Result = llvm::make_unique(); for (const auto &Sym : Symbols) Result->addSymbol( Sym.toCodeViewSymbol(Allocator, CodeViewContainer::ObjectFile)); - return Result; + return std::move(Result); } -std::shared_ptr +std::unique_ptr YAMLStringTableSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - auto Result = std::make_shared(); + BumpPtrAllocator &Allocator, DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const { + auto Result = llvm::make_unique(); for (const auto &Str : this->Strings) Result->insert(Str); - return Result; + return std::move(Result); } -std::shared_ptr YAMLFrameDataSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - assert(SC.hasStrings()); - - auto Result = std::make_shared(); +std::unique_ptr YAMLFrameDataSubsection::toCodeViewSubsection( + BumpPtrAllocator &Allocator, DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const { + assert(Strings); + auto Result = llvm::make_unique(); for (const auto &YF : Frames) { codeview::FrameData F; F.CodeSize = YF.CodeSize; @@ -514,20 +519,20 @@ std::shared_ptr YAMLFrameDataSubsection::toCodeViewSubsection( F.PrologSize = YF.PrologSize; F.RvaStart = YF.RvaStart; F.SavedRegsSize = YF.SavedRegsSize; - F.FrameFunc = SC.strings()->insert(YF.FrameFunc); + F.FrameFunc = Strings->insert(YF.FrameFunc); Result->addFrameData(F); } - return Result; + return std::move(Result); } -std::shared_ptr +std::unique_ptr YAMLCoffSymbolRVASubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - auto Result = std::make_shared(); + BumpPtrAllocator &Allocator, DebugStringTableSubsection *Strings, + DebugChecksumsSubsection *Checksums) const { + auto Result = llvm::make_unique(); for (const auto &RVA : RVAs) Result->addRVA(RVA); - return Result; + return std::move(Result); } static Expected @@ -736,17 +741,63 @@ YAMLCoffSymbolRVASubsection::fromCodeViewSubsection( return Result; } -Expected>> +Expected>> +llvm::CodeViewYAML::toCodeViewSubsectionList( + BumpPtrAllocator &Allocator, ArrayRef Subsections, + DebugStringTableSubsection &Strings) { + std::vector> Result; + if (Subsections.empty()) + return std::move(Result); + + auto Checksums = findChecksums(Subsections); + std::unique_ptr ChecksumsBase; + if (Checksums) + ChecksumsBase = + Checksums->toCodeViewSubsection(Allocator, &Strings, nullptr); + DebugChecksumsSubsection *CS = + static_cast(ChecksumsBase.get()); + for (const auto &SS : Subsections) { + // We've already converted the checksums subsection, don't do it + // twice. + std::unique_ptr CVS; + if (SS.Subsection->Kind == DebugSubsectionKind::FileChecksums) + CVS = std::move(ChecksumsBase); + else + CVS = SS.Subsection->toCodeViewSubsection(Allocator, &Strings, CS); + assert(CVS != nullptr); + Result.push_back(std::move(CVS)); + } + return std::move(Result); +} + +Expected>> llvm::CodeViewYAML::toCodeViewSubsectionList( BumpPtrAllocator &Allocator, ArrayRef Subsections, - const codeview::StringsAndChecksums &SC) { - std::vector> Result; + std::unique_ptr &TakeStrings, + DebugStringTableSubsection *StringsRef) { + std::vector> Result; if (Subsections.empty()) return std::move(Result); + auto Checksums = findChecksums(Subsections); + + std::unique_ptr ChecksumsBase; + if (Checksums) + ChecksumsBase = + Checksums->toCodeViewSubsection(Allocator, StringsRef, nullptr); + DebugChecksumsSubsection *CS = + static_cast(ChecksumsBase.get()); for (const auto &SS : Subsections) { - std::shared_ptr CVS; - CVS = SS.Subsection->toCodeViewSubsection(Allocator, SC); + // We've already converted the checksums and string table subsection, don't + // do it twice. + std::unique_ptr CVS; + if (SS.Subsection->Kind == DebugSubsectionKind::FileChecksums) + CVS = std::move(ChecksumsBase); + else if (SS.Subsection->Kind == DebugSubsectionKind::StringTable) { + assert(TakeStrings && "No string table!"); + CVS = std::move(TakeStrings); + } else + CVS = SS.Subsection->toCodeViewSubsection(Allocator, StringsRef, CS); assert(CVS != nullptr); Result.push_back(std::move(CVS)); } @@ -759,23 +810,23 @@ struct SubsectionConversionVisitor : public DebugSubsectionVisitor { Error visitUnknown(DebugUnknownSubsectionRef &Unknown) override; Error visitLines(DebugLinesSubsectionRef &Lines, - const StringsAndChecksumsRef &State) override; + const DebugSubsectionState &State) override; Error visitFileChecksums(DebugChecksumsSubsectionRef &Checksums, - const StringsAndChecksumsRef &State) override; + const DebugSubsectionState &State) override; Error visitInlineeLines(DebugInlineeLinesSubsectionRef &Inlinees, - const StringsAndChecksumsRef &State) override; + const DebugSubsectionState &State) override; Error visitCrossModuleExports(DebugCrossModuleExportsSubsectionRef &Checksums, - const StringsAndChecksumsRef &State) override; + const DebugSubsectionState &State) override; Error visitCrossModuleImports(DebugCrossModuleImportsSubsectionRef &Inlinees, - const StringsAndChecksumsRef &State) override; + const DebugSubsectionState &State) override; Error visitStringTable(DebugStringTableSubsectionRef &ST, - const StringsAndChecksumsRef &State) override; + const DebugSubsectionState &State) override; Error visitSymbols(DebugSymbolsSubsectionRef &Symbols, - const StringsAndChecksumsRef &State) override; + const DebugSubsectionState &State) override; Error visitFrameData(DebugFrameDataSubsectionRef &Symbols, - const StringsAndChecksumsRef &State) override; + const DebugSubsectionState &State) override; Error visitCOFFSymbolRVAs(DebugSymbolRVASubsectionRef &Symbols, - const StringsAndChecksumsRef &State) override; + const DebugSubsectionState &State) override; YAMLDebugSubsection Subsection; }; @@ -786,7 +837,7 @@ Error SubsectionConversionVisitor::visitUnknown( } Error SubsectionConversionVisitor::visitLines( - DebugLinesSubsectionRef &Lines, const StringsAndChecksumsRef &State) { + DebugLinesSubsectionRef &Lines, const DebugSubsectionState &State) { auto Result = YAMLLinesSubsection::fromCodeViewSubsection( State.strings(), State.checksums(), Lines); if (!Result) @@ -796,8 +847,7 @@ Error SubsectionConversionVisitor::visitLines( } Error SubsectionConversionVisitor::visitFileChecksums( - DebugChecksumsSubsectionRef &Checksums, - const StringsAndChecksumsRef &State) { + DebugChecksumsSubsectionRef &Checksums, const DebugSubsectionState &State) { auto Result = YAMLChecksumsSubsection::fromCodeViewSubsection(State.strings(), Checksums); if (!Result) @@ -808,7 +858,7 @@ Error SubsectionConversionVisitor::visitFileChecksums( Error SubsectionConversionVisitor::visitInlineeLines( DebugInlineeLinesSubsectionRef &Inlinees, - const StringsAndChecksumsRef &State) { + const DebugSubsectionState &State) { auto Result = YAMLInlineeLinesSubsection::fromCodeViewSubsection( State.strings(), State.checksums(), Inlinees); if (!Result) @@ -819,7 +869,7 @@ Error SubsectionConversionVisitor::visitInlineeLines( Error SubsectionConversionVisitor::visitCrossModuleExports( DebugCrossModuleExportsSubsectionRef &Exports, - const StringsAndChecksumsRef &State) { + const DebugSubsectionState &State) { auto Result = YAMLCrossModuleExportsSubsection::fromCodeViewSubsection(Exports); if (!Result) @@ -830,7 +880,7 @@ Error SubsectionConversionVisitor::visitCrossModuleExports( Error SubsectionConversionVisitor::visitCrossModuleImports( DebugCrossModuleImportsSubsectionRef &Imports, - const StringsAndChecksumsRef &State) { + const DebugSubsectionState &State) { auto Result = YAMLCrossModuleImportsSubsection::fromCodeViewSubsection( State.strings(), Imports); if (!Result) @@ -840,8 +890,7 @@ Error SubsectionConversionVisitor::visitCrossModuleImports( } Error SubsectionConversionVisitor::visitStringTable( - DebugStringTableSubsectionRef &Strings, - const StringsAndChecksumsRef &State) { + DebugStringTableSubsectionRef &Strings, const DebugSubsectionState &State) { auto Result = YAMLStringTableSubsection::fromCodeViewSubsection(Strings); if (!Result) return Result.takeError(); @@ -850,7 +899,7 @@ Error SubsectionConversionVisitor::visitStringTable( } Error SubsectionConversionVisitor::visitSymbols( - DebugSymbolsSubsectionRef &Symbols, const StringsAndChecksumsRef &State) { + DebugSymbolsSubsectionRef &Symbols, const DebugSubsectionState &State) { auto Result = YAMLSymbolsSubsection::fromCodeViewSubsection(Symbols); if (!Result) return Result.takeError(); @@ -859,7 +908,7 @@ Error SubsectionConversionVisitor::visitSymbols( } Error SubsectionConversionVisitor::visitFrameData( - DebugFrameDataSubsectionRef &Frames, const StringsAndChecksumsRef &State) { + DebugFrameDataSubsectionRef &Frames, const DebugSubsectionState &State) { auto Result = YAMLFrameDataSubsection::fromCodeViewSubsection(State.strings(), Frames); if (!Result) @@ -869,7 +918,7 @@ Error SubsectionConversionVisitor::visitFrameData( } Error SubsectionConversionVisitor::visitCOFFSymbolRVAs( - DebugSymbolRVASubsectionRef &RVAs, const StringsAndChecksumsRef &State) { + DebugSymbolRVASubsectionRef &RVAs, const DebugSubsectionState &State) { auto Result = YAMLCoffSymbolRVASubsection::fromCodeViewSubsection(RVAs); if (!Result) return Result.takeError(); @@ -878,71 +927,29 @@ Error SubsectionConversionVisitor::visitCOFFSymbolRVAs( } } -Expected -YAMLDebugSubsection::fromCodeViewSubection(const StringsAndChecksumsRef &SC, - const DebugSubsectionRecord &SS) { +Expected YAMLDebugSubsection::fromCodeViewSubection( + const DebugStringTableSubsectionRef &Strings, + const DebugChecksumsSubsectionRef &Checksums, + const DebugSubsectionRecord &SS) { + DebugSubsectionState State(Strings, Checksums); SubsectionConversionVisitor V; - if (auto EC = visitDebugSubsection(SS, V, SC)) + if (auto EC = visitDebugSubsection(SS, V, State)) return std::move(EC); return V.Subsection; } -std::vector -llvm::CodeViewYAML::fromDebugS(ArrayRef Data, - const StringsAndChecksumsRef &SC) { - BinaryStreamReader Reader(Data, support::little); - uint32_t Magic; - - ExitOnError Err("Invalid .debug$S section!"); - Err(Reader.readInteger(Magic)); - assert(Magic == COFF::DEBUG_SECTION_MAGIC && "Invalid .debug$S section!"); - - DebugSubsectionArray Subsections; - Err(Reader.readArray(Subsections, Reader.bytesRemaining())); - - std::vector Result; - - for (const auto &SS : Subsections) { - auto YamlSS = Err(YAMLDebugSubsection::fromCodeViewSubection(SC, SS)); - Result.push_back(YamlSS); - } - return Result; -} - -void llvm::CodeViewYAML::initializeStringsAndChecksums( - ArrayRef Sections, codeview::StringsAndChecksums &SC) { - // String Table and Checksums subsections don't use the allocator. - BumpPtrAllocator Allocator; - - // It's possible for checksums and strings to even appear in different debug$S - // sections, so we have to make this a stateful function that can build up - // the strings and checksums field over multiple iterations. - - // File Checksums require the string table, but may become before it, so we - // have to scan for strings first, then scan for checksums again from the - // beginning. - if (!SC.hasStrings()) { - for (const auto &SS : Sections) { - if (SS.Subsection->Kind != DebugSubsectionKind::StringTable) - continue; - - auto Result = SS.Subsection->toCodeViewSubsection(Allocator, SC); - SC.setStrings( - std::static_pointer_cast(Result)); - break; - } - } - - if (SC.hasStrings() && !SC.hasChecksums()) { - for (const auto &SS : Sections) { - if (SS.Subsection->Kind != DebugSubsectionKind::FileChecksums) - continue; +std::unique_ptr +llvm::CodeViewYAML::findStringTable(ArrayRef Sections) { + for (const auto &SS : Sections) { + if (SS.Subsection->Kind != DebugSubsectionKind::StringTable) + continue; - auto Result = SS.Subsection->toCodeViewSubsection(Allocator, SC); - SC.setChecksums( - std::static_pointer_cast(Result)); - break; - } + // String Table doesn't use the allocator. + BumpPtrAllocator Allocator; + auto Result = + SS.Subsection->toCodeViewSubsection(Allocator, nullptr, nullptr); + return llvm::cast(std::move(Result)); } + return nullptr; } diff --git a/lib/ObjectYAML/CodeViewYAMLTypes.cpp b/lib/ObjectYAML/CodeViewYAMLTypes.cpp index a03b9cd50fa..1302b0713d0 100644 --- a/lib/ObjectYAML/CodeViewYAMLTypes.cpp +++ b/lib/ObjectYAML/CodeViewYAMLTypes.cpp @@ -714,43 +714,3 @@ void MappingTraits::mapping(IO &IO, MemberRecord &Obj) { default: { llvm_unreachable("Unknown member kind!"); } } } - -std::vector -llvm::CodeViewYAML::fromDebugT(ArrayRef DebugT) { - ExitOnError Err("Invalid .debug$T section!"); - BinaryStreamReader Reader(DebugT, support::little); - CVTypeArray Types; - uint32_t Magic; - - Err(Reader.readInteger(Magic)); - assert(Magic == COFF::DEBUG_SECTION_MAGIC && "Invalid .debug$T section!"); - - std::vector Result; - Err(Reader.readArray(Types, Reader.bytesRemaining())); - for (const auto &T : Types) { - auto CVT = Err(LeafRecord::fromCodeViewRecord(T)); - Result.push_back(CVT); - } - return Result; -} - -ArrayRef llvm::CodeViewYAML::toDebugT(ArrayRef Leafs, - BumpPtrAllocator &Alloc) { - TypeTableBuilder TTB(Alloc, false); - uint32_t Size = sizeof(uint32_t); - for (const auto &Leaf : Leafs) { - CVType T = Leaf.toCodeViewRecord(TTB); - Size += T.length(); - assert(T.length() % 4 == 0 && "Improper type record alignment!"); - } - uint8_t *ResultBuffer = Alloc.Allocate(Size); - MutableArrayRef Output(ResultBuffer, Size); - BinaryStreamWriter Writer(Output, support::little); - ExitOnError Err("Error writing type record to .debug$T section"); - Err(Writer.writeInteger(COFF::DEBUG_SECTION_MAGIC)); - for (const auto &R : TTB.records()) { - Err(Writer.writeBytes(R)); - } - assert(Writer.bytesRemaining() == 0 && "Didn't write all type record bytes!"); - return Output; -} diff --git a/tools/llvm-pdbutil/LLVMOutputStyle.cpp b/tools/llvm-pdbutil/LLVMOutputStyle.cpp index c4af4583a10..980e3d3d41b 100644 --- a/tools/llvm-pdbutil/LLVMOutputStyle.cpp +++ b/tools/llvm-pdbutil/LLVMOutputStyle.cpp @@ -28,7 +28,6 @@ #include "llvm/DebugInfo/CodeView/EnumTables.h" #include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h" #include "llvm/DebugInfo/CodeView/Line.h" -#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" #include "llvm/DebugInfo/CodeView/SymbolDumper.h" #include "llvm/DebugInfo/CodeView/TypeDatabaseVisitor.h" #include "llvm/DebugInfo/CodeView/TypeDumpVisitor.h" @@ -106,7 +105,7 @@ public: } Error visitLines(DebugLinesSubsectionRef &Lines, - const StringsAndChecksumsRef &State) override { + const DebugSubsectionState &State) override { if (!opts::checkModuleSubsection(opts::ModuleSubsection::Lines)) return Error::success(); @@ -147,7 +146,7 @@ public: } Error visitFileChecksums(DebugChecksumsSubsectionRef &Checksums, - const StringsAndChecksumsRef &State) override { + const DebugSubsectionState &State) override { if (!opts::checkModuleSubsection(opts::ModuleSubsection::FileChecksums)) return Error::success(); @@ -165,7 +164,7 @@ public: } Error visitInlineeLines(DebugInlineeLinesSubsectionRef &Inlinees, - const StringsAndChecksumsRef &State) override { + const DebugSubsectionState &State) override { if (!opts::checkModuleSubsection(opts::ModuleSubsection::InlineeLines)) return Error::success(); @@ -192,7 +191,7 @@ public: } Error visitCrossModuleExports(DebugCrossModuleExportsSubsectionRef &CSE, - const StringsAndChecksumsRef &State) override { + const DebugSubsectionState &State) override { if (!opts::checkModuleSubsection(opts::ModuleSubsection::CrossScopeExports)) return Error::success(); @@ -206,7 +205,7 @@ public: } Error visitCrossModuleImports(DebugCrossModuleImportsSubsectionRef &CSI, - const StringsAndChecksumsRef &State) override { + const DebugSubsectionState &State) override { if (!opts::checkModuleSubsection(opts::ModuleSubsection::CrossScopeImports)) return Error::success(); @@ -223,7 +222,7 @@ public: } Error visitFrameData(DebugFrameDataSubsectionRef &FD, - const StringsAndChecksumsRef &State) override { + const DebugSubsectionState &State) override { if (!opts::checkModuleSubsection(opts::ModuleSubsection::FrameData)) return Error::success(); @@ -249,7 +248,7 @@ public: } Error visitSymbols(DebugSymbolsSubsectionRef &Symbols, - const StringsAndChecksumsRef &State) override { + const DebugSubsectionState &State) override { if (!opts::checkModuleSubsection(opts::ModuleSubsection::Symbols)) return Error::success(); ListScope L(P, "Symbols"); @@ -271,7 +270,7 @@ public: } Error visitStringTable(DebugStringTableSubsectionRef &Strings, - const StringsAndChecksumsRef &State) override { + const DebugSubsectionState &State) override { if (!opts::checkModuleSubsection(opts::ModuleSubsection::StringTable)) return Error::success(); @@ -289,7 +288,7 @@ public: } Error visitCOFFSymbolRVAs(DebugSymbolRVASubsectionRef &RVAs, - const StringsAndChecksumsRef &State) override { + const DebugSubsectionState &State) override { if (!opts::checkModuleSubsection(opts::ModuleSubsection::CoffSymbolRVAs)) return Error::success(); @@ -310,7 +309,7 @@ private: return EC; } } - + if (!Success) { P.printString( llvm::formatv("Index: {0:x} (unknown function)", Index.getIndex()) @@ -319,7 +318,7 @@ private: return Error::success(); } Error printFileName(StringRef Label, uint32_t Offset, - const StringsAndChecksumsRef &State) { + const DebugSubsectionState &State) { if (auto Result = getNameFromChecksumsBuffer(Offset, State)) { P.printString(Label, *Result); return Error::success(); @@ -328,13 +327,13 @@ private: } Expected - getNameFromStringTable(uint32_t Offset, const StringsAndChecksumsRef &State) { + getNameFromStringTable(uint32_t Offset, const DebugSubsectionState &State) { return State.strings().getString(Offset); } Expected getNameFromChecksumsBuffer(uint32_t Offset, - const StringsAndChecksumsRef &State) { + const DebugSubsectionState &State) { auto Array = State.checksums().getArray(); auto ChecksumIter = Array.at(Offset); if (ChecksumIter == Array.end()) diff --git a/tools/llvm-pdbutil/YAMLOutputStyle.cpp b/tools/llvm-pdbutil/YAMLOutputStyle.cpp index 8f7aba6d30c..4ab7cd39b29 100644 --- a/tools/llvm-pdbutil/YAMLOutputStyle.cpp +++ b/tools/llvm-pdbutil/YAMLOutputStyle.cpp @@ -18,7 +18,6 @@ #include "llvm/DebugInfo/CodeView/DebugSubsection.h" #include "llvm/DebugInfo/CodeView/DebugUnknownSubsection.h" #include "llvm/DebugInfo/CodeView/Line.h" -#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" #include "llvm/DebugInfo/MSF/MappedBlockStream.h" #include "llvm/DebugInfo/PDB/Native/DbiStream.h" #include "llvm/DebugInfo/PDB/Native/InfoStream.h" @@ -237,16 +236,14 @@ Error YAMLOutputStyle::dumpDbiStream() { if (!ExpectedChecksums) return ExpectedChecksums.takeError(); - StringsAndChecksumsRef SC(ExpectedST->getStringTable(), - *ExpectedChecksums); - for (const auto &SS : ModS.subsections()) { opts::ModuleSubsection OptionKind = convertSubsectionKind(SS.kind()); if (!opts::checkModuleSubsection(OptionKind)) continue; auto Converted = - CodeViewYAML::YAMLDebugSubsection::fromCodeViewSubection(SC, SS); + CodeViewYAML::YAMLDebugSubsection::fromCodeViewSubection( + ExpectedST->getStringTable(), *ExpectedChecksums, SS); if (!Converted) return Converted.takeError(); DMI.Subsections.push_back(*Converted); diff --git a/tools/llvm-pdbutil/llvm-pdbutil.cpp b/tools/llvm-pdbutil/llvm-pdbutil.cpp index 3826ba79a20..dc46da4a90f 100644 --- a/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -35,7 +35,6 @@ #include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h" #include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h" #include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h" -#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" #include "llvm/DebugInfo/CodeView/TypeStreamMerger.h" #include "llvm/DebugInfo/CodeView/TypeTableBuilder.h" #include "llvm/DebugInfo/MSF/MSFBuilder.h" @@ -512,12 +511,10 @@ static void yamlToPdb(StringRef Path) { for (uint32_t I = 0; I < kSpecialStreamCount; ++I) ExitOnErr(Builder.getMsfBuilder().addStream(0)); - StringsAndChecksums Strings; - Strings.setStrings(std::make_shared()); - if (YamlObj.StringTable.hasValue()) { + auto &Strings = Builder.getStringTableBuilder(); for (auto S : *YamlObj.StringTable) - Strings.strings()->insert(S); + Strings.insert(S); } pdb::yaml::PdbInfoStream DefaultInfoStream; @@ -535,6 +532,8 @@ static void yamlToPdb(StringRef Path) { for (auto F : Info.Features) InfoBuilder.addFeature(F); + auto &Strings = Builder.getStringTableBuilder().getStrings(); + const auto &Dbi = YamlObj.DbiStream.getValueOr(DefaultDbiStream); auto &DbiBuilder = Builder.getDbiBuilder(); DbiBuilder.setAge(Dbi.Age); @@ -558,14 +557,10 @@ static void yamlToPdb(StringRef Path) { } } - // Each module has its own checksum subsection, so scan for it every time. - Strings.setChecksums(nullptr); - CodeViewYAML::initializeStringsAndChecksums(MI.Subsections, Strings); - auto CodeViewSubsections = ExitOnErr(CodeViewYAML::toCodeViewSubsectionList( Allocator, MI.Subsections, Strings)); for (auto &SS : CodeViewSubsections) { - ModiBuilder.addDebugSubsection(SS); + ModiBuilder.addDebugSubsection(std::move(SS)); } } @@ -585,8 +580,6 @@ static void yamlToPdb(StringRef Path) { IpiBuilder.addTypeRecord(Type.RecordData, None); } - Builder.getStringTableBuilder().setStrings(*Strings.strings()); - ExitOnErr(Builder.commit(opts::yaml2pdb::YamlPdbOutputFile)); } diff --git a/tools/obj2yaml/coff2yaml.cpp b/tools/obj2yaml/coff2yaml.cpp index b1a06bca1a7..c734601ede7 100644 --- a/tools/obj2yaml/coff2yaml.cpp +++ b/tools/obj2yaml/coff2yaml.cpp @@ -8,13 +8,8 @@ //===----------------------------------------------------------------------===// #include "obj2yaml.h" -#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" -#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h" -#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" #include "llvm/Object/COFF.h" #include "llvm/ObjectYAML/COFFYAML.h" -#include "llvm/ObjectYAML/CodeViewYAMLSymbols.h" -#include "llvm/ObjectYAML/CodeViewYAMLTypes.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/YAMLTraits.h" @@ -104,45 +99,8 @@ void COFFDumper::dumpHeader() { YAMLObj.Header.Characteristics = Obj.getCharacteristics(); } -static void -initializeFileAndStringTable(const llvm::object::COFFObjectFile &Obj, - codeview::StringsAndChecksumsRef &SC) { - - ExitOnError Err("Invalid .debug$S section!"); - // Iterate all .debug$S sections looking for the checksums and string table. - // Exit as soon as both sections are found. - for (const auto &S : Obj.sections()) { - if (SC.hasStrings() && SC.hasChecksums()) - break; - - StringRef SectionName; - S.getName(SectionName); - ArrayRef sectionData; - if (SectionName != ".debug$S") - continue; - - const object::coff_section *COFFSection = Obj.getCOFFSection(S); - - Obj.getSectionContents(COFFSection, sectionData); - - BinaryStreamReader Reader(sectionData, support::little); - uint32_t Magic; - - Err(Reader.readInteger(Magic)); - assert(Magic == COFF::DEBUG_SECTION_MAGIC && "Invalid .debug$S section!"); - - codeview::DebugSubsectionArray Subsections; - Err(Reader.readArray(Subsections, Reader.bytesRemaining())); - - SC.initialize(Subsections); - } -} - void COFFDumper::dumpSections(unsigned NumSections) { std::vector &YAMLSections = YAMLObj.Sections; - codeview::StringsAndChecksumsRef SC; - initializeFileAndStringTable(Obj, SC); - for (const auto &ObjSection : Obj.sections()) { const object::coff_section *COFFSection = Obj.getCOFFSection(ObjSection); COFFYAML::Section NewYAMLSection; @@ -150,16 +108,6 @@ void COFFDumper::dumpSections(unsigned NumSections) { NewYAMLSection.Header.Characteristics = COFFSection->Characteristics; NewYAMLSection.Header.VirtualAddress = ObjSection.getAddress(); NewYAMLSection.Header.VirtualSize = COFFSection->VirtualSize; - NewYAMLSection.Header.NumberOfLineNumbers = - COFFSection->NumberOfLinenumbers; - NewYAMLSection.Header.NumberOfRelocations = - COFFSection->NumberOfRelocations; - NewYAMLSection.Header.PointerToLineNumbers = - COFFSection->PointerToLinenumbers; - NewYAMLSection.Header.PointerToRawData = COFFSection->PointerToRawData; - NewYAMLSection.Header.PointerToRelocations = - COFFSection->PointerToRelocations; - NewYAMLSection.Header.SizeOfRawData = COFFSection->SizeOfRawData; NewYAMLSection.Alignment = ObjSection.getAlignment(); assert(NewYAMLSection.Alignment <= 8192); @@ -168,11 +116,6 @@ void COFFDumper::dumpSections(unsigned NumSections) { Obj.getSectionContents(COFFSection, sectionData); NewYAMLSection.SectionData = yaml::BinaryRef(sectionData); - if (NewYAMLSection.Name == ".debug$S") - NewYAMLSection.DebugS = CodeViewYAML::fromDebugS(sectionData, SC); - else if (NewYAMLSection.Name == ".debug$T") - NewYAMLSection.DebugT = CodeViewYAML::fromDebugT(sectionData); - std::vector Relocations; for (const auto &Reloc : ObjSection.relocations()) { const object::coff_relocation *reloc = Obj.getCOFFRelocation(Reloc); diff --git a/tools/yaml2obj/yaml2coff.cpp b/tools/yaml2obj/yaml2coff.cpp index 1f302fdc45a..8f3f5217952 100644 --- a/tools/yaml2obj/yaml2coff.cpp +++ b/tools/yaml2obj/yaml2coff.cpp @@ -17,8 +17,6 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringSwitch.h" -#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h" -#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" #include "llvm/Object/COFF.h" #include "llvm/ObjectYAML/ObjectYAML.h" #include "llvm/Support/Endian.h" @@ -144,8 +142,6 @@ struct COFFParser { COFFYAML::Object &Obj; - codeview::StringsAndChecksums StringsAndChecksums; - BumpPtrAllocator Allocator; StringMap StringTableMap; std::string StringTable; uint32_t SectionTableStart; @@ -169,32 +165,6 @@ namespace { enum { DOSStubSize = 128 }; } -static yaml::BinaryRef -toDebugS(ArrayRef Subsections, - const codeview::StringsAndChecksums &SC, BumpPtrAllocator &Allocator) { - using namespace codeview; - ExitOnError Err("Error occurred writing .debug$S section"); - auto CVSS = - Err(CodeViewYAML::toCodeViewSubsectionList(Allocator, Subsections, SC)); - - std::vector Builders; - uint32_t Size = sizeof(uint32_t); - for (auto &SS : CVSS) { - DebugSubsectionRecordBuilder B(SS, CodeViewContainer::ObjectFile); - Size += B.calculateSerializedLength(); - Builders.push_back(std::move(B)); - } - uint8_t *Buffer = Allocator.Allocate(Size); - MutableArrayRef Output(Buffer, Size); - BinaryStreamWriter Writer(Output, support::little); - - Err(Writer.writeInteger(COFF::DEBUG_SECTION_MAGIC)); - for (const auto &B : Builders) { - Err(B.commit(Writer)); - } - return {Output}; -} - // Take a CP and assign addresses and sizes to everything. Returns false if the // layout is not valid to do. static bool layoutCOFF(COFFParser &CP) { @@ -209,33 +179,8 @@ static bool layoutCOFF(COFFParser &CP) { uint32_t CurrentSectionDataOffset = CP.SectionTableStart + CP.SectionTableSize; - for (COFFYAML::Section &S : CP.Obj.Sections) { - // We support specifying exactly one of SectionData or Subsections. So if - // there is already some SectionData, then we don't need to do any of this. - if (S.Name == ".debug$S" && S.SectionData.binary_size() == 0) { - CodeViewYAML::initializeStringsAndChecksums(S.DebugS, - CP.StringsAndChecksums); - if (CP.StringsAndChecksums.hasChecksums() && - CP.StringsAndChecksums.hasStrings()) - break; - } - } - // Assign each section data address consecutively. for (COFFYAML::Section &S : CP.Obj.Sections) { - if (S.Name == ".debug$S") { - if (S.SectionData.binary_size() == 0) { - assert(CP.StringsAndChecksums.hasStrings() && - "Object file does not have debug string table!"); - - S.SectionData = - toDebugS(S.DebugS, CP.StringsAndChecksums, CP.Allocator); - } - } else if (S.Name == ".debug$T") { - if (S.SectionData.binary_size() == 0) - S.SectionData = CodeViewYAML::toDebugT(S.DebugT, CP.Allocator); - } - if (S.SectionData.binary_size() > 0) { CurrentSectionDataOffset = alignTo(CurrentSectionDataOffset, CP.isPE() ? CP.getFileAlignment() : 4); @@ -598,7 +543,6 @@ int yaml2coff(llvm::COFFYAML::Object &Doc, raw_ostream &Out) { errs() << "yaml2obj: Failed to layout optional header for COFF file!\n"; return 1; } - if (!layoutCOFF(CP)) { errs() << "yaml2obj: Failed to layout COFF file!\n"; return 1; -- 2.50.1