xref: /llvm-project/llvm/include/llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h (revision 81cde474e2c5a6280cb693b777ddcf473825ae8a)
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