| //===- StringsAndChecksums.cpp --------------------------------------------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" |
| #include "llvm/ADT/STLExtras.h" |
| #include "llvm/DebugInfo/CodeView/CodeView.h" |
| #include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" |
| #include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h" |
| #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" |
| #include "llvm/Support/Error.h" |
| #include <cassert> |
| |
| using namespace llvm; |
| using namespace llvm::codeview; |
| |
| StringsAndChecksumsRef::StringsAndChecksumsRef() = default; |
| |
| StringsAndChecksumsRef::StringsAndChecksumsRef( |
| const DebugStringTableSubsectionRef &Strings) |
| : Strings(&Strings) {} |
| |
| StringsAndChecksumsRef::StringsAndChecksumsRef( |
| const DebugStringTableSubsectionRef &Strings, |
| const DebugChecksumsSubsectionRef &Checksums) |
| : Strings(&Strings), Checksums(&Checksums) {} |
| |
| void StringsAndChecksumsRef::initializeStrings( |
| const DebugSubsectionRecord &SR) { |
| assert(SR.kind() == DebugSubsectionKind::StringTable); |
| assert(!Strings && "Found a string table even though we already have one!"); |
| |
| OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>(); |
| consumeError(OwnedStrings->initialize(SR.getRecordData())); |
| Strings = OwnedStrings.get(); |
| } |
| |
| void StringsAndChecksumsRef::reset() { |
| resetStrings(); |
| resetChecksums(); |
| } |
| |
| void StringsAndChecksumsRef::resetStrings() { |
| OwnedStrings.reset(); |
| Strings = nullptr; |
| } |
| |
| void StringsAndChecksumsRef::resetChecksums() { |
| OwnedChecksums.reset(); |
| Checksums = nullptr; |
| } |
| |
| void StringsAndChecksumsRef::setStrings( |
| const DebugStringTableSubsectionRef &StringsRef) { |
| OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>(); |
| *OwnedStrings = StringsRef; |
| Strings = OwnedStrings.get(); |
| } |
| |
| void StringsAndChecksumsRef::setChecksums( |
| const DebugChecksumsSubsectionRef &CS) { |
| OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>(); |
| *OwnedChecksums = CS; |
| Checksums = OwnedChecksums.get(); |
| } |
| |
| void StringsAndChecksumsRef::initializeChecksums( |
| const DebugSubsectionRecord &FCR) { |
| assert(FCR.kind() == DebugSubsectionKind::FileChecksums); |
| if (Checksums) |
| return; |
| |
| OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>(); |
| consumeError(OwnedChecksums->initialize(FCR.getRecordData())); |
| Checksums = OwnedChecksums.get(); |
| } |