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 AndricStringsAndChecksumsRef::StringsAndChecksumsRef( 237c7aba6eSDimitry Andric const DebugStringTableSubsectionRef &Strings) 247c7aba6eSDimitry Andric : Strings(&Strings) {} 257c7aba6eSDimitry Andric StringsAndChecksumsRef(const DebugStringTableSubsectionRef & Strings,const DebugChecksumsSubsectionRef & Checksums)267c7aba6eSDimitry AndricStringsAndChecksumsRef::StringsAndChecksumsRef( 277c7aba6eSDimitry Andric const DebugStringTableSubsectionRef &Strings, 287c7aba6eSDimitry Andric const DebugChecksumsSubsectionRef &Checksums) 297c7aba6eSDimitry Andric : Strings(&Strings), Checksums(&Checksums) {} 307c7aba6eSDimitry Andric initializeStrings(const DebugSubsectionRecord & SR)317c7aba6eSDimitry Andricvoid 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 Andricvoid StringsAndChecksumsRef::reset() { 42044eb2f6SDimitry Andric resetStrings(); 43044eb2f6SDimitry Andric resetChecksums(); 44044eb2f6SDimitry Andric } 45044eb2f6SDimitry Andric resetStrings()46044eb2f6SDimitry Andricvoid StringsAndChecksumsRef::resetStrings() { 47044eb2f6SDimitry Andric OwnedStrings.reset(); 48044eb2f6SDimitry Andric Strings = nullptr; 49044eb2f6SDimitry Andric } 50044eb2f6SDimitry Andric resetChecksums()51044eb2f6SDimitry Andricvoid StringsAndChecksumsRef::resetChecksums() { 52044eb2f6SDimitry Andric OwnedChecksums.reset(); 53044eb2f6SDimitry Andric Checksums = nullptr; 54044eb2f6SDimitry Andric } 55044eb2f6SDimitry Andric setStrings(const DebugStringTableSubsectionRef & StringsRef)56044eb2f6SDimitry Andricvoid 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 Andricvoid 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 Andricvoid 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