1*0b57cec5SDimitry Andric //===- DebugChecksumsSubsection.h -------------------------------*- C++ -*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #ifndef LLVM_DEBUGINFO_CODEVIEW_DEBUGCHECKSUMSSUBSECTION_H 10*0b57cec5SDimitry Andric #define LLVM_DEBUGINFO_CODEVIEW_DEBUGCHECKSUMSSUBSECTION_H 11*0b57cec5SDimitry Andric 12*0b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h" 13*0b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h" 14*0b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 15*0b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/CodeView.h" 16*0b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/DebugSubsection.h" 17*0b57cec5SDimitry Andric #include "llvm/Support/Allocator.h" 18*0b57cec5SDimitry Andric #include "llvm/Support/BinaryStreamArray.h" 19*0b57cec5SDimitry Andric #include "llvm/Support/BinaryStreamRef.h" 20*0b57cec5SDimitry Andric #include "llvm/Support/Error.h" 21*0b57cec5SDimitry Andric #include <cstdint> 22*0b57cec5SDimitry Andric #include <vector> 23*0b57cec5SDimitry Andric 24*0b57cec5SDimitry Andric namespace llvm { 25*0b57cec5SDimitry Andric 26*0b57cec5SDimitry Andric class BinaryStreamReader; 27*0b57cec5SDimitry Andric class BinaryStreamWriter; 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric namespace codeview { 30*0b57cec5SDimitry Andric 31*0b57cec5SDimitry Andric class DebugStringTableSubsection; 32*0b57cec5SDimitry Andric 33*0b57cec5SDimitry Andric struct FileChecksumEntry { 34*0b57cec5SDimitry Andric uint32_t FileNameOffset; // Byte offset of filename in global stringtable. 35*0b57cec5SDimitry Andric FileChecksumKind Kind; // The type of checksum. 36*0b57cec5SDimitry Andric ArrayRef<uint8_t> Checksum; // The bytes of the checksum. 37*0b57cec5SDimitry Andric }; 38*0b57cec5SDimitry Andric 39*0b57cec5SDimitry Andric } // end namespace codeview 40*0b57cec5SDimitry Andric 41*0b57cec5SDimitry Andric template <> struct VarStreamArrayExtractor<codeview::FileChecksumEntry> { 42*0b57cec5SDimitry Andric public: 43*0b57cec5SDimitry Andric using ContextType = void; 44*0b57cec5SDimitry Andric 45*0b57cec5SDimitry Andric Error operator()(BinaryStreamRef Stream, uint32_t &Len, 46*0b57cec5SDimitry Andric codeview::FileChecksumEntry &Item); 47*0b57cec5SDimitry Andric }; 48*0b57cec5SDimitry Andric 49*0b57cec5SDimitry Andric namespace codeview { 50*0b57cec5SDimitry Andric 51*0b57cec5SDimitry Andric class DebugChecksumsSubsectionRef final : public DebugSubsectionRef { 52*0b57cec5SDimitry Andric using FileChecksumArray = VarStreamArray<codeview::FileChecksumEntry>; 53*0b57cec5SDimitry Andric using Iterator = FileChecksumArray::Iterator; 54*0b57cec5SDimitry Andric 55*0b57cec5SDimitry Andric public: 56*0b57cec5SDimitry Andric DebugChecksumsSubsectionRef() 57*0b57cec5SDimitry Andric : DebugSubsectionRef(DebugSubsectionKind::FileChecksums) {} 58*0b57cec5SDimitry Andric 59*0b57cec5SDimitry Andric static bool classof(const DebugSubsectionRef *S) { 60*0b57cec5SDimitry Andric return S->kind() == DebugSubsectionKind::FileChecksums; 61*0b57cec5SDimitry Andric } 62*0b57cec5SDimitry Andric 63*0b57cec5SDimitry Andric bool valid() const { return Checksums.valid(); } 64*0b57cec5SDimitry Andric 65*0b57cec5SDimitry Andric Error initialize(BinaryStreamReader Reader); 66*0b57cec5SDimitry Andric Error initialize(BinaryStreamRef Stream); 67*0b57cec5SDimitry Andric 68*0b57cec5SDimitry Andric Iterator begin() const { return Checksums.begin(); } 69*0b57cec5SDimitry Andric Iterator end() const { return Checksums.end(); } 70*0b57cec5SDimitry Andric 71*0b57cec5SDimitry Andric const FileChecksumArray &getArray() const { return Checksums; } 72*0b57cec5SDimitry Andric 73*0b57cec5SDimitry Andric private: 74*0b57cec5SDimitry Andric FileChecksumArray Checksums; 75*0b57cec5SDimitry Andric }; 76*0b57cec5SDimitry Andric 77*0b57cec5SDimitry Andric class DebugChecksumsSubsection final : public DebugSubsection { 78*0b57cec5SDimitry Andric public: 79*0b57cec5SDimitry Andric explicit DebugChecksumsSubsection(DebugStringTableSubsection &Strings); 80*0b57cec5SDimitry Andric 81*0b57cec5SDimitry Andric static bool classof(const DebugSubsection *S) { 82*0b57cec5SDimitry Andric return S->kind() == DebugSubsectionKind::FileChecksums; 83*0b57cec5SDimitry Andric } 84*0b57cec5SDimitry Andric 85*0b57cec5SDimitry Andric void addChecksum(StringRef FileName, FileChecksumKind Kind, 86*0b57cec5SDimitry Andric ArrayRef<uint8_t> Bytes); 87*0b57cec5SDimitry Andric 88*0b57cec5SDimitry Andric uint32_t calculateSerializedSize() const override; 89*0b57cec5SDimitry Andric Error commit(BinaryStreamWriter &Writer) const override; 90*0b57cec5SDimitry Andric uint32_t mapChecksumOffset(StringRef FileName) const; 91*0b57cec5SDimitry Andric 92*0b57cec5SDimitry Andric private: 93*0b57cec5SDimitry Andric DebugStringTableSubsection &Strings; 94*0b57cec5SDimitry Andric 95*0b57cec5SDimitry Andric DenseMap<uint32_t, uint32_t> OffsetMap; 96*0b57cec5SDimitry Andric uint32_t SerializedSize = 0; 97*0b57cec5SDimitry Andric BumpPtrAllocator Storage; 98*0b57cec5SDimitry Andric std::vector<FileChecksumEntry> Checksums; 99*0b57cec5SDimitry Andric }; 100*0b57cec5SDimitry Andric 101*0b57cec5SDimitry Andric } // end namespace codeview 102*0b57cec5SDimitry Andric 103*0b57cec5SDimitry Andric } // end namespace llvm 104 105 #endif // LLVM_DEBUGINFO_CODEVIEW_DEBUGCHECKSUMSSUBSECTION_H 106