xref: /llvm-project/llvm/tools/dsymutil/Reproducer.h (revision b5188591a06b5814860622ec04d199d83deb40f8)
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