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 
StringsAndChecksumsRef(const DebugStringTableSubsectionRef & Strings)23 StringsAndChecksumsRef::StringsAndChecksumsRef(
24     const DebugStringTableSubsectionRef &Strings)
25     : Strings(&Strings) {}
26 
StringsAndChecksumsRef(const DebugStringTableSubsectionRef & Strings,const DebugChecksumsSubsectionRef & Checksums)27 StringsAndChecksumsRef::StringsAndChecksumsRef(
28     const DebugStringTableSubsectionRef &Strings,
29     const DebugChecksumsSubsectionRef &Checksums)
30     : Strings(&Strings), Checksums(&Checksums) {}
31 
initializeStrings(const DebugSubsectionRecord & SR)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 
reset()42 void StringsAndChecksumsRef::reset() {
43   resetStrings();
44   resetChecksums();
45 }
46 
resetStrings()47 void StringsAndChecksumsRef::resetStrings() {
48   OwnedStrings.reset();
49   Strings = nullptr;
50 }
51 
resetChecksums()52 void StringsAndChecksumsRef::resetChecksums() {
53   OwnedChecksums.reset();
54   Checksums = nullptr;
55 }
56 
setStrings(const DebugStringTableSubsectionRef & StringsRef)57 void StringsAndChecksumsRef::setStrings(
58     const DebugStringTableSubsectionRef &StringsRef) {
59   OwnedStrings = std::make_shared<DebugStringTableSubsectionRef>();
60   *OwnedStrings = StringsRef;
61   Strings = OwnedStrings.get();
62 }
63 
setChecksums(const DebugChecksumsSubsectionRef & CS)64 void StringsAndChecksumsRef::setChecksums(
65     const DebugChecksumsSubsectionRef &CS) {
66   OwnedChecksums = std::make_shared<DebugChecksumsSubsectionRef>();
67   *OwnedChecksums = CS;
68   Checksums = OwnedChecksums.get();
69 }
70 
initializeChecksums(const DebugSubsectionRecord & FCR)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