blob: 78b284563afd90023a1ddde8f930ee04b6700c54 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- 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
26namespace llvm {
27
28namespace codeview {
29
30class DebugStringTableSubsection;
31
32struct 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
40template <> struct VarStreamArrayExtractor<codeview::FileChecksumEntry> {
41public:
42 using ContextType = void;
43
44 Error operator()(BinaryStreamRef Stream, uint32_t &Len,
45 codeview::FileChecksumEntry &Item);
46};
47
48namespace codeview {
49
50class DebugChecksumsSubsectionRef final : public DebugSubsectionRef {
51 using FileChecksumArray = VarStreamArray<codeview::FileChecksumEntry>;
52 using Iterator = FileChecksumArray::Iterator;
53
54public:
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
72private:
73 FileChecksumArray Checksums;
74};
75
76class DebugChecksumsSubsection final : public DebugSubsection {
77public:
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
91private:
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