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 23namespace lld::macho { 24 25class DylibFile; 26class InputFile; 27 28class MachOOptTable : public llvm::opt::GenericOptTable { 29public: 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 36enum { 37 OPT_INVALID = 0, 38#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__), 39#include "Options.inc" 40#undef OPTION 41}; 42 43void parseLCLinkerOption(llvm::SmallVectorImpl<StringRef> &LCLinkerOptions, 44 InputFile *f, unsigned argc, StringRef data); 45void resolveLCLinkerOptions(); 46 47std::string createResponseFile(const llvm::opt::InputArgList &args); 48 49// Check for both libfoo.dylib and libfoo.tbd (in that order). 50std::optional<StringRef> resolveDylibPath(llvm::StringRef path); 51 52DylibFile *loadDylib(llvm::MemoryBufferRef mbref, DylibFile *umbrella = nullptr, 53 bool isBundleLoader = false, 54 bool explicitlyLinked = false); 55void 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}`. 59std::optional<llvm::StringRef> 60findPathCombination(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. 66llvm::StringRef rerootPath(llvm::StringRef path); 67 68uint32_t getModTime(llvm::StringRef path); 69 70void printArchiveMemberLoad(StringRef reason, const InputFile *); 71 72// Map simulator platforms to their underlying device platform. 73llvm::MachO::PlatformType removeSimulator(llvm::MachO::PlatformType platform); 74 75// Helper class to export dependency info. 76class DependencyTracker { 77public: 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 92private: 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 113extern std::unique_ptr<DependencyTracker> depTracker; 114 115} // namespace lld::macho 116 117#endif 118