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/ADT/STLExtras.h" 11 #include "llvm/DebugInfo/CodeView/CodeView.h" 12 #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" 13 #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h" 14 #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" 15 #include "llvm/Support/Error.h" 16 #include <cassert> 17 18 using namespace llvm; 19 using namespace llvm::codeview; 20 21 StringsAndChecksumsRef::StringsAndChecksumsRef() = default; 22 23 StringsAndChecksumsRef::StringsAndChecksumsRef( 24 const DebugStringTableSubsectionRef &Strings) 25 : Strings(&Strings) {} 26 27 StringsAndChecksumsRef::StringsAndChecksumsRef( 28 const DebugStringTableSubsectionRef &Strings, 29 const DebugChecksumsSubsectionRef &Checksums) 30 : Strings(&Strings), Checksums(&Checksums) {} 31 32 void StringsAndChecksumsRef::initializeStrings( 33 const DebugSubsectionRecord &SR) { 34 assert(SR.kind() == DebugSubsectionKind::StringTable); 35 assert(!Strings && "Found a string table even though we already have one!"); 36 37 OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>(); 38 consumeError(OwnedStrings->initialize(SR.getRecordData())); 39 Strings = OwnedStrings.get(); 40 } 41 42 void StringsAndChecksumsRef::reset() { 43 resetStrings(); 44 resetChecksums(); 45 } 46 47 void StringsAndChecksumsRef::resetStrings() { 48 OwnedStrings.reset(); 49 Strings = nullptr; 50 } 51 52 void StringsAndChecksumsRef::resetChecksums() { 53 OwnedChecksums.reset(); 54 Checksums = nullptr; 55 } 56 57 void StringsAndChecksumsRef::setStrings( 58 const DebugStringTableSubsectionRef &StringsRef) { 59 OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>(); 60 *OwnedStrings = StringsRef; 61 Strings = OwnedStrings.get(); 62 } 63 64 void StringsAndChecksumsRef::setChecksums( 65 const DebugChecksumsSubsectionRef &CS) { 66 OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>(); 67 *OwnedChecksums = CS; 68 Checksums = OwnedChecksums.get(); 69 } 70 71 void StringsAndChecksumsRef::initializeChecksums( 72 const DebugSubsectionRecord &FCR) { 73 assert(FCR.kind() == DebugSubsectionKind::FileChecksums); 74 if (Checksums) 75 return; 76 77 OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>(); 78 consumeError(OwnedChecksums->initialize(FCR.getRecordData())); 79 Checksums = OwnedChecksums.get(); 80 } 81