xref: /freebsd/contrib/llvm-project/lldb/include/lldb/Utility/SupportFile.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 //===-- SupportFile.h -------------------------------------------*- C++ -*-===//
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 #ifndef LLDB_UTILITY_SUPPORTFILE_H
10 #define LLDB_UTILITY_SUPPORTFILE_H
11 
12 #include "lldb/Utility/Checksum.h"
13 #include "lldb/Utility/FileSpec.h"
14 
15 namespace lldb_private {
16 
17 /// Wraps either a FileSpec that represents a local file or a source
18 /// file whose contents is known (for example because it can be
19 /// reconstructed from debug info), but that hasn't been written to a
20 /// file yet. This also stores an optional checksum of the on-disk content.
21 class SupportFile {
22 public:
SupportFile()23   SupportFile() : m_file_spec(), m_checksum() {}
SupportFile(const FileSpec & spec)24   SupportFile(const FileSpec &spec) : m_file_spec(spec), m_checksum() {}
SupportFile(const FileSpec & spec,const Checksum & checksum)25   SupportFile(const FileSpec &spec, const Checksum &checksum)
26       : m_file_spec(spec), m_checksum(checksum) {}
27 
28   SupportFile(const SupportFile &other) = delete;
29   SupportFile(SupportFile &&other) = default;
30 
31   virtual ~SupportFile() = default;
32 
33   enum SupportFileEquality : uint8_t {
34     eEqualFileSpec = (1u << 1),
35     eEqualChecksum = (1u << 2),
36     eEqualChecksumIfSet = (1u << 3),
37     eEqualFileSpecAndChecksum = eEqualFileSpec | eEqualChecksum,
38     eEqualFileSpecAndChecksumIfSet = eEqualFileSpec | eEqualChecksumIfSet,
39   };
40 
41   bool Equal(const SupportFile &other,
42              SupportFileEquality equality = eEqualFileSpecAndChecksum) const {
43     assert(!(equality & eEqualChecksum & eEqualChecksumIfSet) &&
44            "eEqualChecksum and eEqualChecksumIfSet are mutually exclusive");
45 
46     if (equality & eEqualFileSpec) {
47       if (m_file_spec != other.m_file_spec)
48         return false;
49     }
50 
51     if (equality & eEqualChecksum) {
52       if (m_checksum != other.m_checksum)
53         return false;
54     }
55 
56     if (equality & eEqualChecksumIfSet) {
57       if (m_checksum && other.m_checksum)
58         if (m_checksum != other.m_checksum)
59           return false;
60     }
61 
62     return true;
63   }
64 
65   /// Return the file name only. Useful for resolving breakpoints by file name.
GetSpecOnly()66   const FileSpec &GetSpecOnly() const { return m_file_spec; };
67 
68   /// Return the checksum or all zeros if there is none.
GetChecksum()69   const Checksum &GetChecksum() const { return m_checksum; };
70 
71   /// Materialize the file to disk and return the path to that temporary file.
Materialize()72   virtual const FileSpec &Materialize() { return m_file_spec; }
73 
74 protected:
75   FileSpec m_file_spec;
76   Checksum m_checksum;
77 };
78 
79 } // namespace lldb_private
80 
81 #endif // LLDB_UTILITY_SUPPORTFILE_H
82