123 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLD_MACHO_DRIVER_H10#define LLD_MACHO_DRIVER_H11 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 {24class CommonLinkerContext;25}26namespace lld::macho {27 28class DylibFile;29class InputFile;30 31class MachOOptTable : public llvm::opt::GenericOptTable {32public: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.td41enum {42 OPT_INVALID = 0,43#define OPTION(...) LLVM_MAKE_OPT_ID(__VA_ARGS__),44#include "Options.inc"45#undef OPTION46};47 48void parseLCLinkerOption(llvm::SmallVectorImpl<StringRef> &LCLinkerOptions,49 InputFile *f, unsigned argc, StringRef data);50void resolveLCLinkerOptions();51 52std::string createResponseFile(const llvm::opt::InputArgList &args);53 54// Check for both libfoo.dylib and libfoo.tbd (in that order).55std::optional<StringRef> resolveDylibPath(llvm::StringRef path);56 57DylibFile *loadDylib(llvm::MemoryBufferRef mbref, DylibFile *umbrella = nullptr,58 bool isBundleLoader = false,59 bool explicitlyLinked = false);60void 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}`.64std::optional<llvm::StringRef>65findPathCombination(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 be70// rerooted.71llvm::StringRef rerootPath(llvm::StringRef path);72 73uint32_t getModTime(llvm::StringRef path);74 75void printArchiveMemberLoad(StringRef reason, const InputFile *);76 77// Map simulator platforms to their underlying device platform.78llvm::MachO::PlatformType removeSimulator(llvm::MachO::PlatformType platform);79 80// Helper class to export dependency info.81class DependencyTracker {82public: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(path.str());89 }90 91 // Writes the dependencies to specified path. The content is first sorted by92 // 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 97private: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 temporarily114 // constructed.115 std::set<std::string> notFounds;116};117 118extern std::unique_ptr<DependencyTracker> depTracker;119 120} // namespace lld::macho121 122#endif123