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