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