18c099fe0SZachary Turner //===- DebugChecksumsSubsection.h -------------------------------*- C++ -*-===// 28c099fe0SZachary Turner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 68c099fe0SZachary Turner // 78c099fe0SZachary Turner //===----------------------------------------------------------------------===// 88c099fe0SZachary Turner 98c099fe0SZachary Turner #ifndef LLVM_DEBUGINFO_CODEVIEW_DEBUGCHECKSUMSSUBSECTION_H 108c099fe0SZachary Turner #define LLVM_DEBUGINFO_CODEVIEW_DEBUGCHECKSUMSSUBSECTION_H 118c099fe0SZachary Turner 128c099fe0SZachary Turner #include "llvm/ADT/ArrayRef.h" 138c099fe0SZachary Turner #include "llvm/ADT/DenseMap.h" 148456b16eSEugene Zelenko #include "llvm/ADT/StringRef.h" 158456b16eSEugene Zelenko #include "llvm/DebugInfo/CodeView/CodeView.h" 168c099fe0SZachary Turner #include "llvm/DebugInfo/CodeView/DebugSubsection.h" 178c099fe0SZachary Turner #include "llvm/Support/Allocator.h" 188c099fe0SZachary Turner #include "llvm/Support/BinaryStreamArray.h" 198456b16eSEugene Zelenko #include "llvm/Support/BinaryStreamRef.h" 208456b16eSEugene Zelenko #include "llvm/Support/Error.h" 218456b16eSEugene Zelenko #include <cstdint> 228456b16eSEugene Zelenko #include <vector> 238c099fe0SZachary Turner 248c099fe0SZachary Turner namespace llvm { 258456b16eSEugene Zelenko 26*81cde474Sserge-sans-paille class BinaryStreamReader; 27*81cde474Sserge-sans-paille class BinaryStreamWriter; 28*81cde474Sserge-sans-paille 298c099fe0SZachary Turner namespace codeview { 308c099fe0SZachary Turner 31591312c5SZachary Turner class DebugStringTableSubsection; 328c099fe0SZachary Turner 338c099fe0SZachary Turner struct FileChecksumEntry { 348c099fe0SZachary Turner uint32_t FileNameOffset; // Byte offset of filename in global stringtable. 358c099fe0SZachary Turner FileChecksumKind Kind; // The type of checksum. 368c099fe0SZachary Turner ArrayRef<uint8_t> Checksum; // The bytes of the checksum. 378c099fe0SZachary Turner }; 388c099fe0SZachary Turner 398456b16eSEugene Zelenko } // end namespace codeview 408456b16eSEugene Zelenko 418c099fe0SZachary Turner template <> struct VarStreamArrayExtractor<codeview::FileChecksumEntry> { 428c099fe0SZachary Turner public: 438456b16eSEugene Zelenko using ContextType = void; 448c099fe0SZachary Turner 457e62cd17SZachary Turner Error operator()(BinaryStreamRef Stream, uint32_t &Len, 468c099fe0SZachary Turner codeview::FileChecksumEntry &Item); 478c099fe0SZachary Turner }; 488c099fe0SZachary Turner 498c099fe0SZachary Turner namespace codeview { 508456b16eSEugene Zelenko 518c099fe0SZachary Turner class DebugChecksumsSubsectionRef final : public DebugSubsectionRef { 528456b16eSEugene Zelenko using FileChecksumArray = VarStreamArray<codeview::FileChecksumEntry>; 538456b16eSEugene Zelenko using Iterator = FileChecksumArray::Iterator; 548c099fe0SZachary Turner 558c099fe0SZachary Turner public: 568c099fe0SZachary Turner DebugChecksumsSubsectionRef() 578c099fe0SZachary Turner : DebugSubsectionRef(DebugSubsectionKind::FileChecksums) {} 588c099fe0SZachary Turner 598c099fe0SZachary Turner static bool classof(const DebugSubsectionRef *S) { 608c099fe0SZachary Turner return S->kind() == DebugSubsectionKind::FileChecksums; 618c099fe0SZachary Turner } 628c099fe0SZachary Turner 63591312c5SZachary Turner bool valid() const { return Checksums.valid(); } 64591312c5SZachary Turner 658c099fe0SZachary Turner Error initialize(BinaryStreamReader Reader); 66591312c5SZachary Turner Error initialize(BinaryStreamRef Stream); 678c099fe0SZachary Turner 6892dcdda6SZachary Turner Iterator begin() const { return Checksums.begin(); } 6992dcdda6SZachary Turner Iterator end() const { return Checksums.end(); } 708c099fe0SZachary Turner 718c099fe0SZachary Turner const FileChecksumArray &getArray() const { return Checksums; } 728c099fe0SZachary Turner 738c099fe0SZachary Turner private: 748c099fe0SZachary Turner FileChecksumArray Checksums; 758c099fe0SZachary Turner }; 768c099fe0SZachary Turner 778c099fe0SZachary Turner class DebugChecksumsSubsection final : public DebugSubsection { 788c099fe0SZachary Turner public: 79591312c5SZachary Turner explicit DebugChecksumsSubsection(DebugStringTableSubsection &Strings); 808c099fe0SZachary Turner 818c099fe0SZachary Turner static bool classof(const DebugSubsection *S) { 828c099fe0SZachary Turner return S->kind() == DebugSubsectionKind::FileChecksums; 838c099fe0SZachary Turner } 848c099fe0SZachary Turner 858c099fe0SZachary Turner void addChecksum(StringRef FileName, FileChecksumKind Kind, 868c099fe0SZachary Turner ArrayRef<uint8_t> Bytes); 878c099fe0SZachary Turner 88591312c5SZachary Turner uint32_t calculateSerializedSize() const override; 89591312c5SZachary Turner Error commit(BinaryStreamWriter &Writer) const override; 908c099fe0SZachary Turner uint32_t mapChecksumOffset(StringRef FileName) const; 918c099fe0SZachary Turner 928c099fe0SZachary Turner private: 93591312c5SZachary Turner DebugStringTableSubsection &Strings; 948c099fe0SZachary Turner 958c099fe0SZachary Turner DenseMap<uint32_t, uint32_t> OffsetMap; 968c099fe0SZachary Turner uint32_t SerializedSize = 0; 978456b16eSEugene Zelenko BumpPtrAllocator Storage; 988c099fe0SZachary Turner std::vector<FileChecksumEntry> Checksums; 998c099fe0SZachary Turner }; 1008c099fe0SZachary Turner 1018456b16eSEugene Zelenko } // end namespace codeview 1028456b16eSEugene Zelenko 1038456b16eSEugene Zelenko } // end namespace llvm 1048456b16eSEugene Zelenko 1058456b16eSEugene Zelenko #endif // LLVM_DEBUGINFO_CODEVIEW_DEBUGCHECKSUMSSUBSECTION_H 106