xref: /llvm-project/clang/tools/clang-installapi/Options.h (revision feed66f3eae5006bb05e6cb34801930fd940daa8)
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