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