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