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