1a580b014SDimitry Andric //===- StringsAndChecksums.cpp --------------------------------------------===// 224d58133SDimitry Andric // 324d58133SDimitry Andric // The LLVM Compiler Infrastructure 424d58133SDimitry Andric // 524d58133SDimitry Andric // This file is distributed under the University of Illinois Open Source 624d58133SDimitry Andric // License. See LICENSE.TXT for details. 724d58133SDimitry Andric // 824d58133SDimitry Andric //===----------------------------------------------------------------------===// 924d58133SDimitry Andric 1024d58133SDimitry Andric #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" 11a580b014SDimitry Andric #include "llvm/ADT/STLExtras.h" 12a580b014SDimitry Andric #include "llvm/DebugInfo/CodeView/CodeView.h" 1324d58133SDimitry Andric #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" 1424d58133SDimitry Andric #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h" 1524d58133SDimitry Andric #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" 16a580b014SDimitry Andric #include "llvm/Support/Error.h" 17a580b014SDimitry Andric #include <cassert> 1824d58133SDimitry Andric 1924d58133SDimitry Andric using namespace llvm; 2024d58133SDimitry Andric using namespace llvm::codeview; 2124d58133SDimitry Andric 22a580b014SDimitry Andric StringsAndChecksumsRef::StringsAndChecksumsRef() = default; 2324d58133SDimitry Andric StringsAndChecksumsRef(const DebugStringTableSubsectionRef & Strings)2424d58133SDimitry AndricStringsAndChecksumsRef::StringsAndChecksumsRef( 2524d58133SDimitry Andric const DebugStringTableSubsectionRef &Strings) 2624d58133SDimitry Andric : Strings(&Strings) {} 2724d58133SDimitry Andric StringsAndChecksumsRef(const DebugStringTableSubsectionRef & Strings,const DebugChecksumsSubsectionRef & Checksums)2824d58133SDimitry AndricStringsAndChecksumsRef::StringsAndChecksumsRef( 2924d58133SDimitry Andric const DebugStringTableSubsectionRef &Strings, 3024d58133SDimitry Andric const DebugChecksumsSubsectionRef &Checksums) 3124d58133SDimitry Andric : Strings(&Strings), Checksums(&Checksums) {} 3224d58133SDimitry Andric initializeStrings(const DebugSubsectionRecord & SR)3324d58133SDimitry Andricvoid StringsAndChecksumsRef::initializeStrings( 3424d58133SDimitry Andric const DebugSubsectionRecord &SR) { 3524d58133SDimitry Andric assert(SR.kind() == DebugSubsectionKind::StringTable); 3624d58133SDimitry Andric assert(!Strings && "Found a string table even though we already have one!"); 3724d58133SDimitry Andric 38*2cab237bSDimitry Andric OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>(); 3924d58133SDimitry Andric consumeError(OwnedStrings->initialize(SR.getRecordData())); 4024d58133SDimitry Andric Strings = OwnedStrings.get(); 4124d58133SDimitry Andric } 4224d58133SDimitry Andric reset()43*2cab237bSDimitry Andricvoid StringsAndChecksumsRef::reset() { 44*2cab237bSDimitry Andric resetStrings(); 45*2cab237bSDimitry Andric resetChecksums(); 46*2cab237bSDimitry Andric } 47*2cab237bSDimitry Andric resetStrings()48*2cab237bSDimitry Andricvoid StringsAndChecksumsRef::resetStrings() { 49*2cab237bSDimitry Andric OwnedStrings.reset(); 50*2cab237bSDimitry Andric Strings = nullptr; 51*2cab237bSDimitry Andric } 52*2cab237bSDimitry Andric resetChecksums()53*2cab237bSDimitry Andricvoid StringsAndChecksumsRef::resetChecksums() { 54*2cab237bSDimitry Andric OwnedChecksums.reset(); 55*2cab237bSDimitry Andric Checksums = nullptr; 56*2cab237bSDimitry Andric } 57*2cab237bSDimitry Andric setStrings(const DebugStringTableSubsectionRef & StringsRef)58*2cab237bSDimitry Andricvoid StringsAndChecksumsRef::setStrings( 59*2cab237bSDimitry Andric const DebugStringTableSubsectionRef &StringsRef) { 60*2cab237bSDimitry Andric OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>(); 61*2cab237bSDimitry Andric *OwnedStrings = StringsRef; 62*2cab237bSDimitry Andric Strings = OwnedStrings.get(); 63*2cab237bSDimitry Andric } 64*2cab237bSDimitry Andric setChecksums(const DebugChecksumsSubsectionRef & CS)6524d58133SDimitry Andricvoid StringsAndChecksumsRef::setChecksums( 6624d58133SDimitry Andric const DebugChecksumsSubsectionRef &CS) { 67*2cab237bSDimitry Andric OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>(); 6824d58133SDimitry Andric *OwnedChecksums = CS; 6924d58133SDimitry Andric Checksums = OwnedChecksums.get(); 7024d58133SDimitry Andric } 7124d58133SDimitry Andric initializeChecksums(const DebugSubsectionRecord & FCR)7224d58133SDimitry Andricvoid StringsAndChecksumsRef::initializeChecksums( 7324d58133SDimitry Andric const DebugSubsectionRecord &FCR) { 7424d58133SDimitry Andric assert(FCR.kind() == DebugSubsectionKind::FileChecksums); 7524d58133SDimitry Andric if (Checksums) 7624d58133SDimitry Andric return; 7724d58133SDimitry Andric 78*2cab237bSDimitry Andric OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>(); 7924d58133SDimitry Andric consumeError(OwnedChecksums->initialize(FCR.getRecordData())); 8024d58133SDimitry Andric Checksums = OwnedChecksums.get(); 8124d58133SDimitry Andric } 82