xref: /freebsd-src/contrib/llvm-project/lldb/include/lldb/Utility/SupportFile.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
17a6dacacSDimitry Andric //===-- SupportFile.h -------------------------------------------*- C++ -*-===//
27a6dacacSDimitry Andric //
37a6dacacSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47a6dacacSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
57a6dacacSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67a6dacacSDimitry Andric //
77a6dacacSDimitry Andric //===----------------------------------------------------------------------===//
87a6dacacSDimitry Andric 
97a6dacacSDimitry Andric #ifndef LLDB_UTILITY_SUPPORTFILE_H
107a6dacacSDimitry Andric #define LLDB_UTILITY_SUPPORTFILE_H
117a6dacacSDimitry Andric 
127a6dacacSDimitry Andric #include "lldb/Utility/Checksum.h"
137a6dacacSDimitry Andric #include "lldb/Utility/FileSpec.h"
147a6dacacSDimitry Andric 
157a6dacacSDimitry Andric namespace lldb_private {
167a6dacacSDimitry Andric 
177a6dacacSDimitry Andric /// Wraps either a FileSpec that represents a local file or a source
187a6dacacSDimitry Andric /// file whose contents is known (for example because it can be
197a6dacacSDimitry Andric /// reconstructed from debug info), but that hasn't been written to a
207a6dacacSDimitry Andric /// file yet. This also stores an optional checksum of the on-disk content.
217a6dacacSDimitry Andric class SupportFile {
227a6dacacSDimitry Andric public:
237a6dacacSDimitry Andric   SupportFile() : m_file_spec(), m_checksum() {}
247a6dacacSDimitry Andric   SupportFile(const FileSpec &spec) : m_file_spec(spec), m_checksum() {}
257a6dacacSDimitry Andric   SupportFile(const FileSpec &spec, const Checksum &checksum)
267a6dacacSDimitry Andric       : m_file_spec(spec), m_checksum(checksum) {}
277a6dacacSDimitry Andric 
287a6dacacSDimitry Andric   SupportFile(const SupportFile &other) = delete;
297a6dacacSDimitry Andric   SupportFile(SupportFile &&other) = default;
307a6dacacSDimitry Andric 
317a6dacacSDimitry Andric   virtual ~SupportFile() = default;
327a6dacacSDimitry Andric 
33*0fca6ea1SDimitry Andric   enum SupportFileEquality : uint8_t {
34*0fca6ea1SDimitry Andric     eEqualFileSpec = (1u << 1),
35*0fca6ea1SDimitry Andric     eEqualChecksum = (1u << 2),
36*0fca6ea1SDimitry Andric     eEqualChecksumIfSet = (1u << 3),
37*0fca6ea1SDimitry Andric     eEqualFileSpecAndChecksum = eEqualFileSpec | eEqualChecksum,
38*0fca6ea1SDimitry Andric     eEqualFileSpecAndChecksumIfSet = eEqualFileSpec | eEqualChecksumIfSet,
39*0fca6ea1SDimitry Andric   };
40*0fca6ea1SDimitry Andric 
41*0fca6ea1SDimitry Andric   bool Equal(const SupportFile &other,
42*0fca6ea1SDimitry Andric              SupportFileEquality equality = eEqualFileSpecAndChecksum) const {
43*0fca6ea1SDimitry Andric     assert(!(equality & eEqualChecksum & eEqualChecksumIfSet) &&
44*0fca6ea1SDimitry Andric            "eEqualChecksum and eEqualChecksumIfSet are mutually exclusive");
45*0fca6ea1SDimitry Andric 
46*0fca6ea1SDimitry Andric     if (equality & eEqualFileSpec) {
47*0fca6ea1SDimitry Andric       if (m_file_spec != other.m_file_spec)
48*0fca6ea1SDimitry Andric         return false;
497a6dacacSDimitry Andric     }
507a6dacacSDimitry Andric 
51*0fca6ea1SDimitry Andric     if (equality & eEqualChecksum) {
52*0fca6ea1SDimitry Andric       if (m_checksum != other.m_checksum)
53*0fca6ea1SDimitry Andric         return false;
54*0fca6ea1SDimitry Andric     }
55*0fca6ea1SDimitry Andric 
56*0fca6ea1SDimitry Andric     if (equality & eEqualChecksumIfSet) {
57*0fca6ea1SDimitry Andric       if (m_checksum && other.m_checksum)
58*0fca6ea1SDimitry Andric         if (m_checksum != other.m_checksum)
59*0fca6ea1SDimitry Andric           return false;
60*0fca6ea1SDimitry Andric     }
61*0fca6ea1SDimitry Andric 
62*0fca6ea1SDimitry Andric     return true;
63*0fca6ea1SDimitry Andric   }
647a6dacacSDimitry Andric 
657a6dacacSDimitry Andric   /// Return the file name only. Useful for resolving breakpoints by file name.
667a6dacacSDimitry Andric   const FileSpec &GetSpecOnly() const { return m_file_spec; };
677a6dacacSDimitry Andric 
687a6dacacSDimitry Andric   /// Return the checksum or all zeros if there is none.
697a6dacacSDimitry Andric   const Checksum &GetChecksum() const { return m_checksum; };
707a6dacacSDimitry Andric 
717a6dacacSDimitry Andric   /// Materialize the file to disk and return the path to that temporary file.
727a6dacacSDimitry Andric   virtual const FileSpec &Materialize() { return m_file_spec; }
737a6dacacSDimitry Andric 
747a6dacacSDimitry Andric protected:
757a6dacacSDimitry Andric   FileSpec m_file_spec;
767a6dacacSDimitry Andric   Checksum m_checksum;
777a6dacacSDimitry Andric };
787a6dacacSDimitry Andric 
797a6dacacSDimitry Andric } // namespace lldb_private
807a6dacacSDimitry Andric 
817a6dacacSDimitry Andric #endif // LLDB_UTILITY_SUPPORTFILE_H
82