92 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_TOOLS_DSYMUTIL_REPRODUCER_H10#define LLVM_TOOLS_DSYMUTIL_REPRODUCER_H11 12#include "llvm/Support/FileCollector.h"13#include "llvm/Support/VirtualFileSystem.h"14 15namespace llvm {16namespace dsymutil {17 18/// The reproducer mode.19enum 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 instance28/// of this class is returned when reproducers are off. The VFS returned by29/// this instance is the real file system.30class Reproducer {31public: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 43protected:44 IntrusiveRefCntPtr<vfs::FileSystem> VFS;45};46 47/// Reproducer instance used to generate a new reproducer. The VFS returned by48/// this instance is a FileCollectorFileSystem that tracks every file used by49/// dsymutil.50class ReproducerGenerate : public Reproducer {51public:52 ReproducerGenerate(std::error_code &EC, int Argc, char **Argv,53 bool GenerateOnExit);54 ~ReproducerGenerate() override;55 56 void generate() override;57 58private: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 by76/// this instance is a RedirectingFileSystem that remaps paths to their77/// counterpart in the reproducer.78class ReproducerUse : public Reproducer {79public:80 ReproducerUse(StringRef Root, std::error_code &EC);81 ~ReproducerUse() override;82 83private:84 /// The path to the reproducer.85 std::string Root;86};87 88} // end namespace dsymutil89} // end namespace llvm90 91#endif // LLVM_TOOLS_DSYMUTIL_REPRODUCER_H92