1 //===- StringsAndChecksums.cpp --------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" 10 #include "llvm/DebugInfo/CodeView/CodeView.h" 11 #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" 12 #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h" 13 #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" 14 #include "llvm/Support/Error.h" 15 #include <cassert> 16 17 using namespace llvm; 18 using namespace llvm::codeview; 19 20 StringsAndChecksumsRef::StringsAndChecksumsRef() = default; 21 22 StringsAndChecksumsRef::StringsAndChecksumsRef( 23 const DebugStringTableSubsectionRef &Strings) 24 : Strings(&Strings) {} 25 26 StringsAndChecksumsRef::StringsAndChecksumsRef( 27 const DebugStringTableSubsectionRef &Strings, 28 const DebugChecksumsSubsectionRef &Checksums) 29 : Strings(&Strings), Checksums(&Checksums) {} 30 31 void StringsAndChecksumsRef::initializeStrings( 32 const DebugSubsectionRecord &SR) { 33 assert(SR.kind() == DebugSubsectionKind::StringTable); 34 assert(!Strings && "Found a string table even though we already have one!"); 35 36 OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>(); 37 consumeError(OwnedStrings->initialize(SR.getRecordData())); 38 Strings = OwnedStrings.get(); 39 } 40 41 void StringsAndChecksumsRef::reset() { 42 resetStrings(); 43 resetChecksums(); 44 } 45 46 void StringsAndChecksumsRef::resetStrings() { 47 OwnedStrings.reset(); 48 Strings = nullptr; 49 } 50 51 void StringsAndChecksumsRef::resetChecksums() { 52 OwnedChecksums.reset(); 53 Checksums = nullptr; 54 } 55 56 void StringsAndChecksumsRef::setStrings( 57 const DebugStringTableSubsectionRef &StringsRef) { 58 OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>(); 59 *OwnedStrings = StringsRef; 60 Strings = OwnedStrings.get(); 61 } 62 63 void StringsAndChecksumsRef::setChecksums( 64 const DebugChecksumsSubsectionRef &CS) { 65 OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>(); 66 *OwnedChecksums = CS; 67 Checksums = OwnedChecksums.get(); 68 } 69 70 void StringsAndChecksumsRef::initializeChecksums( 71 const DebugSubsectionRecord &FCR) { 72 assert(FCR.kind() == DebugSubsectionKind::FileChecksums); 73 if (Checksums) 74 return; 75 76 OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>(); 77 consumeError(OwnedChecksums->initialize(FCR.getRecordData())); 78 Checksums = OwnedChecksums.get(); 79 } 80