1 | //===- Driver.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 LLD_MACHO_DRIVER_H |
10 | #define LLD_MACHO_DRIVER_H |
11 | |
12 | #include "lld/Common/LLVM.h" |
13 | #include "llvm/ADT/SetVector.h" |
14 | #include "llvm/ADT/StringRef.h" |
15 | #include "llvm/BinaryFormat/MachO.h" |
16 | #include "llvm/Option/OptTable.h" |
17 | #include "llvm/Support/MemoryBuffer.h" |
18 | #include <optional> |
19 | |
20 | #include <set> |
21 | #include <type_traits> |
22 | |
23 | namespace lld::macho { |
24 | |
25 | class DylibFile; |
26 | class InputFile; |
27 | |
28 | class MachOOptTable : public llvm::opt::GenericOptTable { |
29 | public: |
30 | MachOOptTable(); |
31 | llvm::opt::InputArgList parse(ArrayRef<const char *> argv); |
32 | void printHelp(const char *argv0, bool showHidden) const; |
33 | }; |
34 | |
35 | // Create enum with OPT_xxx values for each option in Options.td |
36 | enum { |
37 | OPT_INVALID = 0, |
38 | #define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), |
39 | #include "Options.inc" |
40 | #undef OPTION |
41 | }; |
42 | |
43 | void parseLCLinkerOption(llvm::SmallVectorImpl<StringRef> &LCLinkerOptions, |
44 | InputFile *f, unsigned argc, StringRef data); |
45 | void resolveLCLinkerOptions(); |
46 | |
47 | std::string createResponseFile(const llvm::opt::InputArgList &args); |
48 | |
49 | // Check for both libfoo.dylib and libfoo.tbd (in that order). |
50 | std::optional<StringRef> resolveDylibPath(llvm::StringRef path); |
51 | |
52 | DylibFile *loadDylib(llvm::MemoryBufferRef mbref, DylibFile *umbrella = nullptr, |
53 | bool isBundleLoader = false, |
54 | bool explicitlyLinked = false); |
55 | void resetLoadedDylibs(); |
56 | |
57 | // Search for all possible combinations of `{root}/{name}.{extension}`. |
58 | // If \p extensions are not specified, then just search for `{root}/{name}`. |
59 | std::optional<llvm::StringRef> |
60 | findPathCombination(const llvm::Twine &name, |
61 | const std::vector<llvm::StringRef> &roots, |
62 | ArrayRef<llvm::StringRef> extensions = {"" }); |
63 | |
64 | // If -syslibroot is specified, absolute paths to non-object files may be |
65 | // rerooted. |
66 | llvm::StringRef rerootPath(llvm::StringRef path); |
67 | |
68 | uint32_t getModTime(llvm::StringRef path); |
69 | |
70 | void printArchiveMemberLoad(StringRef reason, const InputFile *); |
71 | |
72 | // Map simulator platforms to their underlying device platform. |
73 | llvm::MachO::PlatformType removeSimulator(llvm::MachO::PlatformType platform); |
74 | |
75 | // Helper class to export dependency info. |
76 | class DependencyTracker { |
77 | public: |
78 | explicit DependencyTracker(llvm::StringRef path); |
79 | |
80 | // Adds the given path to the set of not-found files. |
81 | inline void logFileNotFound(const Twine &path) { |
82 | if (active) |
83 | notFounds.insert(path.str()); |
84 | } |
85 | |
86 | // Writes the dependencies to specified path. The content is first sorted by |
87 | // OpCode and then by the filename (in alphabetical order). |
88 | void write(llvm::StringRef version, |
89 | const llvm::SetVector<InputFile *> &inputs, |
90 | llvm::StringRef output); |
91 | |
92 | private: |
93 | enum DepOpCode : uint8_t { |
94 | // Denotes the linker version. |
95 | Version = 0x00, |
96 | // Denotes the input files. |
97 | Input = 0x10, |
98 | // Denotes the files that do not exist(?) |
99 | NotFound = 0x11, |
100 | // Denotes the output files. |
101 | Output = 0x40, |
102 | }; |
103 | |
104 | const llvm::StringRef path; |
105 | bool active; |
106 | |
107 | // The paths need to be alphabetically ordered. |
108 | // We need to own the paths because some of them are temporarily |
109 | // constructed. |
110 | std::set<std::string> notFounds; |
111 | }; |
112 | |
113 | extern std::unique_ptr<DependencyTracker> depTracker; |
114 | |
115 | } // namespace lld::macho |
116 | |
117 | #endif |
118 | |