xref: /src/contrib/llvm-project/llvm/lib/DebugInfo/CodeView/StringsAndChecksums.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
19df3605dSDimitry Andric //===- StringsAndChecksums.cpp --------------------------------------------===//
27c7aba6eSDimitry Andric //
3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67c7aba6eSDimitry Andric //
77c7aba6eSDimitry Andric //===----------------------------------------------------------------------===//
87c7aba6eSDimitry Andric 
97c7aba6eSDimitry Andric #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
109df3605dSDimitry Andric #include "llvm/DebugInfo/CodeView/CodeView.h"
117c7aba6eSDimitry Andric #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
127c7aba6eSDimitry Andric #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
137c7aba6eSDimitry Andric #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h"
149df3605dSDimitry Andric #include "llvm/Support/Error.h"
159df3605dSDimitry Andric #include <cassert>
167c7aba6eSDimitry Andric 
177c7aba6eSDimitry Andric using namespace llvm;
187c7aba6eSDimitry Andric using namespace llvm::codeview;
197c7aba6eSDimitry Andric 
209df3605dSDimitry Andric StringsAndChecksumsRef::StringsAndChecksumsRef() = default;
217c7aba6eSDimitry Andric 
StringsAndChecksumsRef(const DebugStringTableSubsectionRef & Strings)227c7aba6eSDimitry Andric StringsAndChecksumsRef::StringsAndChecksumsRef(
237c7aba6eSDimitry Andric     const DebugStringTableSubsectionRef &Strings)
247c7aba6eSDimitry Andric     : Strings(&Strings) {}
257c7aba6eSDimitry Andric 
StringsAndChecksumsRef(const DebugStringTableSubsectionRef & Strings,const DebugChecksumsSubsectionRef & Checksums)267c7aba6eSDimitry Andric StringsAndChecksumsRef::StringsAndChecksumsRef(
277c7aba6eSDimitry Andric     const DebugStringTableSubsectionRef &Strings,
287c7aba6eSDimitry Andric     const DebugChecksumsSubsectionRef &Checksums)
297c7aba6eSDimitry Andric     : Strings(&Strings), Checksums(&Checksums) {}
307c7aba6eSDimitry Andric 
initializeStrings(const DebugSubsectionRecord & SR)317c7aba6eSDimitry Andric void StringsAndChecksumsRef::initializeStrings(
327c7aba6eSDimitry Andric     const DebugSubsectionRecord &SR) {
337c7aba6eSDimitry Andric   assert(SR.kind() == DebugSubsectionKind::StringTable);
347c7aba6eSDimitry Andric   assert(!Strings && "Found a string table even though we already have one!");
357c7aba6eSDimitry Andric 
36044eb2f6SDimitry Andric   OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>();
377c7aba6eSDimitry Andric   consumeError(OwnedStrings->initialize(SR.getRecordData()));
387c7aba6eSDimitry Andric   Strings = OwnedStrings.get();
397c7aba6eSDimitry Andric }
407c7aba6eSDimitry Andric 
reset()41044eb2f6SDimitry Andric void StringsAndChecksumsRef::reset() {
42044eb2f6SDimitry Andric   resetStrings();
43044eb2f6SDimitry Andric   resetChecksums();
44044eb2f6SDimitry Andric }
45044eb2f6SDimitry Andric 
resetStrings()46044eb2f6SDimitry Andric void StringsAndChecksumsRef::resetStrings() {
47044eb2f6SDimitry Andric   OwnedStrings.reset();
48044eb2f6SDimitry Andric   Strings = nullptr;
49044eb2f6SDimitry Andric }
50044eb2f6SDimitry Andric 
resetChecksums()51044eb2f6SDimitry Andric void StringsAndChecksumsRef::resetChecksums() {
52044eb2f6SDimitry Andric   OwnedChecksums.reset();
53044eb2f6SDimitry Andric   Checksums = nullptr;
54044eb2f6SDimitry Andric }
55044eb2f6SDimitry Andric 
setStrings(const DebugStringTableSubsectionRef & StringsRef)56044eb2f6SDimitry Andric void StringsAndChecksumsRef::setStrings(
57044eb2f6SDimitry Andric     const DebugStringTableSubsectionRef &StringsRef) {
58044eb2f6SDimitry Andric   OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>();
59044eb2f6SDimitry Andric   *OwnedStrings = StringsRef;
60044eb2f6SDimitry Andric   Strings = OwnedStrings.get();
61044eb2f6SDimitry Andric }
62044eb2f6SDimitry Andric 
setChecksums(const DebugChecksumsSubsectionRef & CS)637c7aba6eSDimitry Andric void StringsAndChecksumsRef::setChecksums(
647c7aba6eSDimitry Andric     const DebugChecksumsSubsectionRef &CS) {
65044eb2f6SDimitry Andric   OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>();
667c7aba6eSDimitry Andric   *OwnedChecksums = CS;
677c7aba6eSDimitry Andric   Checksums = OwnedChecksums.get();
687c7aba6eSDimitry Andric }
697c7aba6eSDimitry Andric 
initializeChecksums(const DebugSubsectionRecord & FCR)707c7aba6eSDimitry Andric void StringsAndChecksumsRef::initializeChecksums(
717c7aba6eSDimitry Andric     const DebugSubsectionRecord &FCR) {
727c7aba6eSDimitry Andric   assert(FCR.kind() == DebugSubsectionKind::FileChecksums);
737c7aba6eSDimitry Andric   if (Checksums)
747c7aba6eSDimitry Andric     return;
757c7aba6eSDimitry Andric 
76044eb2f6SDimitry Andric   OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>();
777c7aba6eSDimitry Andric   consumeError(OwnedChecksums->initialize(FCR.getRecordData()));
787c7aba6eSDimitry Andric   Checksums = OwnedChecksums.get();
797c7aba6eSDimitry Andric }
80