[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / tools / dsymutil / Reproducer.h
blobe965e1ceda249f9252c0086f38fc6e5bc597ba7a
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 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_TOOLS_DSYMUTIL_REPRODUCER_H
10 #define LLVM_TOOLS_DSYMUTIL_REPRODUCER_H
12 #include "llvm/Support/Error.h"
13 #include "llvm/Support/FileCollector.h"
14 #include "llvm/Support/VirtualFileSystem.h"
16 namespace llvm {
17 namespace dsymutil {
19 /// The reproducer mode.
20 enum class ReproducerMode {
21 Generate,
22 Use,
23 Off,
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();
35 IntrusiveRefCntPtr<vfs::FileSystem> getVFS() const { return VFS; }
37 /// Create a Reproducer instance based on the given mode.
38 static llvm::Expected<std::unique_ptr<Reproducer>>
39 createReproducer(ReproducerMode Mode, StringRef Root);
41 protected:
42 IntrusiveRefCntPtr<vfs::FileSystem> VFS;
45 /// Reproducer instance used to generate a new reproducer. The VFS returned by
46 /// this instance is a FileCollectorFileSystem that tracks every file used by
47 /// dsymutil.
48 class ReproducerGenerate : public Reproducer {
49 public:
50 ReproducerGenerate(std::error_code &EC);
51 ~ReproducerGenerate() override;
53 private:
54 /// The path to the reproducer.
55 std::string Root;
57 /// The FileCollector used by the FileCollectorFileSystem.
58 std::shared_ptr<FileCollector> FC;
61 /// Reproducer instance used to use an existing reproducer. The VFS returned by
62 /// this instance is a RedirectingFileSystem that remaps paths to their
63 /// counterpart in the reproducer.
64 class ReproducerUse : public Reproducer {
65 public:
66 ReproducerUse(StringRef Root, std::error_code &EC);
67 ~ReproducerUse() override;
69 private:
70 /// The path to the reproducer.
71 std::string Root;
74 } // end namespace dsymutil
75 } // end namespace llvm
77 #endif // LLVM_TOOLS_DSYMUTIL_REPRODUCER_H