brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · bd1cd96 Raw
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