14fcfc199SEugene Zelenko //===- StringsAndChecksums.cpp --------------------------------------------===// 2a8cfc29cSZachary Turner // 3a8cfc29cSZachary Turner // The LLVM Compiler Infrastructure 4a8cfc29cSZachary Turner // 5a8cfc29cSZachary Turner // This file is distributed under the University of Illinois Open Source 6a8cfc29cSZachary Turner // License. See LICENSE.TXT for details. 7a8cfc29cSZachary Turner // 8a8cfc29cSZachary Turner //===----------------------------------------------------------------------===// 9a8cfc29cSZachary Turner 10a8cfc29cSZachary Turner #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" 114fcfc199SEugene Zelenko #include "llvm/ADT/STLExtras.h" 124fcfc199SEugene Zelenko #include "llvm/DebugInfo/CodeView/CodeView.h" 13a8cfc29cSZachary Turner #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" 14a8cfc29cSZachary Turner #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h" 15a8cfc29cSZachary Turner #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" 164fcfc199SEugene Zelenko #include "llvm/Support/Error.h" 174fcfc199SEugene Zelenko #include <cassert> 18a8cfc29cSZachary Turner 19a8cfc29cSZachary Turner using namespace llvm; 20a8cfc29cSZachary Turner using namespace llvm::codeview; 21a8cfc29cSZachary Turner 224fcfc199SEugene Zelenko StringsAndChecksumsRef::StringsAndChecksumsRef() = default; 23a8cfc29cSZachary Turner 24a8cfc29cSZachary Turner StringsAndChecksumsRef::StringsAndChecksumsRef( 25a8cfc29cSZachary Turner const DebugStringTableSubsectionRef &Strings) 26a8cfc29cSZachary Turner : Strings(&Strings) {} 27a8cfc29cSZachary Turner 28a8cfc29cSZachary Turner StringsAndChecksumsRef::StringsAndChecksumsRef( 29a8cfc29cSZachary Turner const DebugStringTableSubsectionRef &Strings, 30a8cfc29cSZachary Turner const DebugChecksumsSubsectionRef &Checksums) 31a8cfc29cSZachary Turner : Strings(&Strings), Checksums(&Checksums) {} 32a8cfc29cSZachary Turner 33a8cfc29cSZachary Turner void StringsAndChecksumsRef::initializeStrings( 34a8cfc29cSZachary Turner const DebugSubsectionRecord &SR) { 35a8cfc29cSZachary Turner assert(SR.kind() == DebugSubsectionKind::StringTable); 36a8cfc29cSZachary Turner assert(!Strings && "Found a string table even though we already have one!"); 37a8cfc29cSZachary Turner 38*abb17cc0SZachary Turner OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>(); 39a8cfc29cSZachary Turner consumeError(OwnedStrings->initialize(SR.getRecordData())); 40a8cfc29cSZachary Turner Strings = OwnedStrings.get(); 41a8cfc29cSZachary Turner } 42a8cfc29cSZachary Turner 43*abb17cc0SZachary Turner void StringsAndChecksumsRef::reset() { 44*abb17cc0SZachary Turner resetStrings(); 45*abb17cc0SZachary Turner resetChecksums(); 46*abb17cc0SZachary Turner } 47*abb17cc0SZachary Turner 48*abb17cc0SZachary Turner void StringsAndChecksumsRef::resetStrings() { 49*abb17cc0SZachary Turner OwnedStrings.reset(); 50*abb17cc0SZachary Turner Strings = nullptr; 51*abb17cc0SZachary Turner } 52*abb17cc0SZachary Turner 53*abb17cc0SZachary Turner void StringsAndChecksumsRef::resetChecksums() { 54*abb17cc0SZachary Turner OwnedChecksums.reset(); 55*abb17cc0SZachary Turner Checksums = nullptr; 56*abb17cc0SZachary Turner } 57*abb17cc0SZachary Turner 58*abb17cc0SZachary Turner void StringsAndChecksumsRef::setStrings( 59*abb17cc0SZachary Turner const DebugStringTableSubsectionRef &StringsRef) { 60*abb17cc0SZachary Turner OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>(); 61*abb17cc0SZachary Turner *OwnedStrings = StringsRef; 62*abb17cc0SZachary Turner Strings = OwnedStrings.get(); 63*abb17cc0SZachary Turner } 64*abb17cc0SZachary Turner 654e950647SZachary Turner void StringsAndChecksumsRef::setChecksums( 664e950647SZachary Turner const DebugChecksumsSubsectionRef &CS) { 67*abb17cc0SZachary Turner OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>(); 684e950647SZachary Turner *OwnedChecksums = CS; 694e950647SZachary Turner Checksums = OwnedChecksums.get(); 704e950647SZachary Turner } 714e950647SZachary Turner 72a8cfc29cSZachary Turner void StringsAndChecksumsRef::initializeChecksums( 73a8cfc29cSZachary Turner const DebugSubsectionRecord &FCR) { 74a8cfc29cSZachary Turner assert(FCR.kind() == DebugSubsectionKind::FileChecksums); 75a8cfc29cSZachary Turner if (Checksums) 76a8cfc29cSZachary Turner return; 77a8cfc29cSZachary Turner 78*abb17cc0SZachary Turner OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>(); 79a8cfc29cSZachary Turner consumeError(OwnedChecksums->initialize(FCR.getRecordData())); 80a8cfc29cSZachary Turner Checksums = OwnedChecksums.get(); 81a8cfc29cSZachary Turner } 82