15ffd83dbSDimitry Andric //===- Driver.h -------------------------------------------------*- C++ -*-===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLD_MACHO_DRIVER_H 105ffd83dbSDimitry Andric #define LLD_MACHO_DRIVER_H 115ffd83dbSDimitry Andric 125ffd83dbSDimitry Andric #include "lld/Common/LLVM.h" 13fe6060f1SDimitry Andric #include "llvm/ADT/SetVector.h" 14e8d8bef9SDimitry Andric #include "llvm/ADT/StringRef.h" 1504eeddc0SDimitry Andric #include "llvm/BinaryFormat/MachO.h" 165ffd83dbSDimitry Andric #include "llvm/Option/OptTable.h" 17e8d8bef9SDimitry Andric #include "llvm/Support/MemoryBuffer.h" 18bdd1243dSDimitry Andric #include <optional> 195ffd83dbSDimitry Andric 20fe6060f1SDimitry Andric #include <set> 21fe6060f1SDimitry Andric #include <type_traits> 22fe6060f1SDimitry Andric 23bdd1243dSDimitry Andric namespace lld::macho { 245ffd83dbSDimitry Andric 25e8d8bef9SDimitry Andric class DylibFile; 26e8d8bef9SDimitry Andric class InputFile; 27e8d8bef9SDimitry Andric 28bdd1243dSDimitry Andric class MachOOptTable : public llvm::opt::GenericOptTable { 295ffd83dbSDimitry Andric public: 305ffd83dbSDimitry Andric MachOOptTable(); 315ffd83dbSDimitry Andric llvm::opt::InputArgList parse(ArrayRef<const char *> argv); 325ffd83dbSDimitry Andric void printHelp(const char *argv0, bool showHidden) const; 335ffd83dbSDimitry Andric }; 345ffd83dbSDimitry Andric 355ffd83dbSDimitry Andric // Create enum with OPT_xxx values for each option in Options.td 365ffd83dbSDimitry Andric enum { 375ffd83dbSDimitry Andric OPT_INVALID = 0, 38*5f757f3fSDimitry Andric #define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), 395ffd83dbSDimitry Andric #include "Options.inc" 405ffd83dbSDimitry Andric #undef OPTION 415ffd83dbSDimitry Andric }; 425ffd83dbSDimitry Andric 43*5f757f3fSDimitry Andric void parseLCLinkerOption(llvm::SmallVectorImpl<StringRef> &LCLinkerOptions, 44*5f757f3fSDimitry Andric InputFile *f, unsigned argc, StringRef data); 45*5f757f3fSDimitry Andric void resolveLCLinkerOptions(); 46e8d8bef9SDimitry Andric 47e8d8bef9SDimitry Andric std::string createResponseFile(const llvm::opt::InputArgList &args); 48e8d8bef9SDimitry Andric 49e8d8bef9SDimitry Andric // Check for both libfoo.dylib and libfoo.tbd (in that order). 50bdd1243dSDimitry Andric std::optional<StringRef> resolveDylibPath(llvm::StringRef path); 51e8d8bef9SDimitry Andric 52fe6060f1SDimitry Andric DylibFile *loadDylib(llvm::MemoryBufferRef mbref, DylibFile *umbrella = nullptr, 5381ad6265SDimitry Andric bool isBundleLoader = false, 5481ad6265SDimitry Andric bool explicitlyLinked = false); 55349cc55cSDimitry Andric void resetLoadedDylibs(); 56fe6060f1SDimitry Andric 57fe6060f1SDimitry Andric // Search for all possible combinations of `{root}/{name}.{extension}`. 58fe6060f1SDimitry Andric // If \p extensions are not specified, then just search for `{root}/{name}`. 59bdd1243dSDimitry Andric std::optional<llvm::StringRef> 60fe6060f1SDimitry Andric findPathCombination(const llvm::Twine &name, 61fe6060f1SDimitry Andric const std::vector<llvm::StringRef> &roots, 62fe6060f1SDimitry Andric ArrayRef<llvm::StringRef> extensions = {""}); 63fe6060f1SDimitry Andric 64fe6060f1SDimitry Andric // If -syslibroot is specified, absolute paths to non-object files may be 65fe6060f1SDimitry Andric // rerooted. 66fe6060f1SDimitry Andric llvm::StringRef rerootPath(llvm::StringRef path); 67fe6060f1SDimitry Andric 68e8d8bef9SDimitry Andric uint32_t getModTime(llvm::StringRef path); 69e8d8bef9SDimitry Andric 70e8d8bef9SDimitry Andric void printArchiveMemberLoad(StringRef reason, const InputFile *); 71e8d8bef9SDimitry Andric 72fe6060f1SDimitry Andric // Map simulator platforms to their underlying device platform. 7304eeddc0SDimitry Andric llvm::MachO::PlatformType removeSimulator(llvm::MachO::PlatformType platform); 74fe6060f1SDimitry Andric 75fe6060f1SDimitry Andric // Helper class to export dependency info. 76fe6060f1SDimitry Andric class DependencyTracker { 77fe6060f1SDimitry Andric public: 78fe6060f1SDimitry Andric explicit DependencyTracker(llvm::StringRef path); 79fe6060f1SDimitry Andric 80fe6060f1SDimitry Andric // Adds the given path to the set of not-found files. logFileNotFound(const Twine & path)81fe6060f1SDimitry Andric inline void logFileNotFound(const Twine &path) { 82fe6060f1SDimitry Andric if (active) 83fe6060f1SDimitry Andric notFounds.insert(path.str()); 84fe6060f1SDimitry Andric } 85fe6060f1SDimitry Andric 861fd87a68SDimitry Andric // Writes the dependencies to specified path. The content is first sorted by 871fd87a68SDimitry Andric // OpCode and then by the filename (in alphabetical order). 88fe6060f1SDimitry Andric void write(llvm::StringRef version, 89fe6060f1SDimitry Andric const llvm::SetVector<InputFile *> &inputs, 90fe6060f1SDimitry Andric llvm::StringRef output); 91fe6060f1SDimitry Andric 92fe6060f1SDimitry Andric private: 93fe6060f1SDimitry Andric enum DepOpCode : uint8_t { 94fe6060f1SDimitry Andric // Denotes the linker version. 95fe6060f1SDimitry Andric Version = 0x00, 96fe6060f1SDimitry Andric // Denotes the input files. 97fe6060f1SDimitry Andric Input = 0x10, 98fe6060f1SDimitry Andric // Denotes the files that do not exist(?) 99fe6060f1SDimitry Andric NotFound = 0x11, 100fe6060f1SDimitry Andric // Denotes the output files. 101fe6060f1SDimitry Andric Output = 0x40, 102fe6060f1SDimitry Andric }; 103fe6060f1SDimitry Andric 104fe6060f1SDimitry Andric const llvm::StringRef path; 105fe6060f1SDimitry Andric bool active; 106fe6060f1SDimitry Andric 107fe6060f1SDimitry Andric // The paths need to be alphabetically ordered. 108fe6060f1SDimitry Andric // We need to own the paths because some of them are temporarily 109fe6060f1SDimitry Andric // constructed. 110fe6060f1SDimitry Andric std::set<std::string> notFounds; 111fe6060f1SDimitry Andric }; 112fe6060f1SDimitry Andric 11304eeddc0SDimitry Andric extern std::unique_ptr<DependencyTracker> depTracker; 114fe6060f1SDimitry Andric 115bdd1243dSDimitry Andric } // namespace lld::macho 1165ffd83dbSDimitry Andric 1175ffd83dbSDimitry Andric #endif 118