1//===- StringsAndChecksums.cpp --------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
10#include "llvm/DebugInfo/CodeView/CodeView.h"
11#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
12#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
13#include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
14#include "llvm/Support/Error.h"
15#include <cassert>
16
17using namespace llvm;
18using namespace llvm::codeview;
19
20StringsAndChecksumsRef::StringsAndChecksumsRef() = default;
21
22StringsAndChecksumsRef::StringsAndChecksumsRef(
23 const DebugStringTableSubsectionRef &Strings)
24 : Strings(&Strings) {}
25
26StringsAndChecksumsRef::StringsAndChecksumsRef(
27 const DebugStringTableSubsectionRef &Strings,
28 const DebugChecksumsSubsectionRef &Checksums)
29 : Strings(&Strings), Checksums(&Checksums) {}
30
31void StringsAndChecksumsRef::initializeStrings(
32 const DebugSubsectionRecord &SR) {
33 assert(SR.kind() == DebugSubsectionKind::StringTable);
34 assert(!Strings && "Found a string table even though we already have one!");
35
36 OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>();
37 consumeError(Err: OwnedStrings->initialize(Contents: SR.getRecordData()));
38 Strings = OwnedStrings.get();
39}
40
41void StringsAndChecksumsRef::reset() {
42 resetStrings();
43 resetChecksums();
44}
45
46void StringsAndChecksumsRef::resetStrings() {
47 OwnedStrings.reset();
48 Strings = nullptr;
49}
50
51void StringsAndChecksumsRef::resetChecksums() {
52 OwnedChecksums.reset();
53 Checksums = nullptr;
54}
55
56void StringsAndChecksumsRef::setStrings(
57 const DebugStringTableSubsectionRef &StringsRef) {
58 OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>();
59 *OwnedStrings = StringsRef;
60 Strings = OwnedStrings.get();
61}
62
63void StringsAndChecksumsRef::setChecksums(
64 const DebugChecksumsSubsectionRef &CS) {
65 OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>();
66 *OwnedChecksums = CS;
67 Checksums = OwnedChecksums.get();
68}
69
70void StringsAndChecksumsRef::initializeChecksums(
71 const DebugSubsectionRecord &FCR) {
72 assert(FCR.kind() == DebugSubsectionKind::FileChecksums);
73 if (Checksums)
74 return;
75
76 OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>();
77 consumeError(Err: OwnedChecksums->initialize(Stream: FCR.getRecordData()));
78 Checksums = OwnedChecksums.get();
79}
80