Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===--- Driver.h - Clang GCC Compatible Driver -----------------*- 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_DRIVER_DRIVER_H |
||
10 | #define LLVM_CLANG_DRIVER_DRIVER_H |
||
11 | |||
12 | #include "clang/Basic/Diagnostic.h" |
||
13 | #include "clang/Basic/HeaderInclude.h" |
||
14 | #include "clang/Basic/LLVM.h" |
||
15 | #include "clang/Driver/Action.h" |
||
16 | #include "clang/Driver/DriverDiagnostic.h" |
||
17 | #include "clang/Driver/InputInfo.h" |
||
18 | #include "clang/Driver/Options.h" |
||
19 | #include "clang/Driver/Phases.h" |
||
20 | #include "clang/Driver/ToolChain.h" |
||
21 | #include "clang/Driver/Types.h" |
||
22 | #include "clang/Driver/Util.h" |
||
23 | #include "llvm/ADT/ArrayRef.h" |
||
24 | #include "llvm/ADT/StringMap.h" |
||
25 | #include "llvm/ADT/StringRef.h" |
||
26 | #include "llvm/Option/Arg.h" |
||
27 | #include "llvm/Option/ArgList.h" |
||
28 | #include "llvm/Support/StringSaver.h" |
||
29 | |||
30 | #include <list> |
||
31 | #include <map> |
||
32 | #include <string> |
||
33 | #include <vector> |
||
34 | |||
35 | namespace llvm { |
||
36 | class Triple; |
||
37 | namespace vfs { |
||
38 | class FileSystem; |
||
39 | } |
||
40 | namespace cl { |
||
41 | class ExpansionContext; |
||
42 | } |
||
43 | } // namespace llvm |
||
44 | |||
45 | namespace clang { |
||
46 | |||
47 | namespace driver { |
||
48 | |||
49 | typedef SmallVector<InputInfo, 4> InputInfoList; |
||
50 | |||
51 | class Command; |
||
52 | class Compilation; |
||
53 | class JobAction; |
||
54 | class ToolChain; |
||
55 | |||
56 | /// Describes the kind of LTO mode selected via -f(no-)?lto(=.*)? options. |
||
57 | enum LTOKind { |
||
58 | LTOK_None, |
||
59 | LTOK_Full, |
||
60 | LTOK_Thin, |
||
61 | LTOK_Unknown |
||
62 | }; |
||
63 | |||
64 | /// Whether headers used to construct C++20 module units should be looked |
||
65 | /// up by the path supplied on the command line, or in the user or system |
||
66 | /// search paths. |
||
67 | enum ModuleHeaderMode { |
||
68 | HeaderMode_None, |
||
69 | HeaderMode_Default, |
||
70 | HeaderMode_User, |
||
71 | HeaderMode_System |
||
72 | }; |
||
73 | |||
74 | /// Driver - Encapsulate logic for constructing compilation processes |
||
75 | /// from a set of gcc-driver-like command line arguments. |
||
76 | class Driver { |
||
77 | DiagnosticsEngine &Diags; |
||
78 | |||
79 | IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS; |
||
80 | |||
81 | enum DriverMode { |
||
82 | GCCMode, |
||
83 | GXXMode, |
||
84 | CPPMode, |
||
85 | CLMode, |
||
86 | FlangMode, |
||
87 | DXCMode |
||
88 | } Mode; |
||
89 | |||
90 | enum SaveTempsMode { |
||
91 | SaveTempsNone, |
||
92 | SaveTempsCwd, |
||
93 | SaveTempsObj |
||
94 | } SaveTemps; |
||
95 | |||
96 | enum BitcodeEmbedMode { |
||
97 | EmbedNone, |
||
98 | EmbedMarker, |
||
99 | EmbedBitcode |
||
100 | } BitcodeEmbed; |
||
101 | |||
102 | enum OffloadMode { |
||
103 | OffloadHostDevice, |
||
104 | OffloadHost, |
||
105 | OffloadDevice, |
||
106 | } Offload; |
||
107 | |||
108 | /// Header unit mode set by -fmodule-header={user,system}. |
||
109 | ModuleHeaderMode CXX20HeaderType; |
||
110 | |||
111 | /// Set if we should process inputs and jobs with C++20 module |
||
112 | /// interpretation. |
||
113 | bool ModulesModeCXX20; |
||
114 | |||
115 | /// LTO mode selected via -f(no-)?lto(=.*)? options. |
||
116 | LTOKind LTOMode; |
||
117 | |||
118 | /// LTO mode selected via -f(no-offload-)?lto(=.*)? options. |
||
119 | LTOKind OffloadLTOMode; |
||
120 | |||
121 | public: |
||
122 | enum OpenMPRuntimeKind { |
||
123 | /// An unknown OpenMP runtime. We can't generate effective OpenMP code |
||
124 | /// without knowing what runtime to target. |
||
125 | OMPRT_Unknown, |
||
126 | |||
127 | /// The LLVM OpenMP runtime. When completed and integrated, this will become |
||
128 | /// the default for Clang. |
||
129 | OMPRT_OMP, |
||
130 | |||
131 | /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for |
||
132 | /// this runtime but can swallow the pragmas, and find and link against the |
||
133 | /// runtime library itself. |
||
134 | OMPRT_GOMP, |
||
135 | |||
136 | /// The legacy name for the LLVM OpenMP runtime from when it was the Intel |
||
137 | /// OpenMP runtime. We support this mode for users with existing |
||
138 | /// dependencies on this runtime library name. |
||
139 | OMPRT_IOMP5 |
||
140 | }; |
||
141 | |||
142 | // Diag - Forwarding function for diagnostics. |
||
143 | DiagnosticBuilder Diag(unsigned DiagID) const { |
||
144 | return Diags.Report(DiagID); |
||
145 | } |
||
146 | |||
147 | // FIXME: Privatize once interface is stable. |
||
148 | public: |
||
149 | /// The name the driver was invoked as. |
||
150 | std::string Name; |
||
151 | |||
152 | /// The path the driver executable was in, as invoked from the |
||
153 | /// command line. |
||
154 | std::string Dir; |
||
155 | |||
156 | /// The original path to the clang executable. |
||
157 | std::string ClangExecutable; |
||
158 | |||
159 | /// Target and driver mode components extracted from clang executable name. |
||
160 | ParsedClangName ClangNameParts; |
||
161 | |||
162 | /// The path to the installed clang directory, if any. |
||
163 | std::string InstalledDir; |
||
164 | |||
165 | /// The path to the compiler resource directory. |
||
166 | std::string ResourceDir; |
||
167 | |||
168 | /// System directory for config files. |
||
169 | std::string SystemConfigDir; |
||
170 | |||
171 | /// User directory for config files. |
||
172 | std::string UserConfigDir; |
||
173 | |||
174 | /// A prefix directory used to emulate a limited subset of GCC's '-Bprefix' |
||
175 | /// functionality. |
||
176 | /// FIXME: This type of customization should be removed in favor of the |
||
177 | /// universal driver when it is ready. |
||
178 | typedef SmallVector<std::string, 4> prefix_list; |
||
179 | prefix_list PrefixDirs; |
||
180 | |||
181 | /// sysroot, if present |
||
182 | std::string SysRoot; |
||
183 | |||
184 | /// Dynamic loader prefix, if present |
||
185 | std::string DyldPrefix; |
||
186 | |||
187 | /// Driver title to use with help. |
||
188 | std::string DriverTitle; |
||
189 | |||
190 | /// Information about the host which can be overridden by the user. |
||
191 | std::string HostBits, HostMachine, HostSystem, HostRelease; |
||
192 | |||
193 | /// The file to log CC_PRINT_PROC_STAT_FILE output to, if enabled. |
||
194 | std::string CCPrintStatReportFilename; |
||
195 | |||
196 | /// The file to log CC_PRINT_OPTIONS output to, if enabled. |
||
197 | std::string CCPrintOptionsFilename; |
||
198 | |||
199 | /// The file to log CC_PRINT_HEADERS output to, if enabled. |
||
200 | std::string CCPrintHeadersFilename; |
||
201 | |||
202 | /// The file to log CC_LOG_DIAGNOSTICS output to, if enabled. |
||
203 | std::string CCLogDiagnosticsFilename; |
||
204 | |||
205 | /// An input type and its arguments. |
||
206 | using InputTy = std::pair<types::ID, const llvm::opt::Arg *>; |
||
207 | |||
208 | /// A list of inputs and their types for the given arguments. |
||
209 | using InputList = SmallVector<InputTy, 16>; |
||
210 | |||
211 | /// Whether the driver should follow g++ like behavior. |
||
212 | bool CCCIsCXX() const { return Mode == GXXMode; } |
||
213 | |||
214 | /// Whether the driver is just the preprocessor. |
||
215 | bool CCCIsCPP() const { return Mode == CPPMode; } |
||
216 | |||
217 | /// Whether the driver should follow gcc like behavior. |
||
218 | bool CCCIsCC() const { return Mode == GCCMode; } |
||
219 | |||
220 | /// Whether the driver should follow cl.exe like behavior. |
||
221 | bool IsCLMode() const { return Mode == CLMode; } |
||
222 | |||
223 | /// Whether the driver should invoke flang for fortran inputs. |
||
224 | /// Other modes fall back to calling gcc which in turn calls gfortran. |
||
225 | bool IsFlangMode() const { return Mode == FlangMode; } |
||
226 | |||
227 | /// Whether the driver should follow dxc.exe like behavior. |
||
228 | bool IsDXCMode() const { return Mode == DXCMode; } |
||
229 | |||
230 | /// Only print tool bindings, don't build any jobs. |
||
231 | unsigned CCCPrintBindings : 1; |
||
232 | |||
233 | /// Set CC_PRINT_OPTIONS mode, which is like -v but logs the commands to |
||
234 | /// CCPrintOptionsFilename or to stderr. |
||
235 | unsigned CCPrintOptions : 1; |
||
236 | |||
237 | /// The format of the header information that is emitted. If CC_PRINT_HEADERS |
||
238 | /// is set, the format is textual. Otherwise, the format is determined by the |
||
239 | /// enviroment variable CC_PRINT_HEADERS_FORMAT. |
||
240 | HeaderIncludeFormatKind CCPrintHeadersFormat = HIFMT_None; |
||
241 | |||
242 | /// This flag determines whether clang should filter the header information |
||
243 | /// that is emitted. If enviroment variable CC_PRINT_HEADERS_FILTERING is set |
||
244 | /// to "only-direct-system", only system headers that are directly included |
||
245 | /// from non-system headers are emitted. |
||
246 | HeaderIncludeFilteringKind CCPrintHeadersFiltering = HIFIL_None; |
||
247 | |||
248 | /// Set CC_LOG_DIAGNOSTICS mode, which causes the frontend to log diagnostics |
||
249 | /// to CCLogDiagnosticsFilename or to stderr, in a stable machine readable |
||
250 | /// format. |
||
251 | unsigned CCLogDiagnostics : 1; |
||
252 | |||
253 | /// Whether the driver is generating diagnostics for debugging purposes. |
||
254 | unsigned CCGenDiagnostics : 1; |
||
255 | |||
256 | /// Set CC_PRINT_PROC_STAT mode, which causes the driver to dump |
||
257 | /// performance report to CC_PRINT_PROC_STAT_FILE or to stdout. |
||
258 | unsigned CCPrintProcessStats : 1; |
||
259 | |||
260 | /// Pointer to the ExecuteCC1Tool function, if available. |
||
261 | /// When the clangDriver lib is used through clang.exe, this provides a |
||
262 | /// shortcut for executing the -cc1 command-line directly, in the same |
||
263 | /// process. |
||
264 | typedef int (*CC1ToolFunc)(SmallVectorImpl<const char *> &ArgV); |
||
265 | CC1ToolFunc CC1Main = nullptr; |
||
266 | |||
267 | private: |
||
268 | /// Raw target triple. |
||
269 | std::string TargetTriple; |
||
270 | |||
271 | /// Name to use when invoking gcc/g++. |
||
272 | std::string CCCGenericGCCName; |
||
273 | |||
274 | /// Paths to configuration files used. |
||
275 | std::vector<std::string> ConfigFiles; |
||
276 | |||
277 | /// Allocator for string saver. |
||
278 | llvm::BumpPtrAllocator Alloc; |
||
279 | |||
280 | /// Object that stores strings read from configuration file. |
||
281 | llvm::StringSaver Saver; |
||
282 | |||
283 | /// Arguments originated from configuration file. |
||
284 | std::unique_ptr<llvm::opt::InputArgList> CfgOptions; |
||
285 | |||
286 | /// Arguments originated from command line. |
||
287 | std::unique_ptr<llvm::opt::InputArgList> CLOptions; |
||
288 | |||
289 | /// Whether to check that input files exist when constructing compilation |
||
290 | /// jobs. |
||
291 | unsigned CheckInputsExist : 1; |
||
292 | /// Whether to probe for PCH files on disk, in order to upgrade |
||
293 | /// -include foo.h to -include-pch foo.h.pch. |
||
294 | unsigned ProbePrecompiled : 1; |
||
295 | |||
296 | public: |
||
297 | // getFinalPhase - Determine which compilation mode we are in and record |
||
298 | // which option we used to determine the final phase. |
||
299 | // TODO: Much of what getFinalPhase returns are not actually true compiler |
||
300 | // modes. Fold this functionality into Types::getCompilationPhases and |
||
301 | // handleArguments. |
||
302 | phases::ID getFinalPhase(const llvm::opt::DerivedArgList &DAL, |
||
303 | llvm::opt::Arg **FinalPhaseArg = nullptr) const; |
||
304 | |||
305 | private: |
||
306 | /// Certain options suppress the 'no input files' warning. |
||
307 | unsigned SuppressMissingInputWarning : 1; |
||
308 | |||
309 | /// Cache of all the ToolChains in use by the driver. |
||
310 | /// |
||
311 | /// This maps from the string representation of a triple to a ToolChain |
||
312 | /// created targeting that triple. The driver owns all the ToolChain objects |
||
313 | /// stored in it, and will clean them up when torn down. |
||
314 | mutable llvm::StringMap<std::unique_ptr<ToolChain>> ToolChains; |
||
315 | |||
316 | /// Cache of known offloading architectures for the ToolChain already derived. |
||
317 | /// This should only be modified when we first initialize the offloading |
||
318 | /// toolchains. |
||
319 | llvm::DenseMap<const ToolChain *, llvm::DenseSet<llvm::StringRef>> KnownArchs; |
||
320 | |||
321 | private: |
||
322 | /// TranslateInputArgs - Create a new derived argument list from the input |
||
323 | /// arguments, after applying the standard argument translations. |
||
324 | llvm::opt::DerivedArgList * |
||
325 | TranslateInputArgs(const llvm::opt::InputArgList &Args) const; |
||
326 | |||
327 | // handleArguments - All code related to claiming and printing diagnostics |
||
328 | // related to arguments to the driver are done here. |
||
329 | void handleArguments(Compilation &C, llvm::opt::DerivedArgList &Args, |
||
330 | const InputList &Inputs, ActionList &Actions) const; |
||
331 | |||
332 | // Before executing jobs, sets up response files for commands that need them. |
||
333 | void setUpResponseFiles(Compilation &C, Command &Cmd); |
||
334 | |||
335 | void generatePrefixedToolNames(StringRef Tool, const ToolChain &TC, |
||
336 | SmallVectorImpl<std::string> &Names) const; |
||
337 | |||
338 | /// Find the appropriate .crash diagonostic file for the child crash |
||
339 | /// under this driver and copy it out to a temporary destination with the |
||
340 | /// other reproducer related files (.sh, .cache, etc). If not found, suggest a |
||
341 | /// directory for the user to look at. |
||
342 | /// |
||
343 | /// \param ReproCrashFilename The file path to copy the .crash to. |
||
344 | /// \param CrashDiagDir The suggested directory for the user to look at |
||
345 | /// in case the search or copy fails. |
||
346 | /// |
||
347 | /// \returns If the .crash is found and successfully copied return true, |
||
348 | /// otherwise false and return the suggested directory in \p CrashDiagDir. |
||
349 | bool getCrashDiagnosticFile(StringRef ReproCrashFilename, |
||
350 | SmallString<128> &CrashDiagDir); |
||
351 | |||
352 | public: |
||
353 | |||
354 | /// Takes the path to a binary that's either in bin/ or lib/ and returns |
||
355 | /// the path to clang's resource directory. |
||
356 | static std::string GetResourcesPath(StringRef BinaryPath, |
||
357 | StringRef CustomResourceDir = ""); |
||
358 | |||
359 | Driver(StringRef ClangExecutable, StringRef TargetTriple, |
||
360 | DiagnosticsEngine &Diags, std::string Title = "clang LLVM compiler", |
||
361 | IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS = nullptr); |
||
362 | |||
363 | /// @name Accessors |
||
364 | /// @{ |
||
365 | |||
366 | /// Name to use when invoking gcc/g++. |
||
367 | const std::string &getCCCGenericGCCName() const { return CCCGenericGCCName; } |
||
368 | |||
369 | llvm::ArrayRef<std::string> getConfigFiles() const { |
||
370 | return ConfigFiles; |
||
371 | } |
||
372 | |||
373 | const llvm::opt::OptTable &getOpts() const { return getDriverOptTable(); } |
||
374 | |||
375 | DiagnosticsEngine &getDiags() const { return Diags; } |
||
376 | |||
377 | llvm::vfs::FileSystem &getVFS() const { return *VFS; } |
||
378 | |||
379 | bool getCheckInputsExist() const { return CheckInputsExist; } |
||
380 | |||
381 | void setCheckInputsExist(bool Value) { CheckInputsExist = Value; } |
||
382 | |||
383 | bool getProbePrecompiled() const { return ProbePrecompiled; } |
||
384 | void setProbePrecompiled(bool Value) { ProbePrecompiled = Value; } |
||
385 | |||
386 | void setTargetAndMode(const ParsedClangName &TM) { ClangNameParts = TM; } |
||
387 | |||
388 | const std::string &getTitle() { return DriverTitle; } |
||
389 | void setTitle(std::string Value) { DriverTitle = std::move(Value); } |
||
390 | |||
391 | std::string getTargetTriple() const { return TargetTriple; } |
||
392 | |||
393 | /// Get the path to the main clang executable. |
||
394 | const char *getClangProgramPath() const { |
||
395 | return ClangExecutable.c_str(); |
||
396 | } |
||
397 | |||
398 | /// Get the path to where the clang executable was installed. |
||
399 | const char *getInstalledDir() const { |
||
400 | if (!InstalledDir.empty()) |
||
401 | return InstalledDir.c_str(); |
||
402 | return Dir.c_str(); |
||
403 | } |
||
404 | void setInstalledDir(StringRef Value) { InstalledDir = std::string(Value); } |
||
405 | |||
406 | bool isSaveTempsEnabled() const { return SaveTemps != SaveTempsNone; } |
||
407 | bool isSaveTempsObj() const { return SaveTemps == SaveTempsObj; } |
||
408 | |||
409 | bool embedBitcodeEnabled() const { return BitcodeEmbed != EmbedNone; } |
||
410 | bool embedBitcodeInObject() const { return (BitcodeEmbed == EmbedBitcode); } |
||
411 | bool embedBitcodeMarkerOnly() const { return (BitcodeEmbed == EmbedMarker); } |
||
412 | |||
413 | bool offloadHostOnly() const { return Offload == OffloadHost; } |
||
414 | bool offloadDeviceOnly() const { return Offload == OffloadDevice; } |
||
415 | |||
416 | /// Compute the desired OpenMP runtime from the flags provided. |
||
417 | OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const; |
||
418 | |||
419 | /// @} |
||
420 | /// @name Primary Functionality |
||
421 | /// @{ |
||
422 | |||
423 | /// CreateOffloadingDeviceToolChains - create all the toolchains required to |
||
424 | /// support offloading devices given the programming models specified in the |
||
425 | /// current compilation. Also, update the host tool chain kind accordingly. |
||
426 | void CreateOffloadingDeviceToolChains(Compilation &C, InputList &Inputs); |
||
427 | |||
428 | /// BuildCompilation - Construct a compilation object for a command |
||
429 | /// line argument vector. |
||
430 | /// |
||
431 | /// \return A compilation, or 0 if none was built for the given |
||
432 | /// argument vector. A null return value does not necessarily |
||
433 | /// indicate an error condition, the diagnostics should be queried |
||
434 | /// to determine if an error occurred. |
||
435 | Compilation *BuildCompilation(ArrayRef<const char *> Args); |
||
436 | |||
437 | /// ParseArgStrings - Parse the given list of strings into an |
||
438 | /// ArgList. |
||
439 | llvm::opt::InputArgList ParseArgStrings(ArrayRef<const char *> Args, |
||
440 | bool IsClCompatMode, |
||
441 | bool &ContainsError); |
||
442 | |||
443 | /// BuildInputs - Construct the list of inputs and their types from |
||
444 | /// the given arguments. |
||
445 | /// |
||
446 | /// \param TC - The default host tool chain. |
||
447 | /// \param Args - The input arguments. |
||
448 | /// \param Inputs - The list to store the resulting compilation |
||
449 | /// inputs onto. |
||
450 | void BuildInputs(const ToolChain &TC, llvm::opt::DerivedArgList &Args, |
||
451 | InputList &Inputs) const; |
||
452 | |||
453 | /// BuildActions - Construct the list of actions to perform for the |
||
454 | /// given arguments, which are only done for a single architecture. |
||
455 | /// |
||
456 | /// \param C - The compilation that is being built. |
||
457 | /// \param Args - The input arguments. |
||
458 | /// \param Actions - The list to store the resulting actions onto. |
||
459 | void BuildActions(Compilation &C, llvm::opt::DerivedArgList &Args, |
||
460 | const InputList &Inputs, ActionList &Actions) const; |
||
461 | |||
462 | /// BuildUniversalActions - Construct the list of actions to perform |
||
463 | /// for the given arguments, which may require a universal build. |
||
464 | /// |
||
465 | /// \param C - The compilation that is being built. |
||
466 | /// \param TC - The default host tool chain. |
||
467 | void BuildUniversalActions(Compilation &C, const ToolChain &TC, |
||
468 | const InputList &BAInputs) const; |
||
469 | |||
470 | /// BuildOffloadingActions - Construct the list of actions to perform for the |
||
471 | /// offloading toolchain that will be embedded in the host. |
||
472 | /// |
||
473 | /// \param C - The compilation that is being built. |
||
474 | /// \param Args - The input arguments. |
||
475 | /// \param Input - The input type and arguments |
||
476 | /// \param HostAction - The host action used in the offloading toolchain. |
||
477 | Action *BuildOffloadingActions(Compilation &C, |
||
478 | llvm::opt::DerivedArgList &Args, |
||
479 | const InputTy &Input, |
||
480 | Action *HostAction) const; |
||
481 | |||
482 | /// Returns the set of bound architectures active for this offload kind. |
||
483 | /// If there are no bound architctures we return a set containing only the |
||
484 | /// empty string. The \p SuppressError option is used to suppress errors. |
||
485 | llvm::DenseSet<StringRef> |
||
486 | getOffloadArchs(Compilation &C, const llvm::opt::DerivedArgList &Args, |
||
487 | Action::OffloadKind Kind, const ToolChain *TC, |
||
488 | bool SuppressError = false) const; |
||
489 | |||
490 | /// Check that the file referenced by Value exists. If it doesn't, |
||
491 | /// issue a diagnostic and return false. |
||
492 | /// If TypoCorrect is true and the file does not exist, see if it looks |
||
493 | /// like a likely typo for a flag and if so print a "did you mean" blurb. |
||
494 | bool DiagnoseInputExistence(const llvm::opt::DerivedArgList &Args, |
||
495 | StringRef Value, types::ID Ty, |
||
496 | bool TypoCorrect) const; |
||
497 | |||
498 | /// BuildJobs - Bind actions to concrete tools and translate |
||
499 | /// arguments to form the list of jobs to run. |
||
500 | /// |
||
501 | /// \param C - The compilation that is being built. |
||
502 | void BuildJobs(Compilation &C) const; |
||
503 | |||
504 | /// ExecuteCompilation - Execute the compilation according to the command line |
||
505 | /// arguments and return an appropriate exit code. |
||
506 | /// |
||
507 | /// This routine handles additional processing that must be done in addition |
||
508 | /// to just running the subprocesses, for example reporting errors, setting |
||
509 | /// up response files, removing temporary files, etc. |
||
510 | int ExecuteCompilation(Compilation &C, |
||
511 | SmallVectorImpl< std::pair<int, const Command *> > &FailingCommands); |
||
512 | |||
513 | /// Contains the files in the compilation diagnostic report generated by |
||
514 | /// generateCompilationDiagnostics. |
||
515 | struct CompilationDiagnosticReport { |
||
516 | llvm::SmallVector<std::string, 4> TemporaryFiles; |
||
517 | }; |
||
518 | |||
519 | /// generateCompilationDiagnostics - Generate diagnostics information |
||
520 | /// including preprocessed source file(s). |
||
521 | /// |
||
522 | void generateCompilationDiagnostics( |
||
523 | Compilation &C, const Command &FailingCommand, |
||
524 | StringRef AdditionalInformation = "", |
||
525 | CompilationDiagnosticReport *GeneratedReport = nullptr); |
||
526 | |||
527 | enum class CommandStatus { |
||
528 | Crash = 1, |
||
529 | Error, |
||
530 | Ok, |
||
531 | }; |
||
532 | |||
533 | enum class ReproLevel { |
||
534 | Off = 0, |
||
535 | OnCrash = static_cast<int>(CommandStatus::Crash), |
||
536 | OnError = static_cast<int>(CommandStatus::Error), |
||
537 | Always = static_cast<int>(CommandStatus::Ok), |
||
538 | }; |
||
539 | |||
540 | bool maybeGenerateCompilationDiagnostics( |
||
541 | CommandStatus CS, ReproLevel Level, Compilation &C, |
||
542 | const Command &FailingCommand, StringRef AdditionalInformation = "", |
||
543 | CompilationDiagnosticReport *GeneratedReport = nullptr) { |
||
544 | if (static_cast<int>(CS) > static_cast<int>(Level)) |
||
545 | return false; |
||
546 | if (CS != CommandStatus::Crash) |
||
547 | Diags.Report(diag::err_drv_force_crash) |
||
548 | << !::getenv("FORCE_CLANG_DIAGNOSTICS_CRASH"); |
||
549 | // Hack to ensure that diagnostic notes get emitted. |
||
550 | Diags.setLastDiagnosticIgnored(false); |
||
551 | generateCompilationDiagnostics(C, FailingCommand, AdditionalInformation, |
||
552 | GeneratedReport); |
||
553 | return true; |
||
554 | } |
||
555 | |||
556 | /// @} |
||
557 | /// @name Helper Methods |
||
558 | /// @{ |
||
559 | |||
560 | /// PrintActions - Print the list of actions. |
||
561 | void PrintActions(const Compilation &C) const; |
||
562 | |||
563 | /// PrintHelp - Print the help text. |
||
564 | /// |
||
565 | /// \param ShowHidden - Show hidden options. |
||
566 | void PrintHelp(bool ShowHidden) const; |
||
567 | |||
568 | /// PrintVersion - Print the driver version. |
||
569 | void PrintVersion(const Compilation &C, raw_ostream &OS) const; |
||
570 | |||
571 | /// GetFilePath - Lookup \p Name in the list of file search paths. |
||
572 | /// |
||
573 | /// \param TC - The tool chain for additional information on |
||
574 | /// directories to search. |
||
575 | // |
||
576 | // FIXME: This should be in CompilationInfo. |
||
577 | std::string GetFilePath(StringRef Name, const ToolChain &TC) const; |
||
578 | |||
579 | /// GetProgramPath - Lookup \p Name in the list of program search paths. |
||
580 | /// |
||
581 | /// \param TC - The provided tool chain for additional information on |
||
582 | /// directories to search. |
||
583 | // |
||
584 | // FIXME: This should be in CompilationInfo. |
||
585 | std::string GetProgramPath(StringRef Name, const ToolChain &TC) const; |
||
586 | |||
587 | /// HandleAutocompletions - Handle --autocomplete by searching and printing |
||
588 | /// possible flags, descriptions, and its arguments. |
||
589 | void HandleAutocompletions(StringRef PassedFlags) const; |
||
590 | |||
591 | /// HandleImmediateArgs - Handle any arguments which should be |
||
592 | /// treated before building actions or binding tools. |
||
593 | /// |
||
594 | /// \return Whether any compilation should be built for this |
||
595 | /// invocation. |
||
596 | bool HandleImmediateArgs(const Compilation &C); |
||
597 | |||
598 | /// ConstructAction - Construct the appropriate action to do for |
||
599 | /// \p Phase on the \p Input, taking in to account arguments |
||
600 | /// like -fsyntax-only or --analyze. |
||
601 | Action *ConstructPhaseAction( |
||
602 | Compilation &C, const llvm::opt::ArgList &Args, phases::ID Phase, |
||
603 | Action *Input, |
||
604 | Action::OffloadKind TargetDeviceOffloadKind = Action::OFK_None) const; |
||
605 | |||
606 | /// BuildJobsForAction - Construct the jobs to perform for the action \p A and |
||
607 | /// return an InputInfo for the result of running \p A. Will only construct |
||
608 | /// jobs for a given (Action, ToolChain, BoundArch, DeviceKind) tuple once. |
||
609 | InputInfoList BuildJobsForAction( |
||
610 | Compilation &C, const Action *A, const ToolChain *TC, StringRef BoundArch, |
||
611 | bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput, |
||
612 | std::map<std::pair<const Action *, std::string>, InputInfoList> |
||
613 | &CachedResults, |
||
614 | Action::OffloadKind TargetDeviceOffloadKind) const; |
||
615 | |||
616 | /// Returns the default name for linked images (e.g., "a.out"). |
||
617 | const char *getDefaultImageName() const; |
||
618 | |||
619 | // Creates a temp file with $Prefix-%%%%%%.$Suffix |
||
620 | const char *CreateTempFile(Compilation &C, StringRef Prefix, StringRef Suffix, |
||
621 | bool MultipleArchs = false, |
||
622 | StringRef BoundArch = {}) const; |
||
623 | |||
624 | /// GetNamedOutputPath - Return the name to use for the output of |
||
625 | /// the action \p JA. The result is appended to the compilation's |
||
626 | /// list of temporary or result files, as appropriate. |
||
627 | /// |
||
628 | /// \param C - The compilation. |
||
629 | /// \param JA - The action of interest. |
||
630 | /// \param BaseInput - The original input file that this action was |
||
631 | /// triggered by. |
||
632 | /// \param BoundArch - The bound architecture. |
||
633 | /// \param AtTopLevel - Whether this is a "top-level" action. |
||
634 | /// \param MultipleArchs - Whether multiple -arch options were supplied. |
||
635 | /// \param NormalizedTriple - The normalized triple of the relevant target. |
||
636 | const char *GetNamedOutputPath(Compilation &C, const JobAction &JA, |
||
637 | const char *BaseInput, StringRef BoundArch, |
||
638 | bool AtTopLevel, bool MultipleArchs, |
||
639 | StringRef NormalizedTriple) const; |
||
640 | |||
641 | /// GetTemporaryPath - Return the pathname of a temporary file to use |
||
642 | /// as part of compilation; the file will have the given prefix and suffix. |
||
643 | /// |
||
644 | /// GCC goes to extra lengths here to be a bit more robust. |
||
645 | std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const; |
||
646 | |||
647 | /// GetTemporaryDirectory - Return the pathname of a temporary directory to |
||
648 | /// use as part of compilation; the directory will have the given prefix. |
||
649 | std::string GetTemporaryDirectory(StringRef Prefix) const; |
||
650 | |||
651 | /// Return the pathname of the pch file in clang-cl mode. |
||
652 | std::string GetClPchPath(Compilation &C, StringRef BaseName) const; |
||
653 | |||
654 | /// ShouldUseClangCompiler - Should the clang compiler be used to |
||
655 | /// handle this action. |
||
656 | bool ShouldUseClangCompiler(const JobAction &JA) const; |
||
657 | |||
658 | /// ShouldUseFlangCompiler - Should the flang compiler be used to |
||
659 | /// handle this action. |
||
660 | bool ShouldUseFlangCompiler(const JobAction &JA) const; |
||
661 | |||
662 | /// ShouldEmitStaticLibrary - Should the linker emit a static library. |
||
663 | bool ShouldEmitStaticLibrary(const llvm::opt::ArgList &Args) const; |
||
664 | |||
665 | /// Returns true if the user has indicated a C++20 header unit mode. |
||
666 | bool hasHeaderMode() const { return CXX20HeaderType != HeaderMode_None; } |
||
667 | |||
668 | /// Get the mode for handling headers as set by fmodule-header{=}. |
||
669 | ModuleHeaderMode getModuleHeaderMode() const { return CXX20HeaderType; } |
||
670 | |||
671 | /// Returns true if we are performing any kind of LTO. |
||
672 | bool isUsingLTO(bool IsOffload = false) const { |
||
673 | return getLTOMode(IsOffload) != LTOK_None; |
||
674 | } |
||
675 | |||
676 | /// Get the specific kind of LTO being performed. |
||
677 | LTOKind getLTOMode(bool IsOffload = false) const { |
||
678 | return IsOffload ? OffloadLTOMode : LTOMode; |
||
679 | } |
||
680 | |||
681 | private: |
||
682 | |||
683 | /// Tries to load options from configuration files. |
||
684 | /// |
||
685 | /// \returns true if error occurred. |
||
686 | bool loadConfigFiles(); |
||
687 | |||
688 | /// Tries to load options from default configuration files (deduced from |
||
689 | /// executable filename). |
||
690 | /// |
||
691 | /// \returns true if error occurred. |
||
692 | bool loadDefaultConfigFiles(llvm::cl::ExpansionContext &ExpCtx); |
||
693 | |||
694 | /// Read options from the specified file. |
||
695 | /// |
||
696 | /// \param [in] FileName File to read. |
||
697 | /// \param [in] Search and expansion options. |
||
698 | /// \returns true, if error occurred while reading. |
||
699 | bool readConfigFile(StringRef FileName, llvm::cl::ExpansionContext &ExpCtx); |
||
700 | |||
701 | /// Set the driver mode (cl, gcc, etc) from the value of the `--driver-mode` |
||
702 | /// option. |
||
703 | void setDriverMode(StringRef DriverModeValue); |
||
704 | |||
705 | /// Parse the \p Args list for LTO options and record the type of LTO |
||
706 | /// compilation based on which -f(no-)?lto(=.*)? option occurs last. |
||
707 | void setLTOMode(const llvm::opt::ArgList &Args); |
||
708 | |||
709 | /// Retrieves a ToolChain for a particular \p Target triple. |
||
710 | /// |
||
711 | /// Will cache ToolChains for the life of the driver object, and create them |
||
712 | /// on-demand. |
||
713 | const ToolChain &getToolChain(const llvm::opt::ArgList &Args, |
||
714 | const llvm::Triple &Target) const; |
||
715 | |||
716 | /// @} |
||
717 | |||
718 | /// Retrieves a ToolChain for a particular device \p Target triple |
||
719 | /// |
||
720 | /// \param[in] HostTC is the host ToolChain paired with the device |
||
721 | /// |
||
722 | /// \param[in] TargetDeviceOffloadKind (e.g. OFK_Cuda/OFK_OpenMP/OFK_SYCL) is |
||
723 | /// an Offloading action that is optionally passed to a ToolChain (used by |
||
724 | /// CUDA, to specify if it's used in conjunction with OpenMP) |
||
725 | /// |
||
726 | /// Will cache ToolChains for the life of the driver object, and create them |
||
727 | /// on-demand. |
||
728 | const ToolChain &getOffloadingDeviceToolChain( |
||
729 | const llvm::opt::ArgList &Args, const llvm::Triple &Target, |
||
730 | const ToolChain &HostTC, |
||
731 | const Action::OffloadKind &TargetDeviceOffloadKind) const; |
||
732 | |||
733 | /// Get bitmasks for which option flags to include and exclude based on |
||
734 | /// the driver mode. |
||
735 | std::pair<unsigned, unsigned> getIncludeExcludeOptionFlagMasks(bool IsClCompatMode) const; |
||
736 | |||
737 | /// Helper used in BuildJobsForAction. Doesn't use the cache when building |
||
738 | /// jobs specifically for the given action, but will use the cache when |
||
739 | /// building jobs for the Action's inputs. |
||
740 | InputInfoList BuildJobsForActionNoCache( |
||
741 | Compilation &C, const Action *A, const ToolChain *TC, StringRef BoundArch, |
||
742 | bool AtTopLevel, bool MultipleArchs, const char *LinkingOutput, |
||
743 | std::map<std::pair<const Action *, std::string>, InputInfoList> |
||
744 | &CachedResults, |
||
745 | Action::OffloadKind TargetDeviceOffloadKind) const; |
||
746 | |||
747 | /// Return the typical executable name for the specified driver \p Mode. |
||
748 | static const char *getExecutableForDriverMode(DriverMode Mode); |
||
749 | |||
750 | public: |
||
751 | /// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and |
||
752 | /// return the grouped values as integers. Numbers which are not |
||
753 | /// provided are set to 0. |
||
754 | /// |
||
755 | /// \return True if the entire string was parsed (9.2), or all |
||
756 | /// groups were parsed (10.3.5extrastuff). HadExtra is true if all |
||
757 | /// groups were parsed but extra characters remain at the end. |
||
758 | static bool GetReleaseVersion(StringRef Str, unsigned &Major, unsigned &Minor, |
||
759 | unsigned &Micro, bool &HadExtra); |
||
760 | |||
761 | /// Parse digits from a string \p Str and fulfill \p Digits with |
||
762 | /// the parsed numbers. This method assumes that the max number of |
||
763 | /// digits to look for is equal to Digits.size(). |
||
764 | /// |
||
765 | /// \return True if the entire string was parsed and there are |
||
766 | /// no extra characters remaining at the end. |
||
767 | static bool GetReleaseVersion(StringRef Str, |
||
768 | MutableArrayRef<unsigned> Digits); |
||
769 | /// Compute the default -fmodule-cache-path. |
||
770 | /// \return True if the system provides a default cache directory. |
||
771 | static bool getDefaultModuleCachePath(SmallVectorImpl<char> &Result); |
||
772 | }; |
||
773 | |||
774 | /// \return True if the last defined optimization level is -Ofast. |
||
775 | /// And False otherwise. |
||
776 | bool isOptimizationLevelFast(const llvm::opt::ArgList &Args); |
||
777 | |||
778 | /// \return True if the argument combination will end up generating remarks. |
||
779 | bool willEmitRemarks(const llvm::opt::ArgList &Args); |
||
780 | |||
781 | /// Returns the driver mode option's value, i.e. `X` in `--driver-mode=X`. If \p |
||
782 | /// Args doesn't mention one explicitly, tries to deduce from `ProgName`. |
||
783 | /// Returns empty on failure. |
||
784 | /// Common values are "gcc", "g++", "cpp", "cl" and "flang". Returned value need |
||
785 | /// not be one of these. |
||
786 | llvm::StringRef getDriverMode(StringRef ProgName, ArrayRef<const char *> Args); |
||
787 | |||
788 | /// Checks whether the value produced by getDriverMode is for CL mode. |
||
789 | bool IsClangCL(StringRef DriverMode); |
||
790 | |||
791 | } // end namespace driver |
||
792 | } // end namespace clang |
||
793 | |||
794 | #endif |