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