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