1 //===- tools/dsymutil/Reproducer.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 LLVM_TOOLS_DSYMUTIL_REPRODUCER_H 10 #define LLVM_TOOLS_DSYMUTIL_REPRODUCER_H 11 12 #include "llvm/Support/FileCollector.h" 13 #include "llvm/Support/VirtualFileSystem.h" 14 15 namespace llvm { 16 namespace dsymutil { 17 18 /// The reproducer mode. 19 enum class ReproducerMode { 20 GenerateOnExit, 21 GenerateOnCrash, 22 Use, 23 Off, 24 }; 25 26 /// The reproducer class manages the sate related to reproducers in dsymutil. 27 /// Instances should be created with Reproducer::createReproducer. An instance 28 /// of this class is returned when reproducers are off. The VFS returned by 29 /// this instance is the real file system. 30 class Reproducer { 31 public: 32 Reproducer(); 33 virtual ~Reproducer(); 34 35 IntrusiveRefCntPtr<vfs::FileSystem> getVFS() const { return VFS; } 36 37 virtual void generate(){}; 38 39 /// Create a Reproducer instance based on the given mode. 40 static llvm::Expected<std::unique_ptr<Reproducer>> 41 createReproducer(ReproducerMode Mode, StringRef Root, int Argc, char **Argv); 42 43 protected: 44 IntrusiveRefCntPtr<vfs::FileSystem> VFS; 45 }; 46 47 /// Reproducer instance used to generate a new reproducer. The VFS returned by 48 /// this instance is a FileCollectorFileSystem that tracks every file used by 49 /// dsymutil. 50 class ReproducerGenerate : public Reproducer { 51 public: 52 ReproducerGenerate(std::error_code &EC, int Argc, char **Argv, 53 bool GenerateOnExit); 54 ~ReproducerGenerate() override; 55 56 void generate() override; 57 58 private: 59 /// The path to the reproducer. 60 std::string Root; 61 62 /// The FileCollector used by the FileCollectorFileSystem. 63 std::shared_ptr<FileCollector> FC; 64 65 /// The input arguments to build the reproducer invocation. 66 llvm::SmallVector<llvm::StringRef, 0> Args; 67 68 /// Whether to generate the reproducer on destruction. 69 bool GenerateOnExit = false; 70 71 /// Whether we already generated the reproducer. 72 bool Generated = false; 73 }; 74 75 /// Reproducer instance used to use an existing reproducer. The VFS returned by 76 /// this instance is a RedirectingFileSystem that remaps paths to their 77 /// counterpart in the reproducer. 78 class ReproducerUse : public Reproducer { 79 public: 80 ReproducerUse(StringRef Root, std::error_code &EC); 81 ~ReproducerUse() override; 82 83 private: 84 /// The path to the reproducer. 85 std::string Root; 86 }; 87 88 } // end namespace dsymutil 89 } // end namespace llvm 90 91 #endif // LLVM_TOOLS_DSYMUTIL_REPRODUCER_H 92