1 //===--- clang-installapi/Options.h - Options -------------------*- 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 LLVM_CLANG_TOOLS_CLANG_INSTALLAPI_OPTIONS_H 10 #define LLVM_CLANG_TOOLS_CLANG_INSTALLAPI_OPTIONS_H 11 12 #include "clang/Basic/Diagnostic.h" 13 #include "clang/Basic/FileManager.h" 14 #include "clang/Driver/Driver.h" 15 #include "clang/Frontend/FrontendOptions.h" 16 #include "clang/InstallAPI/Context.h" 17 #include "clang/InstallAPI/DylibVerifier.h" 18 #include "clang/InstallAPI/MachO.h" 19 #include "llvm/Option/ArgList.h" 20 #include "llvm/Option/Option.h" 21 #include "llvm/Support/Program.h" 22 #include "llvm/TargetParser/Triple.h" 23 #include <string> 24 #include <vector> 25 26 namespace clang { 27 namespace installapi { 28 29 struct DriverOptions { 30 /// \brief Path to input file lists (JSON). 31 llvm::MachO::PathSeq FileLists; 32 33 /// \brief Path to input directory. 34 std::string InputDirectory; 35 36 /// \brief Path to public umbrella header. 37 std::string PublicUmbrellaHeader; 38 39 /// \brief Path to private umbrella header. 40 std::string PrivateUmbrellaHeader; 41 42 /// \brief Path to project umbrella header. 43 std::string ProjectUmbrellaHeader; 44 45 /// \brief Paths of extra public headers. 46 PathSeq ExtraPublicHeaders; 47 48 /// \brief Paths of extra private headers. 49 PathSeq ExtraPrivateHeaders; 50 51 /// \brief Paths of extra project headers. 52 PathSeq ExtraProjectHeaders; 53 54 /// \brief List of excluded public headers. 55 PathSeq ExcludePublicHeaders; 56 57 /// \brief List of excluded private headers. 58 PathSeq ExcludePrivateHeaders; 59 60 /// \brief List of excluded project headers. 61 PathSeq ExcludeProjectHeaders; 62 63 /// \brief Mappings of target triples & tapi targets to build for. 64 std::map<llvm::MachO::Target, llvm::Triple> Targets; 65 66 /// \brief Path to binary dylib for comparing. 67 std::string DylibToVerify; 68 69 /// \brief Output path. 70 std::string OutputPath; 71 72 /// \brief DSYM path. 73 std::string DSYMPath; 74 75 /// \brief File encoding to print. 76 FileType OutFT = FileType::TBD_V5; 77 78 /// \brief Verification mode for comparing symbols. 79 VerificationMode VerifyMode = VerificationMode::Pedantic; 80 81 /// \brief Whether the library is zippered. 82 bool Zippered = false; 83 84 /// \brief Print demangled symbols when reporting errors. 85 bool Demangle = false; 86 87 /// \brief Print verbose output. 88 bool Verbose = false; 89 90 /// \brief Log libraries loaded. 91 bool TraceLibraryLocation = false; 92 }; 93 94 struct LinkerOptions { 95 /// \brief List of allowable clients to use for the dynamic library. 96 LibAttrs AllowableClients; 97 98 /// \brief List of reexported libraries to use for the dynamic library. 99 LibAttrs ReexportedLibraries; 100 101 /// \brief List of reexported libraries to use for the dynamic library. 102 LibAttrs ReexportedLibraryPaths; 103 104 /// \brief List of reexported frameworks to use for the dynamic library. 105 LibAttrs ReexportedFrameworks; 106 107 /// \brief List of rpaths to use for the dynamic library. 108 LibAttrs RPaths; 109 110 /// \brief Additional library search paths. 111 PathSeq LibPaths; 112 113 /// \brief List of alias symbol files. 114 PathSeq AliasLists; 115 116 /// \brief The install name to use for the dynamic library. 117 std::string InstallName; 118 119 /// \brief The current version to use for the dynamic library. 120 PackedVersion CurrentVersion; 121 122 /// \brief The compatibility version to use for the dynamic library. 123 PackedVersion CompatVersion; 124 125 /// \brief Name of the umbrella library. 126 std::string ParentUmbrella; 127 128 /// \brief Is application extension safe. 129 bool AppExtensionSafe = false; 130 131 /// \brief Set if we should scan for a dynamic library and not a framework. 132 bool IsDylib = false; 133 134 /// \brief Is an OS library that is not shared cache eligible. 135 bool OSLibNotForSharedCache = false; 136 }; 137 138 struct FrontendOptions { 139 /// \brief Unique clang options to pass per key in map. 140 llvm::StringMap<std::vector<std::string>> UniqueArgs; 141 142 /// \brief The language mode to parse headers in. 143 Language LangMode = Language::ObjC; 144 145 /// \brief The sysroot to search for SDK headers or libraries. 146 std::string ISysroot; 147 148 /// \brief Additional framework search paths. 149 PathSeq FwkPaths; 150 151 /// \brief Additional SYSTEM framework search paths. 152 PathToPlatformSeq SystemFwkPaths; 153 }; 154 155 using arg_iterator = llvm::opt::arg_iterator<llvm::opt::Arg **>; 156 class Options { 157 private: 158 bool processDriverOptions(llvm::opt::InputArgList &Args); 159 bool processLinkerOptions(llvm::opt::InputArgList &Args); 160 bool processFrontendOptions(llvm::opt::InputArgList &Args); 161 std::vector<const char *> 162 processAndFilterOutInstallAPIOptions(ArrayRef<const char *> Args); 163 bool processInstallAPIXOptions(llvm::opt::InputArgList &Args); 164 bool processXarchOption(llvm::opt::InputArgList &Args, arg_iterator Curr); 165 bool processXplatformOption(llvm::opt::InputArgList &Args, arg_iterator Curr); 166 bool processXprojectOption(llvm::opt::InputArgList &Args, arg_iterator Curr); 167 bool processOptionList(llvm::opt::InputArgList &Args, 168 llvm::opt::OptTable *Table); 169 170 public: 171 /// The various options grouped together. 172 DriverOptions DriverOpts; 173 LinkerOptions LinkerOpts; 174 FrontendOptions FEOpts; 175 176 Options() = delete; 177 178 /// \brief Create InstallAPIContext from processed options. 179 InstallAPIContext createContext(); 180 181 /// \brief Constructor for options. 182 Options(clang::DiagnosticsEngine &Diag, FileManager *FM, 183 ArrayRef<const char *> Args, const StringRef ProgName); 184 185 /// \brief Get CC1 arguments after extracting out the irrelevant 186 /// ones. getClangFrontendArgs()187 std::vector<std::string> &getClangFrontendArgs() { return FrontendArgs; } 188 189 /// \brief Add relevant, but conditionalized by active target and header type, 190 /// arguments for constructing a CC1 invocation. 191 void addConditionalCC1Args(std::vector<std::string> &ArgStrings, 192 const llvm::Triple &Targ, const HeaderType Type); 193 194 private: 195 bool addFilePaths(llvm::opt::InputArgList &Args, PathSeq &Headers, 196 llvm::opt::OptSpecifier ID); 197 198 std::pair<LibAttrs, ReexportedInterfaces> getReexportedLibraries(); 199 200 DiagnosticsEngine *Diags; 201 FileManager *FM; 202 std::vector<std::string> FrontendArgs; 203 llvm::DenseMap<const llvm::opt::Arg *, Architecture> ArgToArchMap; 204 std::vector<std::string> ProjectLevelArgs; 205 }; 206 207 enum ID { 208 OPT_INVALID = 0, // This is not an option ID. 209 #define OPTION(PREFIX, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, \ 210 VISIBILITY, PARAM, HELPTEXT, HELPTEXTSFORVARIANTS, METAVAR, \ 211 VALUES) \ 212 OPT_##ID, 213 #include "InstallAPIOpts.inc" 214 LastOption 215 #undef OPTION 216 }; 217 218 } // namespace installapi 219 } // namespace clang 220 #endif 221