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(OwnedStrings->initialize(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(OwnedChecksums->initialize(FCR.getRecordData()));
78  Checksums = OwnedChecksums.get();
79}
80