xref: /llvm-project/llvm/lib/DebugInfo/CodeView/StringsAndChecksums.cpp (revision 81cde474e2c5a6280cb693b777ddcf473825ae8a)
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/DebugInfo/CodeView/CodeView.h"
11a8cfc29cSZachary Turner #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
12a8cfc29cSZachary Turner #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
13a8cfc29cSZachary Turner #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
144fcfc199SEugene Zelenko #include "llvm/Support/Error.h"
154fcfc199SEugene Zelenko #include <cassert>
16a8cfc29cSZachary Turner 
17a8cfc29cSZachary Turner using namespace llvm;
18a8cfc29cSZachary Turner using namespace llvm::codeview;
19a8cfc29cSZachary Turner 
204fcfc199SEugene Zelenko StringsAndChecksumsRef::StringsAndChecksumsRef() = default;
21a8cfc29cSZachary Turner 
StringsAndChecksumsRef(const DebugStringTableSubsectionRef & Strings)22a8cfc29cSZachary Turner StringsAndChecksumsRef::StringsAndChecksumsRef(
23a8cfc29cSZachary Turner     const DebugStringTableSubsectionRef &Strings)
24a8cfc29cSZachary Turner     : Strings(&Strings) {}
25a8cfc29cSZachary Turner 
StringsAndChecksumsRef(const DebugStringTableSubsectionRef & Strings,const DebugChecksumsSubsectionRef & Checksums)26a8cfc29cSZachary Turner StringsAndChecksumsRef::StringsAndChecksumsRef(
27a8cfc29cSZachary Turner     const DebugStringTableSubsectionRef &Strings,
28a8cfc29cSZachary Turner     const DebugChecksumsSubsectionRef &Checksums)
29a8cfc29cSZachary Turner     : Strings(&Strings), Checksums(&Checksums) {}
30a8cfc29cSZachary Turner 
initializeStrings(const DebugSubsectionRecord & SR)31a8cfc29cSZachary Turner void StringsAndChecksumsRef::initializeStrings(
32a8cfc29cSZachary Turner     const DebugSubsectionRecord &SR) {
33a8cfc29cSZachary Turner   assert(SR.kind() == DebugSubsectionKind::StringTable);
34a8cfc29cSZachary Turner   assert(!Strings && "Found a string table even though we already have one!");
35a8cfc29cSZachary Turner 
36abb17cc0SZachary Turner   OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>();
37a8cfc29cSZachary Turner   consumeError(OwnedStrings->initialize(SR.getRecordData()));
38a8cfc29cSZachary Turner   Strings = OwnedStrings.get();
39a8cfc29cSZachary Turner }
40a8cfc29cSZachary Turner 
reset()41abb17cc0SZachary Turner void StringsAndChecksumsRef::reset() {
42abb17cc0SZachary Turner   resetStrings();
43abb17cc0SZachary Turner   resetChecksums();
44abb17cc0SZachary Turner }
45abb17cc0SZachary Turner 
resetStrings()46abb17cc0SZachary Turner void StringsAndChecksumsRef::resetStrings() {
47abb17cc0SZachary Turner   OwnedStrings.reset();
48abb17cc0SZachary Turner   Strings = nullptr;
49abb17cc0SZachary Turner }
50abb17cc0SZachary Turner 
resetChecksums()51abb17cc0SZachary Turner void StringsAndChecksumsRef::resetChecksums() {
52abb17cc0SZachary Turner   OwnedChecksums.reset();
53abb17cc0SZachary Turner   Checksums = nullptr;
54abb17cc0SZachary Turner }
55abb17cc0SZachary Turner 
setStrings(const DebugStringTableSubsectionRef & StringsRef)56abb17cc0SZachary Turner void StringsAndChecksumsRef::setStrings(
57abb17cc0SZachary Turner     const DebugStringTableSubsectionRef &StringsRef) {
58abb17cc0SZachary Turner   OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>();
59abb17cc0SZachary Turner   *OwnedStrings = StringsRef;
60abb17cc0SZachary Turner   Strings = OwnedStrings.get();
61abb17cc0SZachary Turner }
62abb17cc0SZachary Turner 
setChecksums(const DebugChecksumsSubsectionRef & CS)634e950647SZachary Turner void StringsAndChecksumsRef::setChecksums(
644e950647SZachary Turner     const DebugChecksumsSubsectionRef &CS) {
65abb17cc0SZachary Turner   OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>();
664e950647SZachary Turner   *OwnedChecksums = CS;
674e950647SZachary Turner   Checksums = OwnedChecksums.get();
684e950647SZachary Turner }
694e950647SZachary Turner 
initializeChecksums(const DebugSubsectionRecord & FCR)70a8cfc29cSZachary Turner void StringsAndChecksumsRef::initializeChecksums(
71a8cfc29cSZachary Turner     const DebugSubsectionRecord &FCR) {
72a8cfc29cSZachary Turner   assert(FCR.kind() == DebugSubsectionKind::FileChecksums);
73a8cfc29cSZachary Turner   if (Checksums)
74a8cfc29cSZachary Turner     return;
75a8cfc29cSZachary Turner 
76abb17cc0SZachary Turner   OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>();
77a8cfc29cSZachary Turner   consumeError(OwnedChecksums->initialize(FCR.getRecordData()));
78a8cfc29cSZachary Turner   Checksums = OwnedChecksums.get();
79a8cfc29cSZachary Turner }
80