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