192fd3971SJonas Devlieghere //===- tools/dsymutil/Reproducer.h ------------------------------*- C++ -*-===// 292fd3971SJonas Devlieghere // 392fd3971SJonas Devlieghere // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 492fd3971SJonas Devlieghere // See https://llvm.org/LICENSE.txt for license information. 592fd3971SJonas Devlieghere // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 692fd3971SJonas Devlieghere // 792fd3971SJonas Devlieghere //===----------------------------------------------------------------------===// 892fd3971SJonas Devlieghere 992fd3971SJonas Devlieghere #ifndef LLVM_TOOLS_DSYMUTIL_REPRODUCER_H 1092fd3971SJonas Devlieghere #define LLVM_TOOLS_DSYMUTIL_REPRODUCER_H 1192fd3971SJonas Devlieghere 1292fd3971SJonas Devlieghere #include "llvm/Support/FileCollector.h" 1392fd3971SJonas Devlieghere #include "llvm/Support/VirtualFileSystem.h" 1492fd3971SJonas Devlieghere 1592fd3971SJonas Devlieghere namespace llvm { 1692fd3971SJonas Devlieghere namespace dsymutil { 1792fd3971SJonas Devlieghere 1892fd3971SJonas Devlieghere /// The reproducer mode. 1992fd3971SJonas Devlieghere enum class ReproducerMode { 2033b6891dSJonas Devlieghere GenerateOnExit, 2133b6891dSJonas Devlieghere GenerateOnCrash, 2292fd3971SJonas Devlieghere Use, 2392fd3971SJonas Devlieghere Off, 2492fd3971SJonas Devlieghere }; 2592fd3971SJonas Devlieghere 2692fd3971SJonas Devlieghere /// The reproducer class manages the sate related to reproducers in dsymutil. 2792fd3971SJonas Devlieghere /// Instances should be created with Reproducer::createReproducer. An instance 2892fd3971SJonas Devlieghere /// of this class is returned when reproducers are off. The VFS returned by 2992fd3971SJonas Devlieghere /// this instance is the real file system. 3092fd3971SJonas Devlieghere class Reproducer { 3192fd3971SJonas Devlieghere public: 3292fd3971SJonas Devlieghere Reproducer(); 3392fd3971SJonas Devlieghere virtual ~Reproducer(); 3492fd3971SJonas Devlieghere getVFS()3592fd3971SJonas Devlieghere IntrusiveRefCntPtr<vfs::FileSystem> getVFS() const { return VFS; } 3692fd3971SJonas Devlieghere generate()3733b6891dSJonas Devlieghere virtual void generate(){}; 3833b6891dSJonas Devlieghere 3992fd3971SJonas Devlieghere /// Create a Reproducer instance based on the given mode. 4092fd3971SJonas Devlieghere static llvm::Expected<std::unique_ptr<Reproducer>> 4133b6891dSJonas Devlieghere createReproducer(ReproducerMode Mode, StringRef Root, int Argc, char **Argv); 4292fd3971SJonas Devlieghere 4392fd3971SJonas Devlieghere protected: 4492fd3971SJonas Devlieghere IntrusiveRefCntPtr<vfs::FileSystem> VFS; 4592fd3971SJonas Devlieghere }; 4692fd3971SJonas Devlieghere 4792fd3971SJonas Devlieghere /// Reproducer instance used to generate a new reproducer. The VFS returned by 4892fd3971SJonas Devlieghere /// this instance is a FileCollectorFileSystem that tracks every file used by 4992fd3971SJonas Devlieghere /// dsymutil. 5092fd3971SJonas Devlieghere class ReproducerGenerate : public Reproducer { 5192fd3971SJonas Devlieghere public: 5233b6891dSJonas Devlieghere ReproducerGenerate(std::error_code &EC, int Argc, char **Argv, 5333b6891dSJonas Devlieghere bool GenerateOnExit); 5492fd3971SJonas Devlieghere ~ReproducerGenerate() override; 5592fd3971SJonas Devlieghere 56*b5188591SKazu Hirata void generate() override; 5733b6891dSJonas Devlieghere 5892fd3971SJonas Devlieghere private: 5992fd3971SJonas Devlieghere /// The path to the reproducer. 6092fd3971SJonas Devlieghere std::string Root; 6192fd3971SJonas Devlieghere 6292fd3971SJonas Devlieghere /// The FileCollector used by the FileCollectorFileSystem. 6392fd3971SJonas Devlieghere std::shared_ptr<FileCollector> FC; 6433b6891dSJonas Devlieghere 6533b6891dSJonas Devlieghere /// The input arguments to build the reproducer invocation. 6633b6891dSJonas Devlieghere llvm::SmallVector<llvm::StringRef, 0> Args; 6733b6891dSJonas Devlieghere 6833b6891dSJonas Devlieghere /// Whether to generate the reproducer on destruction. 6933b6891dSJonas Devlieghere bool GenerateOnExit = false; 7033b6891dSJonas Devlieghere 7133b6891dSJonas Devlieghere /// Whether we already generated the reproducer. 7233b6891dSJonas Devlieghere bool Generated = false; 7392fd3971SJonas Devlieghere }; 7492fd3971SJonas Devlieghere 7592fd3971SJonas Devlieghere /// Reproducer instance used to use an existing reproducer. The VFS returned by 7692fd3971SJonas Devlieghere /// this instance is a RedirectingFileSystem that remaps paths to their 7792fd3971SJonas Devlieghere /// counterpart in the reproducer. 7892fd3971SJonas Devlieghere class ReproducerUse : public Reproducer { 7992fd3971SJonas Devlieghere public: 8092fd3971SJonas Devlieghere ReproducerUse(StringRef Root, std::error_code &EC); 8192fd3971SJonas Devlieghere ~ReproducerUse() override; 8292fd3971SJonas Devlieghere 8392fd3971SJonas Devlieghere private: 8492fd3971SJonas Devlieghere /// The path to the reproducer. 8592fd3971SJonas Devlieghere std::string Root; 8692fd3971SJonas Devlieghere }; 8792fd3971SJonas Devlieghere 8892fd3971SJonas Devlieghere } // end namespace dsymutil 8992fd3971SJonas Devlieghere } // end namespace llvm 9092fd3971SJonas Devlieghere 9192fd3971SJonas Devlieghere #endif // LLVM_TOOLS_DSYMUTIL_REPRODUCER_H 92