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 TurnerStringsAndChecksumsRef::StringsAndChecksumsRef( 23a8cfc29cSZachary Turner const DebugStringTableSubsectionRef &Strings) 24a8cfc29cSZachary Turner : Strings(&Strings) {} 25a8cfc29cSZachary Turner StringsAndChecksumsRef(const DebugStringTableSubsectionRef & Strings,const DebugChecksumsSubsectionRef & Checksums)26a8cfc29cSZachary TurnerStringsAndChecksumsRef::StringsAndChecksumsRef( 27a8cfc29cSZachary Turner const DebugStringTableSubsectionRef &Strings, 28a8cfc29cSZachary Turner const DebugChecksumsSubsectionRef &Checksums) 29a8cfc29cSZachary Turner : Strings(&Strings), Checksums(&Checksums) {} 30a8cfc29cSZachary Turner initializeStrings(const DebugSubsectionRecord & SR)31a8cfc29cSZachary Turnervoid 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 Turnervoid StringsAndChecksumsRef::reset() { 42abb17cc0SZachary Turner resetStrings(); 43abb17cc0SZachary Turner resetChecksums(); 44abb17cc0SZachary Turner } 45abb17cc0SZachary Turner resetStrings()46abb17cc0SZachary Turnervoid StringsAndChecksumsRef::resetStrings() { 47abb17cc0SZachary Turner OwnedStrings.reset(); 48abb17cc0SZachary Turner Strings = nullptr; 49abb17cc0SZachary Turner } 50abb17cc0SZachary Turner resetChecksums()51abb17cc0SZachary Turnervoid StringsAndChecksumsRef::resetChecksums() { 52abb17cc0SZachary Turner OwnedChecksums.reset(); 53abb17cc0SZachary Turner Checksums = nullptr; 54abb17cc0SZachary Turner } 55abb17cc0SZachary Turner setStrings(const DebugStringTableSubsectionRef & StringsRef)56abb17cc0SZachary Turnervoid 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 Turnervoid 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 Turnervoid 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