xref: /llvm-project/clang/lib/Frontend/CompilerInvocation.cpp (revision 7a0ea120e2a1fffab71f9c8e3d5337899f7a42af)
1 //===- CompilerInvocation.cpp ---------------------------------------------===//
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 #include "clang/Frontend/CompilerInvocation.h"
10 #include "TestModuleFileExtension.h"
11 #include "clang/Basic/Builtins.h"
12 #include "clang/Basic/CharInfo.h"
13 #include "clang/Basic/CodeGenOptions.h"
14 #include "clang/Basic/CommentOptions.h"
15 #include "clang/Basic/DebugInfoOptions.h"
16 #include "clang/Basic/Diagnostic.h"
17 #include "clang/Basic/DiagnosticOptions.h"
18 #include "clang/Basic/FileSystemOptions.h"
19 #include "clang/Basic/LLVM.h"
20 #include "clang/Basic/LangOptions.h"
21 #include "clang/Basic/LangStandard.h"
22 #include "clang/Basic/ObjCRuntime.h"
23 #include "clang/Basic/Sanitizers.h"
24 #include "clang/Basic/SourceLocation.h"
25 #include "clang/Basic/TargetOptions.h"
26 #include "clang/Basic/Version.h"
27 #include "clang/Basic/Visibility.h"
28 #include "clang/Basic/XRayInstr.h"
29 #include "clang/Config/config.h"
30 #include "clang/Driver/Driver.h"
31 #include "clang/Driver/DriverDiagnostic.h"
32 #include "clang/Driver/Options.h"
33 #include "clang/Frontend/CommandLineSourceLoc.h"
34 #include "clang/Frontend/DependencyOutputOptions.h"
35 #include "clang/Frontend/FrontendDiagnostic.h"
36 #include "clang/Frontend/FrontendOptions.h"
37 #include "clang/Frontend/FrontendPluginRegistry.h"
38 #include "clang/Frontend/MigratorOptions.h"
39 #include "clang/Frontend/PreprocessorOutputOptions.h"
40 #include "clang/Frontend/Utils.h"
41 #include "clang/Lex/HeaderSearchOptions.h"
42 #include "clang/Lex/PreprocessorOptions.h"
43 #include "clang/Sema/CodeCompleteOptions.h"
44 #include "clang/Serialization/ASTBitCodes.h"
45 #include "clang/Serialization/ModuleFileExtension.h"
46 #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h"
47 #include "llvm/ADT/APInt.h"
48 #include "llvm/ADT/ArrayRef.h"
49 #include "llvm/ADT/CachedHashString.h"
50 #include "llvm/ADT/FloatingPointMode.h"
51 #include "llvm/ADT/Hashing.h"
52 #include "llvm/ADT/None.h"
53 #include "llvm/ADT/Optional.h"
54 #include "llvm/ADT/SmallString.h"
55 #include "llvm/ADT/SmallVector.h"
56 #include "llvm/ADT/StringRef.h"
57 #include "llvm/ADT/StringSwitch.h"
58 #include "llvm/ADT/Triple.h"
59 #include "llvm/ADT/Twine.h"
60 #include "llvm/IR/DebugInfoMetadata.h"
61 #include "llvm/Linker/Linker.h"
62 #include "llvm/MC/MCTargetOptions.h"
63 #include "llvm/Option/Arg.h"
64 #include "llvm/Option/ArgList.h"
65 #include "llvm/Option/OptSpecifier.h"
66 #include "llvm/Option/OptTable.h"
67 #include "llvm/Option/Option.h"
68 #include "llvm/ProfileData/InstrProfReader.h"
69 #include "llvm/Support/CodeGen.h"
70 #include "llvm/Support/Compiler.h"
71 #include "llvm/Support/Error.h"
72 #include "llvm/Support/ErrorHandling.h"
73 #include "llvm/Support/ErrorOr.h"
74 #include "llvm/Support/FileSystem.h"
75 #include "llvm/Support/Host.h"
76 #include "llvm/Support/MathExtras.h"
77 #include "llvm/Support/MemoryBuffer.h"
78 #include "llvm/Support/Path.h"
79 #include "llvm/Support/Process.h"
80 #include "llvm/Support/Regex.h"
81 #include "llvm/Support/VersionTuple.h"
82 #include "llvm/Support/VirtualFileSystem.h"
83 #include "llvm/Support/raw_ostream.h"
84 #include "llvm/Target/TargetOptions.h"
85 #include <algorithm>
86 #include <atomic>
87 #include <cassert>
88 #include <cstddef>
89 #include <cstring>
90 #include <memory>
91 #include <string>
92 #include <tuple>
93 #include <utility>
94 #include <vector>
95 
96 using namespace clang;
97 using namespace driver;
98 using namespace options;
99 using namespace llvm::opt;
100 
101 //===----------------------------------------------------------------------===//
102 // Initialization.
103 //===----------------------------------------------------------------------===//
104 
105 CompilerInvocationBase::CompilerInvocationBase()
106     : LangOpts(new LangOptions()), TargetOpts(new TargetOptions()),
107       DiagnosticOpts(new DiagnosticOptions()),
108       HeaderSearchOpts(new HeaderSearchOptions()),
109       PreprocessorOpts(new PreprocessorOptions()) {}
110 
111 CompilerInvocationBase::CompilerInvocationBase(const CompilerInvocationBase &X)
112     : LangOpts(new LangOptions(*X.getLangOpts())),
113       TargetOpts(new TargetOptions(X.getTargetOpts())),
114       DiagnosticOpts(new DiagnosticOptions(X.getDiagnosticOpts())),
115       HeaderSearchOpts(new HeaderSearchOptions(X.getHeaderSearchOpts())),
116       PreprocessorOpts(new PreprocessorOptions(X.getPreprocessorOpts())) {}
117 
118 CompilerInvocationBase::~CompilerInvocationBase() = default;
119 
120 //===----------------------------------------------------------------------===//
121 // Normalizers
122 //===----------------------------------------------------------------------===//
123 
124 #define SIMPLE_ENUM_VALUE_TABLE
125 #include "clang/Driver/Options.inc"
126 #undef SIMPLE_ENUM_VALUE_TABLE
127 
128 static llvm::Optional<bool> normalizeSimpleFlag(OptSpecifier Opt,
129                                                 unsigned TableIndex,
130                                                 const ArgList &Args,
131                                                 DiagnosticsEngine &Diags) {
132   if (Args.hasArg(Opt))
133     return true;
134   return None;
135 }
136 
137 void denormalizeSimpleFlag(SmallVectorImpl<const char *> &Args,
138                            const char *Spelling,
139                            CompilerInvocation::StringAllocator SA,
140                            unsigned TableIndex, unsigned Value) {
141   Args.push_back(Spelling);
142 }
143 
144 template <typename T, T Value>
145 static llvm::Optional<T>
146 normalizeFlagToValue(OptSpecifier Opt, unsigned TableIndex, const ArgList &Args,
147                      DiagnosticsEngine &Diags) {
148   if (Args.hasArg(Opt))
149     return Value;
150   return None;
151 }
152 
153 static Optional<bool> normalizeBooleanFlag(OptSpecifier PosOpt,
154                                            OptSpecifier NegOpt,
155                                            unsigned TableIndex,
156                                            const ArgList &Args,
157                                            DiagnosticsEngine &Diags) {
158   if (const Arg *A = Args.getLastArg(PosOpt, NegOpt))
159     return A->getOption().matches(PosOpt);
160   return None;
161 }
162 
163 static void denormalizeBooleanFlag(SmallVectorImpl<const char *> &Args,
164                                    const char *Spelling,
165                                    const char *NegSpelling,
166                                    CompilerInvocation::StringAllocator SA,
167                                    unsigned TableIndex, unsigned Value) {
168   if (Value)
169     Args.push_back(Spelling);
170   else
171     Args.push_back(NegSpelling);
172 }
173 
174 static Optional<SimpleEnumValue>
175 findValueTableByName(const SimpleEnumValueTable &Table, StringRef Name) {
176   for (int I = 0, E = Table.Size; I != E; ++I)
177     if (Name == Table.Table[I].Name)
178       return Table.Table[I];
179 
180   return None;
181 }
182 
183 static Optional<SimpleEnumValue>
184 findValueTableByValue(const SimpleEnumValueTable &Table, unsigned Value) {
185   for (int I = 0, E = Table.Size; I != E; ++I)
186     if (Value == Table.Table[I].Value)
187       return Table.Table[I];
188 
189   return None;
190 }
191 
192 static llvm::Optional<unsigned> normalizeSimpleEnum(OptSpecifier Opt,
193                                                     unsigned TableIndex,
194                                                     const ArgList &Args,
195                                                     DiagnosticsEngine &Diags) {
196   assert(TableIndex < SimpleEnumValueTablesSize);
197   const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
198 
199   auto *Arg = Args.getLastArg(Opt);
200   if (!Arg)
201     return None;
202 
203   StringRef ArgValue = Arg->getValue();
204   if (auto MaybeEnumVal = findValueTableByName(Table, ArgValue))
205     return MaybeEnumVal->Value;
206 
207   Diags.Report(diag::err_drv_invalid_value)
208       << Arg->getAsString(Args) << ArgValue;
209   return None;
210 }
211 
212 static void denormalizeSimpleEnum(SmallVectorImpl<const char *> &Args,
213                                   const char *Spelling,
214                                   CompilerInvocation::StringAllocator SA,
215                                   unsigned TableIndex, unsigned Value) {
216   assert(TableIndex < SimpleEnumValueTablesSize);
217   const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
218   if (auto MaybeEnumVal = findValueTableByValue(Table, Value)) {
219     Args.push_back(Spelling);
220     Args.push_back(MaybeEnumVal->Name);
221   } else {
222     llvm_unreachable("The simple enum value was not correctly defined in "
223                      "the tablegen option description");
224   }
225 }
226 
227 static void denormalizeSimpleEnumJoined(SmallVectorImpl<const char *> &Args,
228                                         const char *Spelling,
229                                         CompilerInvocation::StringAllocator SA,
230                                         unsigned TableIndex, unsigned Value) {
231   assert(TableIndex < SimpleEnumValueTablesSize);
232   const SimpleEnumValueTable &Table = SimpleEnumValueTables[TableIndex];
233   if (auto MaybeEnumVal = findValueTableByValue(Table, Value))
234     Args.push_back(SA(Twine(Spelling) + MaybeEnumVal->Name));
235   else
236     llvm_unreachable("The simple enum value was not correctly defined in "
237                      "the tablegen option description");
238 }
239 
240 static void denormalizeString(SmallVectorImpl<const char *> &Args,
241                               const char *Spelling,
242                               CompilerInvocation::StringAllocator SA,
243                               unsigned TableIndex, const std::string &Value) {
244   Args.push_back(Spelling);
245   Args.push_back(SA(Value));
246 }
247 
248 static Optional<std::string> normalizeTriple(OptSpecifier Opt, int TableIndex,
249                                              const ArgList &Args,
250                                              DiagnosticsEngine &Diags) {
251   auto *Arg = Args.getLastArg(Opt);
252   if (!Arg)
253     return None;
254   return llvm::Triple::normalize(Arg->getValue());
255 }
256 
257 template <typename T, typename U>
258 static T mergeForwardValue(T KeyPath, U Value) {
259   return Value;
260 }
261 
262 template <typename T, typename U> static T mergeMaskValue(T KeyPath, U Value) {
263   return KeyPath | Value;
264 }
265 
266 template <typename T> static T extractForwardValue(T KeyPath) {
267   return KeyPath;
268 }
269 
270 template <typename T, typename U, U Value>
271 static T extractMaskValue(T KeyPath) {
272   return KeyPath & Value;
273 }
274 
275 static void FixupInvocation(CompilerInvocation &Invocation) {
276   LangOptions &LangOpts = *Invocation.getLangOpts();
277   DiagnosticOptions &DiagOpts = Invocation.getDiagnosticOpts();
278   CodeGenOptions &CodeGenOpts = Invocation.getCodeGenOpts();
279   CodeGenOpts.XRayInstrumentFunctions = LangOpts.XRayInstrument;
280   CodeGenOpts.XRayAlwaysEmitCustomEvents = LangOpts.XRayAlwaysEmitCustomEvents;
281   CodeGenOpts.XRayAlwaysEmitTypedEvents = LangOpts.XRayAlwaysEmitTypedEvents;
282 
283   llvm::sys::Process::UseANSIEscapeCodes(DiagOpts.UseANSIEscapeCodes);
284 }
285 
286 //===----------------------------------------------------------------------===//
287 // Deserialization (from args)
288 //===----------------------------------------------------------------------===//
289 
290 static unsigned getOptimizationLevel(ArgList &Args, InputKind IK,
291                                      DiagnosticsEngine &Diags) {
292   unsigned DefaultOpt = llvm::CodeGenOpt::None;
293   if (IK.getLanguage() == Language::OpenCL && !Args.hasArg(OPT_cl_opt_disable))
294     DefaultOpt = llvm::CodeGenOpt::Default;
295 
296   if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
297     if (A->getOption().matches(options::OPT_O0))
298       return llvm::CodeGenOpt::None;
299 
300     if (A->getOption().matches(options::OPT_Ofast))
301       return llvm::CodeGenOpt::Aggressive;
302 
303     assert(A->getOption().matches(options::OPT_O));
304 
305     StringRef S(A->getValue());
306     if (S == "s" || S == "z")
307       return llvm::CodeGenOpt::Default;
308 
309     if (S == "g")
310       return llvm::CodeGenOpt::Less;
311 
312     return getLastArgIntValue(Args, OPT_O, DefaultOpt, Diags);
313   }
314 
315   return DefaultOpt;
316 }
317 
318 static unsigned getOptimizationLevelSize(ArgList &Args) {
319   if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
320     if (A->getOption().matches(options::OPT_O)) {
321       switch (A->getValue()[0]) {
322       default:
323         return 0;
324       case 's':
325         return 1;
326       case 'z':
327         return 2;
328       }
329     }
330   }
331   return 0;
332 }
333 
334 static void addDiagnosticArgs(ArgList &Args, OptSpecifier Group,
335                               OptSpecifier GroupWithValue,
336                               std::vector<std::string> &Diagnostics) {
337   for (auto *A : Args.filtered(Group)) {
338     if (A->getOption().getKind() == Option::FlagClass) {
339       // The argument is a pure flag (such as OPT_Wall or OPT_Wdeprecated). Add
340       // its name (minus the "W" or "R" at the beginning) to the warning list.
341       Diagnostics.push_back(
342           std::string(A->getOption().getName().drop_front(1)));
343     } else if (A->getOption().matches(GroupWithValue)) {
344       // This is -Wfoo= or -Rfoo=, where foo is the name of the diagnostic group.
345       Diagnostics.push_back(
346           std::string(A->getOption().getName().drop_front(1).rtrim("=-")));
347     } else {
348       // Otherwise, add its value (for OPT_W_Joined and similar).
349       for (const auto *Arg : A->getValues())
350         Diagnostics.emplace_back(Arg);
351     }
352   }
353 }
354 
355 // Parse the Static Analyzer configuration. If \p Diags is set to nullptr,
356 // it won't verify the input.
357 static void parseAnalyzerConfigs(AnalyzerOptions &AnOpts,
358                                  DiagnosticsEngine *Diags);
359 
360 static void getAllNoBuiltinFuncValues(ArgList &Args,
361                                       std::vector<std::string> &Funcs) {
362   SmallVector<const char *, 8> Values;
363   for (const auto &Arg : Args) {
364     const Option &O = Arg->getOption();
365     if (O.matches(options::OPT_fno_builtin_)) {
366       const char *FuncName = Arg->getValue();
367       if (Builtin::Context::isBuiltinFunc(FuncName))
368         Values.push_back(FuncName);
369     }
370   }
371   Funcs.insert(Funcs.end(), Values.begin(), Values.end());
372 }
373 
374 static bool ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
375                               DiagnosticsEngine &Diags) {
376   bool Success = true;
377   if (Arg *A = Args.getLastArg(OPT_analyzer_store)) {
378     StringRef Name = A->getValue();
379     AnalysisStores Value = llvm::StringSwitch<AnalysisStores>(Name)
380 #define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) \
381       .Case(CMDFLAG, NAME##Model)
382 #include "clang/StaticAnalyzer/Core/Analyses.def"
383       .Default(NumStores);
384     if (Value == NumStores) {
385       Diags.Report(diag::err_drv_invalid_value)
386         << A->getAsString(Args) << Name;
387       Success = false;
388     } else {
389       Opts.AnalysisStoreOpt = Value;
390     }
391   }
392 
393   if (Arg *A = Args.getLastArg(OPT_analyzer_constraints)) {
394     StringRef Name = A->getValue();
395     AnalysisConstraints Value = llvm::StringSwitch<AnalysisConstraints>(Name)
396 #define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) \
397       .Case(CMDFLAG, NAME##Model)
398 #include "clang/StaticAnalyzer/Core/Analyses.def"
399       .Default(NumConstraints);
400     if (Value == NumConstraints) {
401       Diags.Report(diag::err_drv_invalid_value)
402         << A->getAsString(Args) << Name;
403       Success = false;
404     } else {
405       Opts.AnalysisConstraintsOpt = Value;
406     }
407   }
408 
409   if (Arg *A = Args.getLastArg(OPT_analyzer_output)) {
410     StringRef Name = A->getValue();
411     AnalysisDiagClients Value = llvm::StringSwitch<AnalysisDiagClients>(Name)
412 #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) \
413       .Case(CMDFLAG, PD_##NAME)
414 #include "clang/StaticAnalyzer/Core/Analyses.def"
415       .Default(NUM_ANALYSIS_DIAG_CLIENTS);
416     if (Value == NUM_ANALYSIS_DIAG_CLIENTS) {
417       Diags.Report(diag::err_drv_invalid_value)
418         << A->getAsString(Args) << Name;
419       Success = false;
420     } else {
421       Opts.AnalysisDiagOpt = Value;
422     }
423   }
424 
425   if (Arg *A = Args.getLastArg(OPT_analyzer_purge)) {
426     StringRef Name = A->getValue();
427     AnalysisPurgeMode Value = llvm::StringSwitch<AnalysisPurgeMode>(Name)
428 #define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) \
429       .Case(CMDFLAG, NAME)
430 #include "clang/StaticAnalyzer/Core/Analyses.def"
431       .Default(NumPurgeModes);
432     if (Value == NumPurgeModes) {
433       Diags.Report(diag::err_drv_invalid_value)
434         << A->getAsString(Args) << Name;
435       Success = false;
436     } else {
437       Opts.AnalysisPurgeOpt = Value;
438     }
439   }
440 
441   if (Arg *A = Args.getLastArg(OPT_analyzer_inlining_mode)) {
442     StringRef Name = A->getValue();
443     AnalysisInliningMode Value = llvm::StringSwitch<AnalysisInliningMode>(Name)
444 #define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) \
445       .Case(CMDFLAG, NAME)
446 #include "clang/StaticAnalyzer/Core/Analyses.def"
447       .Default(NumInliningModes);
448     if (Value == NumInliningModes) {
449       Diags.Report(diag::err_drv_invalid_value)
450         << A->getAsString(Args) << Name;
451       Success = false;
452     } else {
453       Opts.InliningMode = Value;
454     }
455   }
456 
457   Opts.ShouldEmitErrorsOnInvalidConfigValue =
458       /* negated */!llvm::StringSwitch<bool>(
459                    Args.getLastArgValue(OPT_analyzer_config_compatibility_mode))
460         .Case("true", true)
461         .Case("false", false)
462         .Default(false);
463 
464   Opts.DumpExplodedGraphTo =
465       std::string(Args.getLastArgValue(OPT_analyzer_dump_egraph));
466   Opts.AnalyzeSpecificFunction =
467       std::string(Args.getLastArgValue(OPT_analyze_function));
468   Opts.maxBlockVisitOnPath =
469       getLastArgIntValue(Args, OPT_analyzer_max_loop, 4, Diags);
470   Opts.InlineMaxStackDepth =
471       getLastArgIntValue(Args, OPT_analyzer_inline_max_stack_depth,
472                          Opts.InlineMaxStackDepth, Diags);
473 
474   Opts.CheckersAndPackages.clear();
475   for (const Arg *A :
476        Args.filtered(OPT_analyzer_checker, OPT_analyzer_disable_checker)) {
477     A->claim();
478     bool IsEnabled = A->getOption().getID() == OPT_analyzer_checker;
479     // We can have a list of comma separated checker names, e.g:
480     // '-analyzer-checker=cocoa,unix'
481     StringRef CheckerAndPackageList = A->getValue();
482     SmallVector<StringRef, 16> CheckersAndPackages;
483     CheckerAndPackageList.split(CheckersAndPackages, ",");
484     for (const StringRef &CheckerOrPackage : CheckersAndPackages)
485       Opts.CheckersAndPackages.emplace_back(std::string(CheckerOrPackage),
486                                             IsEnabled);
487   }
488 
489   // Go through the analyzer configuration options.
490   for (const auto *A : Args.filtered(OPT_analyzer_config)) {
491 
492     // We can have a list of comma separated config names, e.g:
493     // '-analyzer-config key1=val1,key2=val2'
494     StringRef configList = A->getValue();
495     SmallVector<StringRef, 4> configVals;
496     configList.split(configVals, ",");
497     for (const auto &configVal : configVals) {
498       StringRef key, val;
499       std::tie(key, val) = configVal.split("=");
500       if (val.empty()) {
501         Diags.Report(SourceLocation(),
502                      diag::err_analyzer_config_no_value) << configVal;
503         Success = false;
504         break;
505       }
506       if (val.find('=') != StringRef::npos) {
507         Diags.Report(SourceLocation(),
508                      diag::err_analyzer_config_multiple_values)
509           << configVal;
510         Success = false;
511         break;
512       }
513 
514       // TODO: Check checker options too, possibly in CheckerRegistry.
515       // Leave unknown non-checker configs unclaimed.
516       if (!key.contains(":") && Opts.isUnknownAnalyzerConfig(key)) {
517         if (Opts.ShouldEmitErrorsOnInvalidConfigValue)
518           Diags.Report(diag::err_analyzer_config_unknown) << key;
519         continue;
520       }
521 
522       A->claim();
523       Opts.Config[key] = std::string(val);
524     }
525   }
526 
527   if (Opts.ShouldEmitErrorsOnInvalidConfigValue)
528     parseAnalyzerConfigs(Opts, &Diags);
529   else
530     parseAnalyzerConfigs(Opts, nullptr);
531 
532   llvm::raw_string_ostream os(Opts.FullCompilerInvocation);
533   for (unsigned i = 0; i < Args.getNumInputArgStrings(); ++i) {
534     if (i != 0)
535       os << " ";
536     os << Args.getArgString(i);
537   }
538   os.flush();
539 
540   return Success;
541 }
542 
543 static StringRef getStringOption(AnalyzerOptions::ConfigTable &Config,
544                                  StringRef OptionName, StringRef DefaultVal) {
545   return Config.insert({OptionName, std::string(DefaultVal)}).first->second;
546 }
547 
548 static void initOption(AnalyzerOptions::ConfigTable &Config,
549                        DiagnosticsEngine *Diags,
550                        StringRef &OptionField, StringRef Name,
551                        StringRef DefaultVal) {
552   // String options may be known to invalid (e.g. if the expected string is a
553   // file name, but the file does not exist), those will have to be checked in
554   // parseConfigs.
555   OptionField = getStringOption(Config, Name, DefaultVal);
556 }
557 
558 static void initOption(AnalyzerOptions::ConfigTable &Config,
559                        DiagnosticsEngine *Diags,
560                        bool &OptionField, StringRef Name, bool DefaultVal) {
561   auto PossiblyInvalidVal = llvm::StringSwitch<Optional<bool>>(
562                  getStringOption(Config, Name, (DefaultVal ? "true" : "false")))
563       .Case("true", true)
564       .Case("false", false)
565       .Default(None);
566 
567   if (!PossiblyInvalidVal) {
568     if (Diags)
569       Diags->Report(diag::err_analyzer_config_invalid_input)
570         << Name << "a boolean";
571     else
572       OptionField = DefaultVal;
573   } else
574     OptionField = PossiblyInvalidVal.getValue();
575 }
576 
577 static void initOption(AnalyzerOptions::ConfigTable &Config,
578                        DiagnosticsEngine *Diags,
579                        unsigned &OptionField, StringRef Name,
580                        unsigned DefaultVal) {
581 
582   OptionField = DefaultVal;
583   bool HasFailed = getStringOption(Config, Name, std::to_string(DefaultVal))
584                      .getAsInteger(0, OptionField);
585   if (Diags && HasFailed)
586     Diags->Report(diag::err_analyzer_config_invalid_input)
587       << Name << "an unsigned";
588 }
589 
590 static void parseAnalyzerConfigs(AnalyzerOptions &AnOpts,
591                                  DiagnosticsEngine *Diags) {
592   // TODO: There's no need to store the entire configtable, it'd be plenty
593   // enough tostore checker options.
594 
595 #define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL)                \
596   initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEFAULT_VAL);
597 
598 #define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC,        \
599                                            SHALLOW_VAL, DEEP_VAL)              \
600   switch (AnOpts.getUserMode()) {                                              \
601   case UMK_Shallow:                                                            \
602     initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, SHALLOW_VAL);       \
603     break;                                                                     \
604   case UMK_Deep:                                                               \
605     initOption(AnOpts.Config, Diags, AnOpts.NAME, CMDFLAG, DEEP_VAL);          \
606     break;                                                                     \
607   }                                                                            \
608 
609 #include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
610 #undef ANALYZER_OPTION
611 #undef ANALYZER_OPTION_DEPENDS_ON_USER_MODE
612 
613   // At this point, AnalyzerOptions is configured. Let's validate some options.
614 
615   // FIXME: Here we try to validate the silenced checkers or packages are valid.
616   // The current approach only validates the registered checkers which does not
617   // contain the runtime enabled checkers and optimally we would validate both.
618   if (!AnOpts.RawSilencedCheckersAndPackages.empty()) {
619     std::vector<StringRef> Checkers =
620         AnOpts.getRegisteredCheckers(/*IncludeExperimental=*/true);
621     std::vector<StringRef> Packages =
622         AnOpts.getRegisteredPackages(/*IncludeExperimental=*/true);
623 
624     SmallVector<StringRef, 16> CheckersAndPackages;
625     AnOpts.RawSilencedCheckersAndPackages.split(CheckersAndPackages, ";");
626 
627     for (const StringRef &CheckerOrPackage : CheckersAndPackages) {
628       if (Diags) {
629         bool IsChecker = CheckerOrPackage.contains('.');
630         bool IsValidName =
631             IsChecker
632                 ? llvm::find(Checkers, CheckerOrPackage) != Checkers.end()
633                 : llvm::find(Packages, CheckerOrPackage) != Packages.end();
634 
635         if (!IsValidName)
636           Diags->Report(diag::err_unknown_analyzer_checker_or_package)
637               << CheckerOrPackage;
638       }
639 
640       AnOpts.SilencedCheckersAndPackages.emplace_back(CheckerOrPackage);
641     }
642   }
643 
644   if (!Diags)
645     return;
646 
647   if (AnOpts.ShouldTrackConditionsDebug && !AnOpts.ShouldTrackConditions)
648     Diags->Report(diag::err_analyzer_config_invalid_input)
649         << "track-conditions-debug" << "'track-conditions' to also be enabled";
650 
651   if (!AnOpts.CTUDir.empty() && !llvm::sys::fs::is_directory(AnOpts.CTUDir))
652     Diags->Report(diag::err_analyzer_config_invalid_input) << "ctu-dir"
653                                                            << "a filename";
654 
655   if (!AnOpts.ModelPath.empty() &&
656       !llvm::sys::fs::is_directory(AnOpts.ModelPath))
657     Diags->Report(diag::err_analyzer_config_invalid_input) << "model-path"
658                                                            << "a filename";
659 }
660 
661 static void ParseCommentArgs(CommentOptions &Opts, ArgList &Args) {
662   Opts.BlockCommandNames = Args.getAllArgValues(OPT_fcomment_block_commands);
663   Opts.ParseAllComments = Args.hasArg(OPT_fparse_all_comments);
664 }
665 
666 /// Create a new Regex instance out of the string value in \p RpassArg.
667 /// It returns a pointer to the newly generated Regex instance.
668 static std::shared_ptr<llvm::Regex>
669 GenerateOptimizationRemarkRegex(DiagnosticsEngine &Diags, ArgList &Args,
670                                 Arg *RpassArg) {
671   StringRef Val = RpassArg->getValue();
672   std::string RegexError;
673   std::shared_ptr<llvm::Regex> Pattern = std::make_shared<llvm::Regex>(Val);
674   if (!Pattern->isValid(RegexError)) {
675     Diags.Report(diag::err_drv_optimization_remark_pattern)
676         << RegexError << RpassArg->getAsString(Args);
677     Pattern.reset();
678   }
679   return Pattern;
680 }
681 
682 static bool parseDiagnosticLevelMask(StringRef FlagName,
683                                      const std::vector<std::string> &Levels,
684                                      DiagnosticsEngine *Diags,
685                                      DiagnosticLevelMask &M) {
686   bool Success = true;
687   for (const auto &Level : Levels) {
688     DiagnosticLevelMask const PM =
689       llvm::StringSwitch<DiagnosticLevelMask>(Level)
690         .Case("note",    DiagnosticLevelMask::Note)
691         .Case("remark",  DiagnosticLevelMask::Remark)
692         .Case("warning", DiagnosticLevelMask::Warning)
693         .Case("error",   DiagnosticLevelMask::Error)
694         .Default(DiagnosticLevelMask::None);
695     if (PM == DiagnosticLevelMask::None) {
696       Success = false;
697       if (Diags)
698         Diags->Report(diag::err_drv_invalid_value) << FlagName << Level;
699     }
700     M = M | PM;
701   }
702   return Success;
703 }
704 
705 static void parseSanitizerKinds(StringRef FlagName,
706                                 const std::vector<std::string> &Sanitizers,
707                                 DiagnosticsEngine &Diags, SanitizerSet &S) {
708   for (const auto &Sanitizer : Sanitizers) {
709     SanitizerMask K = parseSanitizerValue(Sanitizer, /*AllowGroups=*/false);
710     if (K == SanitizerMask())
711       Diags.Report(diag::err_drv_invalid_value) << FlagName << Sanitizer;
712     else
713       S.set(K, true);
714   }
715 }
716 
717 static void parseXRayInstrumentationBundle(StringRef FlagName, StringRef Bundle,
718                                            ArgList &Args, DiagnosticsEngine &D,
719                                            XRayInstrSet &S) {
720   llvm::SmallVector<StringRef, 2> BundleParts;
721   llvm::SplitString(Bundle, BundleParts, ",");
722   for (const auto &B : BundleParts) {
723     auto Mask = parseXRayInstrValue(B);
724     if (Mask == XRayInstrKind::None)
725       if (B != "none")
726         D.Report(diag::err_drv_invalid_value) << FlagName << Bundle;
727       else
728         S.Mask = Mask;
729     else if (Mask == XRayInstrKind::All)
730       S.Mask = Mask;
731     else
732       S.set(Mask, true);
733   }
734 }
735 
736 // Set the profile kind for fprofile-instrument.
737 static void setPGOInstrumentor(CodeGenOptions &Opts, ArgList &Args,
738                                DiagnosticsEngine &Diags) {
739   Arg *A = Args.getLastArg(OPT_fprofile_instrument_EQ);
740   if (A == nullptr)
741     return;
742   StringRef S = A->getValue();
743   unsigned I = llvm::StringSwitch<unsigned>(S)
744                    .Case("none", CodeGenOptions::ProfileNone)
745                    .Case("clang", CodeGenOptions::ProfileClangInstr)
746                    .Case("llvm", CodeGenOptions::ProfileIRInstr)
747                    .Case("csllvm", CodeGenOptions::ProfileCSIRInstr)
748                    .Default(~0U);
749   if (I == ~0U) {
750     Diags.Report(diag::err_drv_invalid_pgo_instrumentor) << A->getAsString(Args)
751                                                          << S;
752     return;
753   }
754   auto Instrumentor = static_cast<CodeGenOptions::ProfileInstrKind>(I);
755   Opts.setProfileInstr(Instrumentor);
756 }
757 
758 // Set the profile kind using fprofile-instrument-use-path.
759 static void setPGOUseInstrumentor(CodeGenOptions &Opts,
760                                   const Twine &ProfileName) {
761   auto ReaderOrErr = llvm::IndexedInstrProfReader::create(ProfileName);
762   // In error, return silently and let Clang PGOUse report the error message.
763   if (auto E = ReaderOrErr.takeError()) {
764     llvm::consumeError(std::move(E));
765     Opts.setProfileUse(CodeGenOptions::ProfileClangInstr);
766     return;
767   }
768   std::unique_ptr<llvm::IndexedInstrProfReader> PGOReader =
769     std::move(ReaderOrErr.get());
770   if (PGOReader->isIRLevelProfile()) {
771     if (PGOReader->hasCSIRLevelProfile())
772       Opts.setProfileUse(CodeGenOptions::ProfileCSIRInstr);
773     else
774       Opts.setProfileUse(CodeGenOptions::ProfileIRInstr);
775   } else
776     Opts.setProfileUse(CodeGenOptions::ProfileClangInstr);
777 }
778 
779 static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
780                              DiagnosticsEngine &Diags,
781                              const TargetOptions &TargetOpts,
782                              const FrontendOptions &FrontendOpts) {
783   bool Success = true;
784   llvm::Triple Triple = llvm::Triple(TargetOpts.Triple);
785 
786   unsigned OptimizationLevel = getOptimizationLevel(Args, IK, Diags);
787   // TODO: This could be done in Driver
788   unsigned MaxOptLevel = 3;
789   if (OptimizationLevel > MaxOptLevel) {
790     // If the optimization level is not supported, fall back on the default
791     // optimization
792     Diags.Report(diag::warn_drv_optimization_value)
793         << Args.getLastArg(OPT_O)->getAsString(Args) << "-O" << MaxOptLevel;
794     OptimizationLevel = MaxOptLevel;
795   }
796   Opts.OptimizationLevel = OptimizationLevel;
797 
798   // At O0 we want to fully disable inlining outside of cases marked with
799   // 'alwaysinline' that are required for correctness.
800   Opts.setInlining((Opts.OptimizationLevel == 0)
801                        ? CodeGenOptions::OnlyAlwaysInlining
802                        : CodeGenOptions::NormalInlining);
803   // Explicit inlining flags can disable some or all inlining even at
804   // optimization levels above zero.
805   if (Arg *InlineArg = Args.getLastArg(
806           options::OPT_finline_functions, options::OPT_finline_hint_functions,
807           options::OPT_fno_inline_functions, options::OPT_fno_inline)) {
808     if (Opts.OptimizationLevel > 0) {
809       const Option &InlineOpt = InlineArg->getOption();
810       if (InlineOpt.matches(options::OPT_finline_functions))
811         Opts.setInlining(CodeGenOptions::NormalInlining);
812       else if (InlineOpt.matches(options::OPT_finline_hint_functions))
813         Opts.setInlining(CodeGenOptions::OnlyHintInlining);
814       else
815         Opts.setInlining(CodeGenOptions::OnlyAlwaysInlining);
816     }
817   }
818 
819   Opts.DebugPassManager =
820       Args.hasFlag(OPT_fdebug_pass_manager, OPT_fno_debug_pass_manager,
821                    /* Default */ false);
822 
823   if (Arg *A = Args.getLastArg(OPT_fveclib)) {
824     StringRef Name = A->getValue();
825     if (Name == "Accelerate")
826       Opts.setVecLib(CodeGenOptions::Accelerate);
827     else if (Name == "libmvec")
828       Opts.setVecLib(CodeGenOptions::LIBMVEC);
829     else if (Name == "MASSV")
830       Opts.setVecLib(CodeGenOptions::MASSV);
831     else if (Name == "SVML")
832       Opts.setVecLib(CodeGenOptions::SVML);
833     else if (Name == "none")
834       Opts.setVecLib(CodeGenOptions::NoLibrary);
835     else
836       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
837   }
838 
839   if (Arg *A = Args.getLastArg(OPT_debug_info_kind_EQ)) {
840     unsigned Val =
841         llvm::StringSwitch<unsigned>(A->getValue())
842             .Case("line-tables-only", codegenoptions::DebugLineTablesOnly)
843             .Case("line-directives-only", codegenoptions::DebugDirectivesOnly)
844             .Case("constructor", codegenoptions::DebugInfoConstructor)
845             .Case("limited", codegenoptions::LimitedDebugInfo)
846             .Case("standalone", codegenoptions::FullDebugInfo)
847             .Case("unused-types", codegenoptions::UnusedTypeInfo)
848             .Default(~0U);
849     if (Val == ~0U)
850       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args)
851                                                 << A->getValue();
852     else
853       Opts.setDebugInfo(static_cast<codegenoptions::DebugInfoKind>(Val));
854   }
855   // If -fuse-ctor-homing is set and limited debug info is already on, then use
856   // constructor homing.
857   if (Args.getLastArg(OPT_fuse_ctor_homing))
858     if (Opts.getDebugInfo() == codegenoptions::LimitedDebugInfo)
859       Opts.setDebugInfo(codegenoptions::DebugInfoConstructor);
860 
861   if (Arg *A = Args.getLastArg(OPT_debugger_tuning_EQ)) {
862     unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
863                        .Case("gdb", unsigned(llvm::DebuggerKind::GDB))
864                        .Case("lldb", unsigned(llvm::DebuggerKind::LLDB))
865                        .Case("sce", unsigned(llvm::DebuggerKind::SCE))
866                        .Default(~0U);
867     if (Val == ~0U)
868       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args)
869                                                 << A->getValue();
870     else
871       Opts.setDebuggerTuning(static_cast<llvm::DebuggerKind>(Val));
872   }
873   Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 0, Diags);
874   Opts.DebugColumnInfo = !Args.hasArg(OPT_gno_column_info);
875   Opts.EmitCodeView = Args.hasArg(OPT_gcodeview);
876   Opts.CodeViewGHash = Args.hasArg(OPT_gcodeview_ghash);
877   Opts.MacroDebugInfo = Args.hasArg(OPT_debug_info_macro);
878   Opts.WholeProgramVTables = Args.hasArg(OPT_fwhole_program_vtables);
879   Opts.VirtualFunctionElimination =
880       Args.hasArg(OPT_fvirtual_function_elimination);
881   Opts.LTOVisibilityPublicStd = Args.hasArg(OPT_flto_visibility_public_std);
882   Opts.SplitDwarfFile = std::string(Args.getLastArgValue(OPT_split_dwarf_file));
883   Opts.SplitDwarfOutput =
884       std::string(Args.getLastArgValue(OPT_split_dwarf_output));
885   Opts.SplitDwarfInlining = !Args.hasArg(OPT_fno_split_dwarf_inlining);
886   Opts.DebugTypeExtRefs = Args.hasArg(OPT_dwarf_ext_refs);
887   Opts.DebugExplicitImport = Args.hasArg(OPT_dwarf_explicit_import);
888   Opts.DebugFwdTemplateParams = Args.hasArg(OPT_debug_forward_template_params);
889   Opts.EmbedSource = Args.hasArg(OPT_gembed_source);
890   Opts.ForceDwarfFrameSection = Args.hasArg(OPT_fforce_dwarf_frame);
891 
892   for (const auto &Arg : Args.getAllArgValues(OPT_fdebug_prefix_map_EQ)) {
893     auto Split = StringRef(Arg).split('=');
894     Opts.DebugPrefixMap.insert(
895         {std::string(Split.first), std::string(Split.second)});
896   }
897 
898   if (const Arg *A =
899           Args.getLastArg(OPT_emit_llvm_uselists, OPT_no_emit_llvm_uselists))
900     Opts.EmitLLVMUseLists = A->getOption().getID() == OPT_emit_llvm_uselists;
901 
902   Opts.DisableLLVMPasses = Args.hasArg(OPT_disable_llvm_passes);
903   Opts.DisableLifetimeMarkers = Args.hasArg(OPT_disable_lifetimemarkers);
904 
905   const llvm::Triple::ArchType DebugEntryValueArchs[] = {
906       llvm::Triple::x86, llvm::Triple::x86_64, llvm::Triple::aarch64,
907       llvm::Triple::arm, llvm::Triple::armeb, llvm::Triple::mips,
908       llvm::Triple::mipsel, llvm::Triple::mips64, llvm::Triple::mips64el};
909 
910   llvm::Triple T(TargetOpts.Triple);
911   if (Opts.OptimizationLevel > 0 && Opts.hasReducedDebugInfo() &&
912       llvm::is_contained(DebugEntryValueArchs, T.getArch()))
913     Opts.EmitCallSiteInfo = true;
914 
915   Opts.ValueTrackingVariableLocations =
916       Args.hasArg(OPT_fexperimental_debug_variable_locations);
917 
918   Opts.DisableO0ImplyOptNone = Args.hasArg(OPT_disable_O0_optnone);
919   Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone);
920   Opts.IndirectTlsSegRefs = Args.hasArg(OPT_mno_tls_direct_seg_refs);
921   Opts.ForbidGuardVariables = Args.hasArg(OPT_fforbid_guard_variables);
922   Opts.UseRegisterSizedBitfieldAccess = Args.hasArg(
923     OPT_fuse_register_sized_bitfield_access);
924   Opts.RelaxedAliasing = Args.hasArg(OPT_relaxed_aliasing);
925   Opts.StructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa);
926   Opts.NewStructPathTBAA = !Args.hasArg(OPT_no_struct_path_tbaa) &&
927                            Args.hasArg(OPT_new_struct_path_tbaa);
928   Opts.FineGrainedBitfieldAccesses =
929       Args.hasFlag(OPT_ffine_grained_bitfield_accesses,
930                    OPT_fno_fine_grained_bitfield_accesses, false);
931   Opts.DwarfDebugFlags =
932       std::string(Args.getLastArgValue(OPT_dwarf_debug_flags));
933   Opts.RecordCommandLine =
934       std::string(Args.getLastArgValue(OPT_record_command_line));
935   Opts.MergeAllConstants = Args.hasArg(OPT_fmerge_all_constants);
936   Opts.NoCommon = !Args.hasArg(OPT_fcommon);
937   Opts.NoInlineLineTables = Args.hasArg(OPT_gno_inline_line_tables);
938   Opts.NoImplicitFloat = Args.hasArg(OPT_no_implicit_float);
939   Opts.OptimizeSize = getOptimizationLevelSize(Args);
940   Opts.SimplifyLibCalls = !(Args.hasArg(OPT_fno_builtin) ||
941                             Args.hasArg(OPT_ffreestanding));
942   if (Opts.SimplifyLibCalls)
943     getAllNoBuiltinFuncValues(Args, Opts.NoBuiltinFuncs);
944   Opts.UnrollLoops =
945       Args.hasFlag(OPT_funroll_loops, OPT_fno_unroll_loops,
946                    (Opts.OptimizationLevel > 1));
947   Opts.RerollLoops = Args.hasArg(OPT_freroll_loops);
948 
949   Opts.DisableIntegratedAS = Args.hasArg(OPT_fno_integrated_as);
950   Opts.Autolink = !Args.hasArg(OPT_fno_autolink);
951   Opts.SampleProfileFile =
952       std::string(Args.getLastArgValue(OPT_fprofile_sample_use_EQ));
953   Opts.DebugInfoForProfiling = Args.hasFlag(
954       OPT_fdebug_info_for_profiling, OPT_fno_debug_info_for_profiling, false);
955   Opts.DebugNameTable = static_cast<unsigned>(
956       Args.hasArg(OPT_ggnu_pubnames)
957           ? llvm::DICompileUnit::DebugNameTableKind::GNU
958           : Args.hasArg(OPT_gpubnames)
959                 ? llvm::DICompileUnit::DebugNameTableKind::Default
960                 : llvm::DICompileUnit::DebugNameTableKind::None);
961   Opts.DebugRangesBaseAddress = Args.hasArg(OPT_fdebug_ranges_base_address);
962 
963   setPGOInstrumentor(Opts, Args, Diags);
964   Opts.AtomicProfileUpdate = Args.hasArg(OPT_fprofile_update_EQ);
965   Opts.InstrProfileOutput =
966       std::string(Args.getLastArgValue(OPT_fprofile_instrument_path_EQ));
967   Opts.ProfileInstrumentUsePath =
968       std::string(Args.getLastArgValue(OPT_fprofile_instrument_use_path_EQ));
969   if (!Opts.ProfileInstrumentUsePath.empty())
970     setPGOUseInstrumentor(Opts, Opts.ProfileInstrumentUsePath);
971   Opts.ProfileRemappingFile =
972       std::string(Args.getLastArgValue(OPT_fprofile_remapping_file_EQ));
973   if (!Opts.ProfileRemappingFile.empty() && !Opts.ExperimentalNewPassManager) {
974     Diags.Report(diag::err_drv_argument_only_allowed_with)
975       << Args.getLastArg(OPT_fprofile_remapping_file_EQ)->getAsString(Args)
976       << "-fexperimental-new-pass-manager";
977   }
978 
979   Opts.CoverageMapping =
980       Args.hasFlag(OPT_fcoverage_mapping, OPT_fno_coverage_mapping, false);
981   Opts.DumpCoverageMapping = Args.hasArg(OPT_dump_coverage_mapping);
982   Opts.AsmVerbose = !Args.hasArg(OPT_fno_verbose_asm);
983   Opts.PreserveAsmComments = !Args.hasArg(OPT_fno_preserve_as_comments);
984   Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
985   Opts.ObjCAutoRefCountExceptions = Args.hasArg(OPT_fobjc_arc_exceptions);
986   Opts.CXAAtExit = !Args.hasArg(OPT_fno_use_cxa_atexit);
987   Opts.RegisterGlobalDtorsWithAtExit =
988       Args.hasArg(OPT_fregister_global_dtors_with_atexit);
989   Opts.CXXCtorDtorAliases = Args.hasArg(OPT_mconstructor_aliases);
990   Opts.CodeModel = TargetOpts.CodeModel;
991   Opts.DebugPass = std::string(Args.getLastArgValue(OPT_mdebug_pass));
992 
993   // Handle -mframe-pointer option.
994   if (Arg *A = Args.getLastArg(OPT_mframe_pointer_EQ)) {
995     CodeGenOptions::FramePointerKind FP;
996     StringRef Name = A->getValue();
997     bool ValidFP = true;
998     if (Name == "none")
999       FP = CodeGenOptions::FramePointerKind::None;
1000     else if (Name == "non-leaf")
1001       FP = CodeGenOptions::FramePointerKind::NonLeaf;
1002     else if (Name == "all")
1003       FP = CodeGenOptions::FramePointerKind::All;
1004     else {
1005       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
1006       Success = false;
1007       ValidFP = false;
1008     }
1009     if (ValidFP)
1010       Opts.setFramePointer(FP);
1011   }
1012 
1013   Opts.DisableFree = Args.hasArg(OPT_disable_free);
1014   Opts.DiscardValueNames = Args.hasArg(OPT_discard_value_names);
1015   Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls);
1016   Opts.NoEscapingBlockTailCalls =
1017       Args.hasArg(OPT_fno_escaping_block_tail_calls);
1018   Opts.FloatABI = std::string(Args.getLastArgValue(OPT_mfloat_abi));
1019   Opts.LimitFloatPrecision =
1020       std::string(Args.getLastArgValue(OPT_mlimit_float_precision));
1021   Opts.Reciprocals = Args.getAllArgValues(OPT_mrecip_EQ);
1022   Opts.StrictFloatCastOverflow =
1023       !Args.hasArg(OPT_fno_strict_float_cast_overflow);
1024 
1025   Opts.NoZeroInitializedInBSS = Args.hasArg(OPT_fno_zero_initialized_in_bss);
1026   Opts.NumRegisterParameters = getLastArgIntValue(Args, OPT_mregparm, 0, Diags);
1027   Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);
1028   Opts.SmallDataLimit =
1029       getLastArgIntValue(Args, OPT_msmall_data_limit, 0, Diags);
1030   Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);
1031   Opts.NoWarn = Args.hasArg(OPT_massembler_no_warn);
1032   Opts.EnableSegmentedStacks = Args.hasArg(OPT_split_stacks);
1033   Opts.RelaxAll = Args.hasArg(OPT_mrelax_all);
1034   Opts.IncrementalLinkerCompatible =
1035       Args.hasArg(OPT_mincremental_linker_compatible);
1036   Opts.PIECopyRelocations =
1037       Args.hasArg(OPT_mpie_copy_relocations);
1038   Opts.NoPLT = Args.hasArg(OPT_fno_plt);
1039   Opts.SaveTempLabels = Args.hasArg(OPT_msave_temp_labels);
1040   Opts.NoDwarfDirectoryAsm = Args.hasArg(OPT_fno_dwarf_directory_asm);
1041   Opts.SoftFloat = Args.hasArg(OPT_msoft_float);
1042   Opts.StrictEnums = Args.hasArg(OPT_fstrict_enums);
1043   Opts.StrictReturn = !Args.hasArg(OPT_fno_strict_return);
1044   Opts.StrictVTablePointers = Args.hasArg(OPT_fstrict_vtable_pointers);
1045   Opts.ForceEmitVTables = Args.hasArg(OPT_fforce_emit_vtables);
1046   Opts.UnwindTables = Args.hasArg(OPT_munwind_tables);
1047   Opts.ThreadModel =
1048       std::string(Args.getLastArgValue(OPT_mthread_model, "posix"));
1049   if (Opts.ThreadModel != "posix" && Opts.ThreadModel != "single")
1050     Diags.Report(diag::err_drv_invalid_value)
1051         << Args.getLastArg(OPT_mthread_model)->getAsString(Args)
1052         << Opts.ThreadModel;
1053   Opts.TrapFuncName = std::string(Args.getLastArgValue(OPT_ftrap_function_EQ));
1054   Opts.UseInitArray = !Args.hasArg(OPT_fno_use_init_array);
1055 
1056   Opts.BBSections =
1057       std::string(Args.getLastArgValue(OPT_fbasic_block_sections_EQ, "none"));
1058 
1059   // Basic Block Sections implies Function Sections.
1060   Opts.FunctionSections =
1061       Args.hasArg(OPT_ffunction_sections) ||
1062       (Opts.BBSections != "none" && Opts.BBSections != "labels");
1063 
1064   Opts.DataSections = Args.hasArg(OPT_fdata_sections);
1065   Opts.StackSizeSection = Args.hasArg(OPT_fstack_size_section);
1066   Opts.UniqueSectionNames = !Args.hasArg(OPT_fno_unique_section_names);
1067   Opts.UniqueBasicBlockSectionNames =
1068       Args.hasArg(OPT_funique_basic_block_section_names);
1069   Opts.UniqueInternalLinkageNames =
1070       Args.hasArg(OPT_funique_internal_linkage_names);
1071 
1072   Opts.SplitMachineFunctions = Args.hasArg(OPT_fsplit_machine_functions);
1073 
1074   Opts.MergeFunctions = Args.hasArg(OPT_fmerge_functions);
1075 
1076   Opts.NoUseJumpTables = Args.hasArg(OPT_fno_jump_tables);
1077 
1078   Opts.NullPointerIsValid = Args.hasArg(OPT_fno_delete_null_pointer_checks);
1079 
1080   Opts.ProfileSampleAccurate = Args.hasArg(OPT_fprofile_sample_accurate);
1081 
1082   Opts.PrepareForLTO = Args.hasArg(OPT_flto, OPT_flto_EQ);
1083   Opts.PrepareForThinLTO = false;
1084   if (Arg *A = Args.getLastArg(OPT_flto_EQ)) {
1085     StringRef S = A->getValue();
1086     if (S == "thin")
1087       Opts.PrepareForThinLTO = true;
1088     else if (S != "full")
1089       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1090   }
1091   Opts.LTOUnit = Args.hasFlag(OPT_flto_unit, OPT_fno_lto_unit, false);
1092   Opts.EnableSplitLTOUnit = Args.hasArg(OPT_fsplit_lto_unit);
1093   if (Arg *A = Args.getLastArg(OPT_fthinlto_index_EQ)) {
1094     if (IK.getLanguage() != Language::LLVM_IR)
1095       Diags.Report(diag::err_drv_argument_only_allowed_with)
1096           << A->getAsString(Args) << "-x ir";
1097     Opts.ThinLTOIndexFile =
1098         std::string(Args.getLastArgValue(OPT_fthinlto_index_EQ));
1099   }
1100   if (Arg *A = Args.getLastArg(OPT_save_temps_EQ))
1101     Opts.SaveTempsFilePrefix =
1102         llvm::StringSwitch<std::string>(A->getValue())
1103             .Case("obj", FrontendOpts.OutputFile)
1104             .Default(llvm::sys::path::filename(FrontendOpts.OutputFile).str());
1105 
1106   Opts.ThinLinkBitcodeFile =
1107       std::string(Args.getLastArgValue(OPT_fthin_link_bitcode_EQ));
1108 
1109   // The memory profile runtime appends the pid to make this name more unique.
1110   const char *MemProfileBasename = "memprof.profraw";
1111   if (Args.hasArg(OPT_fmemory_profile_EQ)) {
1112     SmallString<128> Path(
1113         std::string(Args.getLastArgValue(OPT_fmemory_profile_EQ)));
1114     llvm::sys::path::append(Path, MemProfileBasename);
1115     Opts.MemoryProfileOutput = std::string(Path);
1116   } else if (Args.hasArg(OPT_fmemory_profile))
1117     Opts.MemoryProfileOutput = MemProfileBasename;
1118 
1119   Opts.MSVolatile = Args.hasArg(OPT_fms_volatile);
1120 
1121   Opts.VectorizeLoop = Args.hasArg(OPT_vectorize_loops);
1122   Opts.VectorizeSLP = Args.hasArg(OPT_vectorize_slp);
1123 
1124   Opts.PreferVectorWidth =
1125       std::string(Args.getLastArgValue(OPT_mprefer_vector_width_EQ));
1126 
1127   Opts.MainFileName = std::string(Args.getLastArgValue(OPT_main_file_name));
1128   Opts.VerifyModule = !Args.hasArg(OPT_disable_llvm_verifier);
1129 
1130   Opts.ControlFlowGuardNoChecks = Args.hasArg(OPT_cfguard_no_checks);
1131   Opts.ControlFlowGuard = Args.hasArg(OPT_cfguard);
1132 
1133   Opts.EmitGcovNotes = Args.hasArg(OPT_ftest_coverage);
1134   Opts.EmitGcovArcs = Args.hasArg(OPT_fprofile_arcs);
1135   if (Opts.EmitGcovArcs || Opts.EmitGcovNotes) {
1136     Opts.CoverageDataFile =
1137         std::string(Args.getLastArgValue(OPT_coverage_data_file));
1138     Opts.CoverageNotesFile =
1139         std::string(Args.getLastArgValue(OPT_coverage_notes_file));
1140     Opts.ProfileFilterFiles =
1141         std::string(Args.getLastArgValue(OPT_fprofile_filter_files_EQ));
1142     Opts.ProfileExcludeFiles =
1143         std::string(Args.getLastArgValue(OPT_fprofile_exclude_files_EQ));
1144     if (Args.hasArg(OPT_coverage_version_EQ)) {
1145       StringRef CoverageVersion = Args.getLastArgValue(OPT_coverage_version_EQ);
1146       if (CoverageVersion.size() != 4) {
1147         Diags.Report(diag::err_drv_invalid_value)
1148             << Args.getLastArg(OPT_coverage_version_EQ)->getAsString(Args)
1149             << CoverageVersion;
1150       } else {
1151         memcpy(Opts.CoverageVersion, CoverageVersion.data(), 4);
1152       }
1153     }
1154   }
1155   // Handle -fembed-bitcode option.
1156   if (Arg *A = Args.getLastArg(OPT_fembed_bitcode_EQ)) {
1157     StringRef Name = A->getValue();
1158     unsigned Model = llvm::StringSwitch<unsigned>(Name)
1159         .Case("off", CodeGenOptions::Embed_Off)
1160         .Case("all", CodeGenOptions::Embed_All)
1161         .Case("bitcode", CodeGenOptions::Embed_Bitcode)
1162         .Case("marker", CodeGenOptions::Embed_Marker)
1163         .Default(~0U);
1164     if (Model == ~0U) {
1165       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
1166       Success = false;
1167     } else
1168       Opts.setEmbedBitcode(
1169           static_cast<CodeGenOptions::EmbedBitcodeKind>(Model));
1170   }
1171   // FIXME: For backend options that are not yet recorded as function
1172   // attributes in the IR, keep track of them so we can embed them in a
1173   // separate data section and use them when building the bitcode.
1174   for (const auto &A : Args) {
1175     // Do not encode output and input.
1176     if (A->getOption().getID() == options::OPT_o ||
1177         A->getOption().getID() == options::OPT_INPUT ||
1178         A->getOption().getID() == options::OPT_x ||
1179         A->getOption().getID() == options::OPT_fembed_bitcode ||
1180         A->getOption().matches(options::OPT_W_Group))
1181       continue;
1182     ArgStringList ASL;
1183     A->render(Args, ASL);
1184     for (const auto &arg : ASL) {
1185       StringRef ArgStr(arg);
1186       Opts.CmdArgs.insert(Opts.CmdArgs.end(), ArgStr.begin(), ArgStr.end());
1187       // using \00 to separate each commandline options.
1188       Opts.CmdArgs.push_back('\0');
1189     }
1190   }
1191 
1192   Opts.PreserveVec3Type = Args.hasArg(OPT_fpreserve_vec3_type);
1193   Opts.InstrumentFunctions = Args.hasArg(OPT_finstrument_functions);
1194   Opts.InstrumentFunctionsAfterInlining =
1195       Args.hasArg(OPT_finstrument_functions_after_inlining);
1196   Opts.InstrumentFunctionEntryBare =
1197       Args.hasArg(OPT_finstrument_function_entry_bare);
1198 
1199   Opts.XRayInstructionThreshold =
1200       getLastArgIntValue(Args, OPT_fxray_instruction_threshold_EQ, 200, Diags);
1201   Opts.XRayTotalFunctionGroups =
1202       getLastArgIntValue(Args, OPT_fxray_function_groups, 1, Diags);
1203   Opts.XRaySelectedFunctionGroup =
1204       getLastArgIntValue(Args, OPT_fxray_selected_function_group, 0, Diags);
1205 
1206   auto XRayInstrBundles =
1207       Args.getAllArgValues(OPT_fxray_instrumentation_bundle);
1208   if (XRayInstrBundles.empty())
1209     Opts.XRayInstrumentationBundle.Mask = XRayInstrKind::All;
1210   else
1211     for (const auto &A : XRayInstrBundles)
1212       parseXRayInstrumentationBundle("-fxray-instrumentation-bundle=", A, Args,
1213                                      Diags, Opts.XRayInstrumentationBundle);
1214 
1215   Opts.PatchableFunctionEntryCount =
1216       getLastArgIntValue(Args, OPT_fpatchable_function_entry_EQ, 0, Diags);
1217   Opts.PatchableFunctionEntryOffset = getLastArgIntValue(
1218       Args, OPT_fpatchable_function_entry_offset_EQ, 0, Diags);
1219   Opts.InstrumentForProfiling = Args.hasArg(OPT_pg);
1220   Opts.CallFEntry = Args.hasArg(OPT_mfentry);
1221   Opts.MNopMCount = Args.hasArg(OPT_mnop_mcount);
1222   Opts.RecordMCount = Args.hasArg(OPT_mrecord_mcount);
1223   Opts.PackedStack = Args.hasArg(OPT_mpacked_stack);
1224 
1225   if (const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
1226     StringRef Name = A->getValue();
1227     if (Name == "full") {
1228       Opts.CFProtectionReturn = 1;
1229       Opts.CFProtectionBranch = 1;
1230     } else if (Name == "return")
1231       Opts.CFProtectionReturn = 1;
1232     else if (Name == "branch")
1233       Opts.CFProtectionBranch = 1;
1234     else if (Name != "none") {
1235       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
1236       Success = false;
1237     }
1238   }
1239 
1240   if (const Arg *A = Args.getLastArg(OPT_compress_debug_sections_EQ)) {
1241     auto DCT = llvm::StringSwitch<llvm::DebugCompressionType>(A->getValue())
1242                    .Case("none", llvm::DebugCompressionType::None)
1243                    .Case("zlib", llvm::DebugCompressionType::Z)
1244                    .Case("zlib-gnu", llvm::DebugCompressionType::GNU)
1245                    .Default(llvm::DebugCompressionType::None);
1246     Opts.setCompressDebugSections(DCT);
1247   }
1248 
1249   Opts.RelaxELFRelocations = Args.hasArg(OPT_mrelax_relocations);
1250   Opts.DebugCompilationDir =
1251       std::string(Args.getLastArgValue(OPT_fdebug_compilation_dir));
1252   for (auto *A :
1253        Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_builtin_bitcode)) {
1254     CodeGenOptions::BitcodeFileToLink F;
1255     F.Filename = A->getValue();
1256     if (A->getOption().matches(OPT_mlink_builtin_bitcode)) {
1257       F.LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
1258       // When linking CUDA bitcode, propagate function attributes so that
1259       // e.g. libdevice gets fast-math attrs if we're building with fast-math.
1260       F.PropagateAttrs = true;
1261       F.Internalize = true;
1262     }
1263     Opts.LinkBitcodeFiles.push_back(F);
1264   }
1265   Opts.SanitizeCoverageType =
1266       getLastArgIntValue(Args, OPT_fsanitize_coverage_type, 0, Diags);
1267   Opts.SanitizeCoverageIndirectCalls =
1268       Args.hasArg(OPT_fsanitize_coverage_indirect_calls);
1269   Opts.SanitizeCoverageTraceBB = Args.hasArg(OPT_fsanitize_coverage_trace_bb);
1270   Opts.SanitizeCoverageTraceCmp = Args.hasArg(OPT_fsanitize_coverage_trace_cmp);
1271   Opts.SanitizeCoverageTraceDiv = Args.hasArg(OPT_fsanitize_coverage_trace_div);
1272   Opts.SanitizeCoverageTraceGep = Args.hasArg(OPT_fsanitize_coverage_trace_gep);
1273   Opts.SanitizeCoverage8bitCounters =
1274       Args.hasArg(OPT_fsanitize_coverage_8bit_counters);
1275   Opts.SanitizeCoverageTracePC = Args.hasArg(OPT_fsanitize_coverage_trace_pc);
1276   Opts.SanitizeCoverageTracePCGuard =
1277       Args.hasArg(OPT_fsanitize_coverage_trace_pc_guard);
1278   Opts.SanitizeCoverageNoPrune = Args.hasArg(OPT_fsanitize_coverage_no_prune);
1279   Opts.SanitizeCoverageInline8bitCounters =
1280       Args.hasArg(OPT_fsanitize_coverage_inline_8bit_counters);
1281   Opts.SanitizeCoverageInlineBoolFlag =
1282       Args.hasArg(OPT_fsanitize_coverage_inline_bool_flag);
1283   Opts.SanitizeCoveragePCTable = Args.hasArg(OPT_fsanitize_coverage_pc_table);
1284   Opts.SanitizeCoverageStackDepth =
1285       Args.hasArg(OPT_fsanitize_coverage_stack_depth);
1286   Opts.SanitizeCoverageAllowlistFiles =
1287       Args.getAllArgValues(OPT_fsanitize_coverage_allowlist);
1288   Opts.SanitizeCoverageBlocklistFiles =
1289       Args.getAllArgValues(OPT_fsanitize_coverage_blocklist);
1290   Opts.SanitizeMemoryTrackOrigins =
1291       getLastArgIntValue(Args, OPT_fsanitize_memory_track_origins_EQ, 0, Diags);
1292   Opts.SanitizeMemoryUseAfterDtor =
1293       Args.hasFlag(OPT_fsanitize_memory_use_after_dtor,
1294                    OPT_fno_sanitize_memory_use_after_dtor,
1295                    false);
1296   Opts.SanitizeMinimalRuntime = Args.hasArg(OPT_fsanitize_minimal_runtime);
1297   Opts.SanitizeCfiCrossDso = Args.hasArg(OPT_fsanitize_cfi_cross_dso);
1298   Opts.SanitizeCfiICallGeneralizePointers =
1299       Args.hasArg(OPT_fsanitize_cfi_icall_generalize_pointers);
1300   Opts.SanitizeCfiCanonicalJumpTables =
1301       Args.hasArg(OPT_fsanitize_cfi_canonical_jump_tables);
1302   Opts.SanitizeStats = Args.hasArg(OPT_fsanitize_stats);
1303   if (Arg *A = Args.getLastArg(
1304           OPT_fsanitize_address_poison_custom_array_cookie,
1305           OPT_fno_sanitize_address_poison_custom_array_cookie)) {
1306     Opts.SanitizeAddressPoisonCustomArrayCookie =
1307         A->getOption().getID() ==
1308         OPT_fsanitize_address_poison_custom_array_cookie;
1309   }
1310   if (Arg *A = Args.getLastArg(OPT_fsanitize_address_use_after_scope,
1311                                OPT_fno_sanitize_address_use_after_scope)) {
1312     Opts.SanitizeAddressUseAfterScope =
1313         A->getOption().getID() == OPT_fsanitize_address_use_after_scope;
1314   }
1315   Opts.SanitizeAddressGlobalsDeadStripping =
1316       Args.hasArg(OPT_fsanitize_address_globals_dead_stripping);
1317   if (Arg *A = Args.getLastArg(OPT_fsanitize_address_use_odr_indicator,
1318                                OPT_fno_sanitize_address_use_odr_indicator)) {
1319     Opts.SanitizeAddressUseOdrIndicator =
1320         A->getOption().getID() == OPT_fsanitize_address_use_odr_indicator;
1321   }
1322   Opts.SSPBufferSize =
1323       getLastArgIntValue(Args, OPT_stack_protector_buffer_size, 8, Diags);
1324 
1325   Opts.StackProtectorGuard =
1326       std::string(Args.getLastArgValue(OPT_mstack_protector_guard_EQ));
1327 
1328   if (Arg *A = Args.getLastArg(OPT_mstack_protector_guard_offset_EQ)) {
1329     StringRef Val = A->getValue();
1330     unsigned Offset = Opts.StackProtectorGuardOffset;
1331     Val.getAsInteger(10, Offset);
1332     Opts.StackProtectorGuardOffset = Offset;
1333   }
1334 
1335   Opts.StackProtectorGuardReg =
1336       std::string(Args.getLastArgValue(OPT_mstack_protector_guard_reg_EQ,
1337                                        "none"));
1338 
1339   Opts.StackRealignment = Args.hasArg(OPT_mstackrealign);
1340   if (Arg *A = Args.getLastArg(OPT_mstack_alignment)) {
1341     StringRef Val = A->getValue();
1342     unsigned StackAlignment = Opts.StackAlignment;
1343     Val.getAsInteger(10, StackAlignment);
1344     Opts.StackAlignment = StackAlignment;
1345   }
1346 
1347   if (Arg *A = Args.getLastArg(OPT_mstack_probe_size)) {
1348     StringRef Val = A->getValue();
1349     unsigned StackProbeSize = Opts.StackProbeSize;
1350     Val.getAsInteger(0, StackProbeSize);
1351     Opts.StackProbeSize = StackProbeSize;
1352   }
1353 
1354   Opts.NoStackArgProbe = Args.hasArg(OPT_mno_stack_arg_probe);
1355 
1356   Opts.StackClashProtector = Args.hasArg(OPT_fstack_clash_protection);
1357 
1358   if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) {
1359     StringRef Name = A->getValue();
1360     unsigned Method = llvm::StringSwitch<unsigned>(Name)
1361       .Case("legacy", CodeGenOptions::Legacy)
1362       .Case("non-legacy", CodeGenOptions::NonLegacy)
1363       .Case("mixed", CodeGenOptions::Mixed)
1364       .Default(~0U);
1365     if (Method == ~0U) {
1366       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
1367       Success = false;
1368     } else {
1369       Opts.setObjCDispatchMethod(
1370         static_cast<CodeGenOptions::ObjCDispatchMethodKind>(Method));
1371     }
1372   }
1373 
1374 
1375   if (Args.hasArg(OPT_fno_objc_convert_messages_to_runtime_calls))
1376     Opts.ObjCConvertMessagesToRuntimeCalls = 0;
1377 
1378   if (Args.getLastArg(OPT_femulated_tls) ||
1379       Args.getLastArg(OPT_fno_emulated_tls)) {
1380     Opts.ExplicitEmulatedTLS = true;
1381     Opts.EmulatedTLS =
1382         Args.hasFlag(OPT_femulated_tls, OPT_fno_emulated_tls, false);
1383   }
1384 
1385   if (Arg *A = Args.getLastArg(OPT_ftlsmodel_EQ)) {
1386     StringRef Name = A->getValue();
1387     unsigned Model = llvm::StringSwitch<unsigned>(Name)
1388         .Case("global-dynamic", CodeGenOptions::GeneralDynamicTLSModel)
1389         .Case("local-dynamic", CodeGenOptions::LocalDynamicTLSModel)
1390         .Case("initial-exec", CodeGenOptions::InitialExecTLSModel)
1391         .Case("local-exec", CodeGenOptions::LocalExecTLSModel)
1392         .Default(~0U);
1393     if (Model == ~0U) {
1394       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
1395       Success = false;
1396     } else {
1397       Opts.setDefaultTLSModel(static_cast<CodeGenOptions::TLSModel>(Model));
1398     }
1399   }
1400 
1401   Opts.TLSSize = getLastArgIntValue(Args, OPT_mtls_size_EQ, 0, Diags);
1402 
1403   if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_EQ)) {
1404     StringRef Val = A->getValue();
1405     Opts.FPDenormalMode = llvm::parseDenormalFPAttribute(Val);
1406     if (!Opts.FPDenormalMode.isValid())
1407       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
1408   }
1409 
1410   if (Arg *A = Args.getLastArg(OPT_fdenormal_fp_math_f32_EQ)) {
1411     StringRef Val = A->getValue();
1412     Opts.FP32DenormalMode = llvm::parseDenormalFPAttribute(Val);
1413     if (!Opts.FP32DenormalMode.isValid())
1414       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
1415   }
1416 
1417   // X86_32 has -fppc-struct-return and -freg-struct-return.
1418   // PPC32 has -maix-struct-return and -msvr4-struct-return.
1419   if (Arg *A =
1420           Args.getLastArg(OPT_fpcc_struct_return, OPT_freg_struct_return,
1421                           OPT_maix_struct_return, OPT_msvr4_struct_return)) {
1422     // TODO: We might want to consider enabling these options on AIX in the
1423     // future.
1424     if (T.isOSAIX())
1425       Diags.Report(diag::err_drv_unsupported_opt_for_target)
1426           << A->getSpelling() << T.str();
1427 
1428     const Option &O = A->getOption();
1429     if (O.matches(OPT_fpcc_struct_return) ||
1430         O.matches(OPT_maix_struct_return)) {
1431       Opts.setStructReturnConvention(CodeGenOptions::SRCK_OnStack);
1432     } else {
1433       assert(O.matches(OPT_freg_struct_return) ||
1434              O.matches(OPT_msvr4_struct_return));
1435       Opts.setStructReturnConvention(CodeGenOptions::SRCK_InRegs);
1436     }
1437   }
1438 
1439   if (T.isOSAIX() && (Args.hasArg(OPT_mignore_xcoff_visibility) ||
1440                       !Args.hasArg(OPT_fvisibility)))
1441     Opts.IgnoreXCOFFVisibility = 1;
1442 
1443   Opts.DependentLibraries = Args.getAllArgValues(OPT_dependent_lib);
1444   Opts.LinkerOptions = Args.getAllArgValues(OPT_linker_option);
1445   bool NeedLocTracking = false;
1446 
1447   Opts.OptRecordFile = std::string(Args.getLastArgValue(OPT_opt_record_file));
1448   if (!Opts.OptRecordFile.empty())
1449     NeedLocTracking = true;
1450 
1451   if (Arg *A = Args.getLastArg(OPT_opt_record_passes)) {
1452     Opts.OptRecordPasses = A->getValue();
1453     NeedLocTracking = true;
1454   }
1455 
1456   if (Arg *A = Args.getLastArg(OPT_opt_record_format)) {
1457     Opts.OptRecordFormat = A->getValue();
1458     NeedLocTracking = true;
1459   }
1460 
1461   if (Arg *A = Args.getLastArg(OPT_Rpass_EQ)) {
1462     Opts.OptimizationRemarkPattern =
1463         GenerateOptimizationRemarkRegex(Diags, Args, A);
1464     NeedLocTracking = true;
1465   }
1466 
1467   if (Arg *A = Args.getLastArg(OPT_Rpass_missed_EQ)) {
1468     Opts.OptimizationRemarkMissedPattern =
1469         GenerateOptimizationRemarkRegex(Diags, Args, A);
1470     NeedLocTracking = true;
1471   }
1472 
1473   if (Arg *A = Args.getLastArg(OPT_Rpass_analysis_EQ)) {
1474     Opts.OptimizationRemarkAnalysisPattern =
1475         GenerateOptimizationRemarkRegex(Diags, Args, A);
1476     NeedLocTracking = true;
1477   }
1478 
1479   Opts.DiagnosticsWithHotness =
1480       Args.hasArg(options::OPT_fdiagnostics_show_hotness);
1481   bool UsingSampleProfile = !Opts.SampleProfileFile.empty();
1482   bool UsingProfile = UsingSampleProfile ||
1483       (Opts.getProfileUse() != CodeGenOptions::ProfileNone);
1484 
1485   if (Opts.DiagnosticsWithHotness && !UsingProfile &&
1486       // An IR file will contain PGO as metadata
1487       IK.getLanguage() != Language::LLVM_IR)
1488     Diags.Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
1489         << "-fdiagnostics-show-hotness";
1490 
1491   Opts.DiagnosticsHotnessThreshold = getLastArgUInt64Value(
1492       Args, options::OPT_fdiagnostics_hotness_threshold_EQ, 0);
1493   if (Opts.DiagnosticsHotnessThreshold > 0 && !UsingProfile)
1494     Diags.Report(diag::warn_drv_diagnostics_hotness_requires_pgo)
1495         << "-fdiagnostics-hotness-threshold=";
1496 
1497   // If the user requested to use a sample profile for PGO, then the
1498   // backend will need to track source location information so the profile
1499   // can be incorporated into the IR.
1500   if (UsingSampleProfile)
1501     NeedLocTracking = true;
1502 
1503   // If the user requested a flag that requires source locations available in
1504   // the backend, make sure that the backend tracks source location information.
1505   if (NeedLocTracking && Opts.getDebugInfo() == codegenoptions::NoDebugInfo)
1506     Opts.setDebugInfo(codegenoptions::LocTrackingOnly);
1507 
1508   Opts.RewriteMapFiles = Args.getAllArgValues(OPT_frewrite_map_file);
1509 
1510   // Parse -fsanitize-recover= arguments.
1511   // FIXME: Report unrecoverable sanitizers incorrectly specified here.
1512   parseSanitizerKinds("-fsanitize-recover=",
1513                       Args.getAllArgValues(OPT_fsanitize_recover_EQ), Diags,
1514                       Opts.SanitizeRecover);
1515   parseSanitizerKinds("-fsanitize-trap=",
1516                       Args.getAllArgValues(OPT_fsanitize_trap_EQ), Diags,
1517                       Opts.SanitizeTrap);
1518 
1519   Opts.CudaGpuBinaryFileName =
1520       std::string(Args.getLastArgValue(OPT_fcuda_include_gpubinary));
1521 
1522   Opts.Backchain = Args.hasArg(OPT_mbackchain);
1523 
1524   Opts.EmitCheckPathComponentsToStrip = getLastArgIntValue(
1525       Args, OPT_fsanitize_undefined_strip_path_components_EQ, 0, Diags);
1526 
1527   Opts.EmitVersionIdentMetadata = Args.hasFlag(OPT_Qy, OPT_Qn, true);
1528 
1529   Opts.Addrsig = Args.hasArg(OPT_faddrsig);
1530 
1531   Opts.KeepStaticConsts = Args.hasArg(OPT_fkeep_static_consts);
1532 
1533   Opts.SpeculativeLoadHardening = Args.hasArg(OPT_mspeculative_load_hardening);
1534 
1535   Opts.DefaultFunctionAttrs = Args.getAllArgValues(OPT_default_function_attr);
1536 
1537   Opts.PassPlugins = Args.getAllArgValues(OPT_fpass_plugin_EQ);
1538 
1539   Opts.SymbolPartition =
1540       std::string(Args.getLastArgValue(OPT_fsymbol_partition_EQ));
1541 
1542   Opts.ForceAAPCSBitfieldLoad = Args.hasArg(OPT_ForceAAPCSBitfieldLoad);
1543   Opts.AAPCSBitfieldWidth =
1544       Args.hasFlag(OPT_AAPCSBitfieldWidth, OPT_ForceNoAAPCSBitfieldWidth, true);
1545 
1546   Opts.PassByValueIsNoAlias = Args.hasArg(OPT_fpass_by_value_is_noalias);
1547 
1548   return Success;
1549 }
1550 
1551 static void ParseDependencyOutputArgs(DependencyOutputOptions &Opts,
1552                                       ArgList &Args) {
1553   Opts.OutputFile = std::string(Args.getLastArgValue(OPT_dependency_file));
1554   Opts.Targets = Args.getAllArgValues(OPT_MT);
1555   Opts.IncludeSystemHeaders = Args.hasArg(OPT_sys_header_deps);
1556   Opts.IncludeModuleFiles = Args.hasArg(OPT_module_file_deps);
1557   Opts.UsePhonyTargets = Args.hasArg(OPT_MP);
1558   Opts.ShowHeaderIncludes = Args.hasArg(OPT_H);
1559   Opts.HeaderIncludeOutputFile =
1560       std::string(Args.getLastArgValue(OPT_header_include_file));
1561   Opts.AddMissingHeaderDeps = Args.hasArg(OPT_MG);
1562   if (Args.hasArg(OPT_show_includes)) {
1563     // Writing both /showIncludes and preprocessor output to stdout
1564     // would produce interleaved output, so use stderr for /showIncludes.
1565     // This behaves the same as cl.exe, when /E, /EP or /P are passed.
1566     if (Args.hasArg(options::OPT_E) || Args.hasArg(options::OPT_P))
1567       Opts.ShowIncludesDest = ShowIncludesDestination::Stderr;
1568     else
1569       Opts.ShowIncludesDest = ShowIncludesDestination::Stdout;
1570   } else {
1571     Opts.ShowIncludesDest = ShowIncludesDestination::None;
1572   }
1573   Opts.DOTOutputFile = std::string(Args.getLastArgValue(OPT_dependency_dot));
1574   Opts.ModuleDependencyOutputDir =
1575       std::string(Args.getLastArgValue(OPT_module_dependency_dir));
1576   if (Args.hasArg(OPT_MV))
1577     Opts.OutputFormat = DependencyOutputFormat::NMake;
1578   // Add sanitizer blacklists as extra dependencies.
1579   // They won't be discovered by the regular preprocessor, so
1580   // we let make / ninja to know about this implicit dependency.
1581   if (!Args.hasArg(OPT_fno_sanitize_blacklist)) {
1582     for (const auto *A : Args.filtered(OPT_fsanitize_blacklist)) {
1583       StringRef Val = A->getValue();
1584       if (Val.find('=') == StringRef::npos)
1585         Opts.ExtraDeps.push_back(std::string(Val));
1586     }
1587     if (Opts.IncludeSystemHeaders) {
1588       for (const auto *A : Args.filtered(OPT_fsanitize_system_blacklist)) {
1589         StringRef Val = A->getValue();
1590         if (Val.find('=') == StringRef::npos)
1591           Opts.ExtraDeps.push_back(std::string(Val));
1592       }
1593     }
1594   }
1595 
1596   // Propagate the extra dependencies.
1597   for (const auto *A : Args.filtered(OPT_fdepfile_entry)) {
1598     Opts.ExtraDeps.push_back(A->getValue());
1599   }
1600 
1601   // Only the -fmodule-file=<file> form.
1602   for (const auto *A : Args.filtered(OPT_fmodule_file)) {
1603     StringRef Val = A->getValue();
1604     if (Val.find('=') == StringRef::npos)
1605       Opts.ExtraDeps.push_back(std::string(Val));
1606   }
1607 }
1608 
1609 static bool parseShowColorsArgs(const ArgList &Args, bool DefaultColor) {
1610   // Color diagnostics default to auto ("on" if terminal supports) in the driver
1611   // but default to off in cc1, needing an explicit OPT_fdiagnostics_color.
1612   // Support both clang's -f[no-]color-diagnostics and gcc's
1613   // -f[no-]diagnostics-colors[=never|always|auto].
1614   enum {
1615     Colors_On,
1616     Colors_Off,
1617     Colors_Auto
1618   } ShowColors = DefaultColor ? Colors_Auto : Colors_Off;
1619   for (auto *A : Args) {
1620     const Option &O = A->getOption();
1621     if (O.matches(options::OPT_fcolor_diagnostics) ||
1622         O.matches(options::OPT_fdiagnostics_color)) {
1623       ShowColors = Colors_On;
1624     } else if (O.matches(options::OPT_fno_color_diagnostics) ||
1625                O.matches(options::OPT_fno_diagnostics_color)) {
1626       ShowColors = Colors_Off;
1627     } else if (O.matches(options::OPT_fdiagnostics_color_EQ)) {
1628       StringRef Value(A->getValue());
1629       if (Value == "always")
1630         ShowColors = Colors_On;
1631       else if (Value == "never")
1632         ShowColors = Colors_Off;
1633       else if (Value == "auto")
1634         ShowColors = Colors_Auto;
1635     }
1636   }
1637   return ShowColors == Colors_On ||
1638          (ShowColors == Colors_Auto &&
1639           llvm::sys::Process::StandardErrHasColors());
1640 }
1641 
1642 static bool checkVerifyPrefixes(const std::vector<std::string> &VerifyPrefixes,
1643                                 DiagnosticsEngine *Diags) {
1644   bool Success = true;
1645   for (const auto &Prefix : VerifyPrefixes) {
1646     // Every prefix must start with a letter and contain only alphanumeric
1647     // characters, hyphens, and underscores.
1648     auto BadChar = llvm::find_if(Prefix, [](char C) {
1649       return !isAlphanumeric(C) && C != '-' && C != '_';
1650     });
1651     if (BadChar != Prefix.end() || !isLetter(Prefix[0])) {
1652       Success = false;
1653       if (Diags) {
1654         Diags->Report(diag::err_drv_invalid_value) << "-verify=" << Prefix;
1655         Diags->Report(diag::note_drv_verify_prefix_spelling);
1656       }
1657     }
1658   }
1659   return Success;
1660 }
1661 
1662 bool clang::ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
1663                                 DiagnosticsEngine *Diags,
1664                                 bool DefaultDiagColor) {
1665   bool Success = true;
1666 
1667   Opts.DiagnosticLogFile =
1668       std::string(Args.getLastArgValue(OPT_diagnostic_log_file));
1669   if (Arg *A =
1670           Args.getLastArg(OPT_diagnostic_serialized_file, OPT__serialize_diags))
1671     Opts.DiagnosticSerializationFile = A->getValue();
1672   Opts.IgnoreWarnings = Args.hasArg(OPT_w);
1673   Opts.NoRewriteMacros = Args.hasArg(OPT_Wno_rewrite_macros);
1674   Opts.Pedantic = Args.hasArg(OPT_pedantic);
1675   Opts.PedanticErrors = Args.hasArg(OPT_pedantic_errors);
1676   Opts.ShowCarets = !Args.hasArg(OPT_fno_caret_diagnostics);
1677   Opts.ShowColors = parseShowColorsArgs(Args, DefaultDiagColor);
1678   Opts.ShowColumn = !Args.hasArg(OPT_fno_show_column);
1679   Opts.ShowFixits = !Args.hasArg(OPT_fno_diagnostics_fixit_info);
1680   Opts.ShowLocation = !Args.hasArg(OPT_fno_show_source_location);
1681   Opts.AbsolutePath = Args.hasArg(OPT_fdiagnostics_absolute_paths);
1682   Opts.ShowOptionNames = !Args.hasArg(OPT_fno_diagnostics_show_option);
1683 
1684   // Default behavior is to not to show note include stacks.
1685   Opts.ShowNoteIncludeStack = false;
1686   if (Arg *A = Args.getLastArg(OPT_fdiagnostics_show_note_include_stack,
1687                                OPT_fno_diagnostics_show_note_include_stack))
1688     if (A->getOption().matches(OPT_fdiagnostics_show_note_include_stack))
1689       Opts.ShowNoteIncludeStack = true;
1690 
1691   StringRef ShowOverloads =
1692     Args.getLastArgValue(OPT_fshow_overloads_EQ, "all");
1693   if (ShowOverloads == "best")
1694     Opts.setShowOverloads(Ovl_Best);
1695   else if (ShowOverloads == "all")
1696     Opts.setShowOverloads(Ovl_All);
1697   else {
1698     Success = false;
1699     if (Diags)
1700       Diags->Report(diag::err_drv_invalid_value)
1701       << Args.getLastArg(OPT_fshow_overloads_EQ)->getAsString(Args)
1702       << ShowOverloads;
1703   }
1704 
1705   StringRef ShowCategory =
1706     Args.getLastArgValue(OPT_fdiagnostics_show_category, "none");
1707   if (ShowCategory == "none")
1708     Opts.ShowCategories = 0;
1709   else if (ShowCategory == "id")
1710     Opts.ShowCategories = 1;
1711   else if (ShowCategory == "name")
1712     Opts.ShowCategories = 2;
1713   else {
1714     Success = false;
1715     if (Diags)
1716       Diags->Report(diag::err_drv_invalid_value)
1717       << Args.getLastArg(OPT_fdiagnostics_show_category)->getAsString(Args)
1718       << ShowCategory;
1719   }
1720 
1721   StringRef Format =
1722     Args.getLastArgValue(OPT_fdiagnostics_format, "clang");
1723   if (Format == "clang")
1724     Opts.setFormat(DiagnosticOptions::Clang);
1725   else if (Format == "msvc")
1726     Opts.setFormat(DiagnosticOptions::MSVC);
1727   else if (Format == "msvc-fallback") {
1728     Opts.setFormat(DiagnosticOptions::MSVC);
1729     Opts.CLFallbackMode = true;
1730   } else if (Format == "vi")
1731     Opts.setFormat(DiagnosticOptions::Vi);
1732   else {
1733     Success = false;
1734     if (Diags)
1735       Diags->Report(diag::err_drv_invalid_value)
1736       << Args.getLastArg(OPT_fdiagnostics_format)->getAsString(Args)
1737       << Format;
1738   }
1739 
1740   Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info);
1741   Opts.ShowParseableFixits = Args.hasArg(OPT_fdiagnostics_parseable_fixits);
1742   Opts.ShowPresumedLoc = !Args.hasArg(OPT_fno_diagnostics_use_presumed_location);
1743   Opts.VerifyDiagnostics = Args.hasArg(OPT_verify) || Args.hasArg(OPT_verify_EQ);
1744   Opts.VerifyPrefixes = Args.getAllArgValues(OPT_verify_EQ);
1745   if (Args.hasArg(OPT_verify))
1746     Opts.VerifyPrefixes.push_back("expected");
1747   // Keep VerifyPrefixes in its original order for the sake of diagnostics, and
1748   // then sort it to prepare for fast lookup using std::binary_search.
1749   if (!checkVerifyPrefixes(Opts.VerifyPrefixes, Diags)) {
1750     Opts.VerifyDiagnostics = false;
1751     Success = false;
1752   }
1753   else
1754     llvm::sort(Opts.VerifyPrefixes);
1755   DiagnosticLevelMask DiagMask = DiagnosticLevelMask::None;
1756   Success &= parseDiagnosticLevelMask("-verify-ignore-unexpected=",
1757     Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ),
1758     Diags, DiagMask);
1759   if (Args.hasArg(OPT_verify_ignore_unexpected))
1760     DiagMask = DiagnosticLevelMask::All;
1761   Opts.setVerifyIgnoreUnexpected(DiagMask);
1762   Opts.ElideType = !Args.hasArg(OPT_fno_elide_type);
1763   Opts.ShowTemplateTree = Args.hasArg(OPT_fdiagnostics_show_template_tree);
1764   Opts.ErrorLimit = getLastArgIntValue(Args, OPT_ferror_limit, 0, Diags);
1765   Opts.MacroBacktraceLimit =
1766       getLastArgIntValue(Args, OPT_fmacro_backtrace_limit,
1767                          DiagnosticOptions::DefaultMacroBacktraceLimit, Diags);
1768   Opts.TemplateBacktraceLimit = getLastArgIntValue(
1769       Args, OPT_ftemplate_backtrace_limit,
1770       DiagnosticOptions::DefaultTemplateBacktraceLimit, Diags);
1771   Opts.ConstexprBacktraceLimit = getLastArgIntValue(
1772       Args, OPT_fconstexpr_backtrace_limit,
1773       DiagnosticOptions::DefaultConstexprBacktraceLimit, Diags);
1774   Opts.SpellCheckingLimit = getLastArgIntValue(
1775       Args, OPT_fspell_checking_limit,
1776       DiagnosticOptions::DefaultSpellCheckingLimit, Diags);
1777   Opts.SnippetLineLimit = getLastArgIntValue(
1778       Args, OPT_fcaret_diagnostics_max_lines,
1779       DiagnosticOptions::DefaultSnippetLineLimit, Diags);
1780   Opts.TabStop = getLastArgIntValue(Args, OPT_ftabstop,
1781                                     DiagnosticOptions::DefaultTabStop, Diags);
1782   if (Opts.TabStop == 0 || Opts.TabStop > DiagnosticOptions::MaxTabStop) {
1783     Opts.TabStop = DiagnosticOptions::DefaultTabStop;
1784     if (Diags)
1785       Diags->Report(diag::warn_ignoring_ftabstop_value)
1786       << Opts.TabStop << DiagnosticOptions::DefaultTabStop;
1787   }
1788   Opts.MessageLength =
1789       getLastArgIntValue(Args, OPT_fmessage_length_EQ, 0, Diags);
1790 
1791   Opts.UndefPrefixes = Args.getAllArgValues(OPT_Wundef_prefix_EQ);
1792 
1793   addDiagnosticArgs(Args, OPT_W_Group, OPT_W_value_Group, Opts.Warnings);
1794   addDiagnosticArgs(Args, OPT_R_Group, OPT_R_value_Group, Opts.Remarks);
1795 
1796   return Success;
1797 }
1798 
1799 static void ParseFileSystemArgs(FileSystemOptions &Opts, ArgList &Args) {
1800   Opts.WorkingDir = std::string(Args.getLastArgValue(OPT_working_directory));
1801 }
1802 
1803 /// Parse the argument to the -ftest-module-file-extension
1804 /// command-line argument.
1805 ///
1806 /// \returns true on error, false on success.
1807 static bool parseTestModuleFileExtensionArg(StringRef Arg,
1808                                             std::string &BlockName,
1809                                             unsigned &MajorVersion,
1810                                             unsigned &MinorVersion,
1811                                             bool &Hashed,
1812                                             std::string &UserInfo) {
1813   SmallVector<StringRef, 5> Args;
1814   Arg.split(Args, ':', 5);
1815   if (Args.size() < 5)
1816     return true;
1817 
1818   BlockName = std::string(Args[0]);
1819   if (Args[1].getAsInteger(10, MajorVersion)) return true;
1820   if (Args[2].getAsInteger(10, MinorVersion)) return true;
1821   if (Args[3].getAsInteger(2, Hashed)) return true;
1822   if (Args.size() > 4)
1823     UserInfo = std::string(Args[4]);
1824   return false;
1825 }
1826 
1827 static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
1828                                    DiagnosticsEngine &Diags,
1829                                    bool &IsHeaderFile) {
1830   Opts.ProgramAction = frontend::ParseSyntaxOnly;
1831   if (const Arg *A = Args.getLastArg(OPT_Action_Group)) {
1832     switch (A->getOption().getID()) {
1833     default:
1834       llvm_unreachable("Invalid option in group!");
1835     case OPT_ast_list:
1836       Opts.ProgramAction = frontend::ASTDeclList; break;
1837     case OPT_ast_dump_all_EQ:
1838     case OPT_ast_dump_EQ: {
1839       unsigned Val = llvm::StringSwitch<unsigned>(A->getValue())
1840                          .CaseLower("default", ADOF_Default)
1841                          .CaseLower("json", ADOF_JSON)
1842                          .Default(std::numeric_limits<unsigned>::max());
1843 
1844       if (Val != std::numeric_limits<unsigned>::max())
1845         Opts.ASTDumpFormat = static_cast<ASTDumpOutputFormat>(Val);
1846       else {
1847         Diags.Report(diag::err_drv_invalid_value)
1848             << A->getAsString(Args) << A->getValue();
1849         Opts.ASTDumpFormat = ADOF_Default;
1850       }
1851       LLVM_FALLTHROUGH;
1852     }
1853     case OPT_ast_dump:
1854     case OPT_ast_dump_all:
1855     case OPT_ast_dump_lookups:
1856     case OPT_ast_dump_decl_types:
1857       Opts.ProgramAction = frontend::ASTDump; break;
1858     case OPT_ast_print:
1859       Opts.ProgramAction = frontend::ASTPrint; break;
1860     case OPT_ast_view:
1861       Opts.ProgramAction = frontend::ASTView; break;
1862     case OPT_compiler_options_dump:
1863       Opts.ProgramAction = frontend::DumpCompilerOptions; break;
1864     case OPT_dump_raw_tokens:
1865       Opts.ProgramAction = frontend::DumpRawTokens; break;
1866     case OPT_dump_tokens:
1867       Opts.ProgramAction = frontend::DumpTokens; break;
1868     case OPT_S:
1869       Opts.ProgramAction = frontend::EmitAssembly; break;
1870     case OPT_emit_llvm_bc:
1871       Opts.ProgramAction = frontend::EmitBC; break;
1872     case OPT_emit_html:
1873       Opts.ProgramAction = frontend::EmitHTML; break;
1874     case OPT_emit_llvm:
1875       Opts.ProgramAction = frontend::EmitLLVM; break;
1876     case OPT_emit_llvm_only:
1877       Opts.ProgramAction = frontend::EmitLLVMOnly; break;
1878     case OPT_emit_codegen_only:
1879       Opts.ProgramAction = frontend::EmitCodeGenOnly; break;
1880     case OPT_emit_obj:
1881       Opts.ProgramAction = frontend::EmitObj; break;
1882     case OPT_fixit_EQ:
1883       Opts.FixItSuffix = A->getValue();
1884       LLVM_FALLTHROUGH;
1885     case OPT_fixit:
1886       Opts.ProgramAction = frontend::FixIt; break;
1887     case OPT_emit_module:
1888       Opts.ProgramAction = frontend::GenerateModule; break;
1889     case OPT_emit_module_interface:
1890       Opts.ProgramAction = frontend::GenerateModuleInterface; break;
1891     case OPT_emit_header_module:
1892       Opts.ProgramAction = frontend::GenerateHeaderModule; break;
1893     case OPT_emit_pch:
1894       Opts.ProgramAction = frontend::GeneratePCH; break;
1895     case OPT_emit_interface_stubs: {
1896       StringRef ArgStr =
1897           Args.hasArg(OPT_interface_stub_version_EQ)
1898               ? Args.getLastArgValue(OPT_interface_stub_version_EQ)
1899               : "experimental-ifs-v2";
1900       if (ArgStr == "experimental-yaml-elf-v1" ||
1901           ArgStr == "experimental-ifs-v1" ||
1902           ArgStr == "experimental-tapi-elf-v1") {
1903         std::string ErrorMessage =
1904             "Invalid interface stub format: " + ArgStr.str() +
1905             " is deprecated.";
1906         Diags.Report(diag::err_drv_invalid_value)
1907             << "Must specify a valid interface stub format type, ie: "
1908                "-interface-stub-version=experimental-ifs-v2"
1909             << ErrorMessage;
1910       } else if (!ArgStr.startswith("experimental-ifs-")) {
1911         std::string ErrorMessage =
1912             "Invalid interface stub format: " + ArgStr.str() + ".";
1913         Diags.Report(diag::err_drv_invalid_value)
1914             << "Must specify a valid interface stub format type, ie: "
1915                "-interface-stub-version=experimental-ifs-v2"
1916             << ErrorMessage;
1917       } else {
1918         Opts.ProgramAction = frontend::GenerateInterfaceStubs;
1919       }
1920       break;
1921     }
1922     case OPT_init_only:
1923       Opts.ProgramAction = frontend::InitOnly; break;
1924     case OPT_fsyntax_only:
1925       Opts.ProgramAction = frontend::ParseSyntaxOnly; break;
1926     case OPT_module_file_info:
1927       Opts.ProgramAction = frontend::ModuleFileInfo; break;
1928     case OPT_verify_pch:
1929       Opts.ProgramAction = frontend::VerifyPCH; break;
1930     case OPT_print_preamble:
1931       Opts.ProgramAction = frontend::PrintPreamble; break;
1932     case OPT_E:
1933       Opts.ProgramAction = frontend::PrintPreprocessedInput; break;
1934     case OPT_templight_dump:
1935       Opts.ProgramAction = frontend::TemplightDump; break;
1936     case OPT_rewrite_macros:
1937       Opts.ProgramAction = frontend::RewriteMacros; break;
1938     case OPT_rewrite_objc:
1939       Opts.ProgramAction = frontend::RewriteObjC; break;
1940     case OPT_rewrite_test:
1941       Opts.ProgramAction = frontend::RewriteTest; break;
1942     case OPT_analyze:
1943       Opts.ProgramAction = frontend::RunAnalysis; break;
1944     case OPT_migrate:
1945       Opts.ProgramAction = frontend::MigrateSource; break;
1946     case OPT_Eonly:
1947       Opts.ProgramAction = frontend::RunPreprocessorOnly; break;
1948     case OPT_print_dependency_directives_minimized_source:
1949       Opts.ProgramAction =
1950           frontend::PrintDependencyDirectivesSourceMinimizerOutput;
1951       break;
1952     }
1953   }
1954 
1955   if (const Arg* A = Args.getLastArg(OPT_plugin)) {
1956     Opts.Plugins.emplace_back(A->getValue(0));
1957     Opts.ProgramAction = frontend::PluginAction;
1958     Opts.ActionName = A->getValue();
1959   }
1960   Opts.AddPluginActions = Args.getAllArgValues(OPT_add_plugin);
1961   for (const auto *AA : Args.filtered(OPT_plugin_arg))
1962     Opts.PluginArgs[AA->getValue(0)].emplace_back(AA->getValue(1));
1963 
1964   for (const std::string &Arg :
1965          Args.getAllArgValues(OPT_ftest_module_file_extension_EQ)) {
1966     std::string BlockName;
1967     unsigned MajorVersion;
1968     unsigned MinorVersion;
1969     bool Hashed;
1970     std::string UserInfo;
1971     if (parseTestModuleFileExtensionArg(Arg, BlockName, MajorVersion,
1972                                         MinorVersion, Hashed, UserInfo)) {
1973       Diags.Report(diag::err_test_module_file_extension_format) << Arg;
1974 
1975       continue;
1976     }
1977 
1978     // Add the testing module file extension.
1979     Opts.ModuleFileExtensions.push_back(
1980         std::make_shared<TestModuleFileExtension>(
1981             BlockName, MajorVersion, MinorVersion, Hashed, UserInfo));
1982   }
1983 
1984   if (const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
1985     Opts.CodeCompletionAt =
1986       ParsedSourceLocation::FromString(A->getValue());
1987     if (Opts.CodeCompletionAt.FileName.empty())
1988       Diags.Report(diag::err_drv_invalid_value)
1989         << A->getAsString(Args) << A->getValue();
1990   }
1991   Opts.DisableFree = Args.hasArg(OPT_disable_free);
1992 
1993   Opts.OutputFile = std::string(Args.getLastArgValue(OPT_o));
1994   Opts.Plugins = Args.getAllArgValues(OPT_load);
1995   Opts.RelocatablePCH = Args.hasArg(OPT_relocatable_pch);
1996   Opts.ShowHelp = Args.hasArg(OPT_help);
1997   Opts.ShowStats = Args.hasArg(OPT_print_stats);
1998   Opts.ShowTimers = Args.hasArg(OPT_ftime_report);
1999   Opts.PrintSupportedCPUs = Args.hasArg(OPT_print_supported_cpus);
2000   Opts.TimeTrace = Args.hasArg(OPT_ftime_trace);
2001   Opts.TimeTraceGranularity = getLastArgIntValue(
2002       Args, OPT_ftime_trace_granularity_EQ, Opts.TimeTraceGranularity, Diags);
2003   Opts.ShowVersion = Args.hasArg(OPT_version);
2004   Opts.ASTMergeFiles = Args.getAllArgValues(OPT_ast_merge);
2005   Opts.LLVMArgs = Args.getAllArgValues(OPT_mllvm);
2006   Opts.FixWhatYouCan = Args.hasArg(OPT_fix_what_you_can);
2007   Opts.FixOnlyWarnings = Args.hasArg(OPT_fix_only_warnings);
2008   Opts.FixAndRecompile = Args.hasArg(OPT_fixit_recompile);
2009   Opts.FixToTemporaries = Args.hasArg(OPT_fixit_to_temp);
2010   Opts.ASTDumpDecls = Args.hasArg(OPT_ast_dump, OPT_ast_dump_EQ);
2011   Opts.ASTDumpAll = Args.hasArg(OPT_ast_dump_all, OPT_ast_dump_all_EQ);
2012   Opts.ASTDumpFilter = std::string(Args.getLastArgValue(OPT_ast_dump_filter));
2013   Opts.ASTDumpLookups = Args.hasArg(OPT_ast_dump_lookups);
2014   Opts.ASTDumpDeclTypes = Args.hasArg(OPT_ast_dump_decl_types);
2015   Opts.UseGlobalModuleIndex = !Args.hasArg(OPT_fno_modules_global_index);
2016   Opts.GenerateGlobalModuleIndex = Opts.UseGlobalModuleIndex;
2017   Opts.ModuleMapFiles = Args.getAllArgValues(OPT_fmodule_map_file);
2018   // Only the -fmodule-file=<file> form.
2019   for (const auto *A : Args.filtered(OPT_fmodule_file)) {
2020     StringRef Val = A->getValue();
2021     if (Val.find('=') == StringRef::npos)
2022       Opts.ModuleFiles.push_back(std::string(Val));
2023   }
2024   Opts.ModulesEmbedFiles = Args.getAllArgValues(OPT_fmodules_embed_file_EQ);
2025   Opts.ModulesEmbedAllFiles = Args.hasArg(OPT_fmodules_embed_all_files);
2026   Opts.IncludeTimestamps = !Args.hasArg(OPT_fno_pch_timestamp);
2027   Opts.UseTemporary = !Args.hasArg(OPT_fno_temp_file);
2028   Opts.IsSystemModule = Args.hasArg(OPT_fsystem_module);
2029   Opts.AllowPCMWithCompilerErrors = Args.hasArg(OPT_fallow_pcm_with_errors);
2030 
2031   if (Opts.ProgramAction != frontend::GenerateModule && Opts.IsSystemModule)
2032     Diags.Report(diag::err_drv_argument_only_allowed_with) << "-fsystem-module"
2033                                                            << "-emit-module";
2034 
2035   Opts.CodeCompleteOpts.IncludeMacros
2036     = Args.hasArg(OPT_code_completion_macros);
2037   Opts.CodeCompleteOpts.IncludeCodePatterns
2038     = Args.hasArg(OPT_code_completion_patterns);
2039   Opts.CodeCompleteOpts.IncludeGlobals
2040     = !Args.hasArg(OPT_no_code_completion_globals);
2041   Opts.CodeCompleteOpts.IncludeNamespaceLevelDecls
2042     = !Args.hasArg(OPT_no_code_completion_ns_level_decls);
2043   Opts.CodeCompleteOpts.IncludeBriefComments
2044     = Args.hasArg(OPT_code_completion_brief_comments);
2045   Opts.CodeCompleteOpts.IncludeFixIts
2046     = Args.hasArg(OPT_code_completion_with_fixits);
2047 
2048   Opts.OverrideRecordLayoutsFile =
2049       std::string(Args.getLastArgValue(OPT_foverride_record_layout_EQ));
2050   Opts.AuxTriple = std::string(Args.getLastArgValue(OPT_aux_triple));
2051   if (Args.hasArg(OPT_aux_target_cpu))
2052     Opts.AuxTargetCPU = std::string(Args.getLastArgValue(OPT_aux_target_cpu));
2053   if (Args.hasArg(OPT_aux_target_feature))
2054     Opts.AuxTargetFeatures = Args.getAllArgValues(OPT_aux_target_feature);
2055   Opts.StatsFile = std::string(Args.getLastArgValue(OPT_stats_file));
2056 
2057   Opts.MTMigrateDir =
2058       std::string(Args.getLastArgValue(OPT_mt_migrate_directory));
2059   Opts.ARCMTMigrateReportOut =
2060       std::string(Args.getLastArgValue(OPT_arcmt_migrate_report_output));
2061   Opts.ARCMTMigrateEmitARCErrors
2062     = Args.hasArg(OPT_arcmt_migrate_emit_arc_errors);
2063 
2064   Opts.ObjCMTWhiteListPath =
2065       std::string(Args.getLastArgValue(OPT_objcmt_whitelist_dir_path));
2066 
2067   if (Opts.ARCMTAction != FrontendOptions::ARCMT_None &&
2068       Opts.ObjCMTAction != FrontendOptions::ObjCMT_None) {
2069     Diags.Report(diag::err_drv_argument_not_allowed_with)
2070       << "ARC migration" << "ObjC migration";
2071   }
2072 
2073   InputKind DashX(Language::Unknown);
2074   if (const Arg *A = Args.getLastArg(OPT_x)) {
2075     StringRef XValue = A->getValue();
2076 
2077     // Parse suffixes: '<lang>(-header|[-module-map][-cpp-output])'.
2078     // FIXME: Supporting '<lang>-header-cpp-output' would be useful.
2079     bool Preprocessed = XValue.consume_back("-cpp-output");
2080     bool ModuleMap = XValue.consume_back("-module-map");
2081     IsHeaderFile = !Preprocessed && !ModuleMap &&
2082                    XValue != "precompiled-header" &&
2083                    XValue.consume_back("-header");
2084 
2085     // Principal languages.
2086     DashX = llvm::StringSwitch<InputKind>(XValue)
2087                 .Case("c", Language::C)
2088                 .Case("cl", Language::OpenCL)
2089                 .Case("cuda", Language::CUDA)
2090                 .Case("hip", Language::HIP)
2091                 .Case("c++", Language::CXX)
2092                 .Case("objective-c", Language::ObjC)
2093                 .Case("objective-c++", Language::ObjCXX)
2094                 .Case("renderscript", Language::RenderScript)
2095                 .Default(Language::Unknown);
2096 
2097     // "objc[++]-cpp-output" is an acceptable synonym for
2098     // "objective-c[++]-cpp-output".
2099     if (DashX.isUnknown() && Preprocessed && !IsHeaderFile && !ModuleMap)
2100       DashX = llvm::StringSwitch<InputKind>(XValue)
2101                   .Case("objc", Language::ObjC)
2102                   .Case("objc++", Language::ObjCXX)
2103                   .Default(Language::Unknown);
2104 
2105     // Some special cases cannot be combined with suffixes.
2106     if (DashX.isUnknown() && !Preprocessed && !ModuleMap && !IsHeaderFile)
2107       DashX = llvm::StringSwitch<InputKind>(XValue)
2108                   .Case("cpp-output", InputKind(Language::C).getPreprocessed())
2109                   .Case("assembler-with-cpp", Language::Asm)
2110                   .Cases("ast", "pcm", "precompiled-header",
2111                          InputKind(Language::Unknown, InputKind::Precompiled))
2112                   .Case("ir", Language::LLVM_IR)
2113                   .Default(Language::Unknown);
2114 
2115     if (DashX.isUnknown())
2116       Diags.Report(diag::err_drv_invalid_value)
2117         << A->getAsString(Args) << A->getValue();
2118 
2119     if (Preprocessed)
2120       DashX = DashX.getPreprocessed();
2121     if (ModuleMap)
2122       DashX = DashX.withFormat(InputKind::ModuleMap);
2123   }
2124 
2125   // '-' is the default input if none is given.
2126   std::vector<std::string> Inputs = Args.getAllArgValues(OPT_INPUT);
2127   Opts.Inputs.clear();
2128   if (Inputs.empty())
2129     Inputs.push_back("-");
2130   for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
2131     InputKind IK = DashX;
2132     if (IK.isUnknown()) {
2133       IK = FrontendOptions::getInputKindForExtension(
2134         StringRef(Inputs[i]).rsplit('.').second);
2135       // FIXME: Warn on this?
2136       if (IK.isUnknown())
2137         IK = Language::C;
2138       // FIXME: Remove this hack.
2139       if (i == 0)
2140         DashX = IK;
2141     }
2142 
2143     bool IsSystem = false;
2144 
2145     // The -emit-module action implicitly takes a module map.
2146     if (Opts.ProgramAction == frontend::GenerateModule &&
2147         IK.getFormat() == InputKind::Source) {
2148       IK = IK.withFormat(InputKind::ModuleMap);
2149       IsSystem = Opts.IsSystemModule;
2150     }
2151 
2152     Opts.Inputs.emplace_back(std::move(Inputs[i]), IK, IsSystem);
2153   }
2154 
2155   return DashX;
2156 }
2157 
2158 std::string CompilerInvocation::GetResourcesPath(const char *Argv0,
2159                                                  void *MainAddr) {
2160   std::string ClangExecutable =
2161       llvm::sys::fs::getMainExecutable(Argv0, MainAddr);
2162   return Driver::GetResourcesPath(ClangExecutable, CLANG_RESOURCE_DIR);
2163 }
2164 
2165 static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args,
2166                                   const std::string &WorkingDir) {
2167   Opts.Sysroot = std::string(Args.getLastArgValue(OPT_isysroot, "/"));
2168   Opts.Verbose = Args.hasArg(OPT_v);
2169   Opts.UseBuiltinIncludes = !Args.hasArg(OPT_nobuiltininc);
2170   Opts.UseStandardSystemIncludes = !Args.hasArg(OPT_nostdsysteminc);
2171   Opts.UseStandardCXXIncludes = !Args.hasArg(OPT_nostdincxx);
2172   if (const Arg *A = Args.getLastArg(OPT_stdlib_EQ))
2173     Opts.UseLibcxx = (strcmp(A->getValue(), "libc++") == 0);
2174   Opts.ResourceDir = std::string(Args.getLastArgValue(OPT_resource_dir));
2175 
2176   // Canonicalize -fmodules-cache-path before storing it.
2177   SmallString<128> P(Args.getLastArgValue(OPT_fmodules_cache_path));
2178   if (!(P.empty() || llvm::sys::path::is_absolute(P))) {
2179     if (WorkingDir.empty())
2180       llvm::sys::fs::make_absolute(P);
2181     else
2182       llvm::sys::fs::make_absolute(WorkingDir, P);
2183   }
2184   llvm::sys::path::remove_dots(P);
2185   Opts.ModuleCachePath = std::string(P.str());
2186 
2187   Opts.ModuleUserBuildPath =
2188       std::string(Args.getLastArgValue(OPT_fmodules_user_build_path));
2189   // Only the -fmodule-file=<name>=<file> form.
2190   for (const auto *A : Args.filtered(OPT_fmodule_file)) {
2191     StringRef Val = A->getValue();
2192     if (Val.find('=') != StringRef::npos){
2193       auto Split = Val.split('=');
2194       Opts.PrebuiltModuleFiles.insert(
2195           {std::string(Split.first), std::string(Split.second)});
2196     }
2197   }
2198   for (const auto *A : Args.filtered(OPT_fprebuilt_module_path))
2199     Opts.AddPrebuiltModulePath(A->getValue());
2200   Opts.DisableModuleHash = Args.hasArg(OPT_fdisable_module_hash);
2201   Opts.ModulesHashContent = Args.hasArg(OPT_fmodules_hash_content);
2202   Opts.ModulesValidateDiagnosticOptions =
2203       !Args.hasArg(OPT_fmodules_disable_diagnostic_validation);
2204   Opts.ImplicitModuleMaps = Args.hasArg(OPT_fimplicit_module_maps);
2205   Opts.ModuleMapFileHomeIsCwd = Args.hasArg(OPT_fmodule_map_file_home_is_cwd);
2206   Opts.EnablePrebuiltImplicitModules =
2207       Args.hasArg(OPT_fprebuilt_implicit_modules);
2208   Opts.ModuleCachePruneInterval =
2209       getLastArgIntValue(Args, OPT_fmodules_prune_interval, 7 * 24 * 60 * 60);
2210   Opts.ModuleCachePruneAfter =
2211       getLastArgIntValue(Args, OPT_fmodules_prune_after, 31 * 24 * 60 * 60);
2212   Opts.ModulesValidateOncePerBuildSession =
2213       Args.hasArg(OPT_fmodules_validate_once_per_build_session);
2214   Opts.BuildSessionTimestamp =
2215       getLastArgUInt64Value(Args, OPT_fbuild_session_timestamp, 0);
2216   Opts.ModulesValidateSystemHeaders =
2217       Args.hasArg(OPT_fmodules_validate_system_headers);
2218   Opts.ValidateASTInputFilesContent =
2219       Args.hasArg(OPT_fvalidate_ast_input_files_content);
2220   if (const Arg *A = Args.getLastArg(OPT_fmodule_format_EQ))
2221     Opts.ModuleFormat = A->getValue();
2222 
2223   for (const auto *A : Args.filtered(OPT_fmodules_ignore_macro)) {
2224     StringRef MacroDef = A->getValue();
2225     Opts.ModulesIgnoreMacros.insert(
2226         llvm::CachedHashString(MacroDef.split('=').first));
2227   }
2228 
2229   // Add -I..., -F..., and -index-header-map options in order.
2230   bool IsIndexHeaderMap = false;
2231   bool IsSysrootSpecified =
2232       Args.hasArg(OPT__sysroot_EQ) || Args.hasArg(OPT_isysroot);
2233   for (const auto *A : Args.filtered(OPT_I, OPT_F, OPT_index_header_map)) {
2234     if (A->getOption().matches(OPT_index_header_map)) {
2235       // -index-header-map applies to the next -I or -F.
2236       IsIndexHeaderMap = true;
2237       continue;
2238     }
2239 
2240     frontend::IncludeDirGroup Group =
2241         IsIndexHeaderMap ? frontend::IndexHeaderMap : frontend::Angled;
2242 
2243     bool IsFramework = A->getOption().matches(OPT_F);
2244     std::string Path = A->getValue();
2245 
2246     if (IsSysrootSpecified && !IsFramework && A->getValue()[0] == '=') {
2247       SmallString<32> Buffer;
2248       llvm::sys::path::append(Buffer, Opts.Sysroot,
2249                               llvm::StringRef(A->getValue()).substr(1));
2250       Path = std::string(Buffer.str());
2251     }
2252 
2253     Opts.AddPath(Path, Group, IsFramework,
2254                  /*IgnoreSysroot*/ true);
2255     IsIndexHeaderMap = false;
2256   }
2257 
2258   // Add -iprefix/-iwithprefix/-iwithprefixbefore options.
2259   StringRef Prefix = ""; // FIXME: This isn't the correct default prefix.
2260   for (const auto *A :
2261        Args.filtered(OPT_iprefix, OPT_iwithprefix, OPT_iwithprefixbefore)) {
2262     if (A->getOption().matches(OPT_iprefix))
2263       Prefix = A->getValue();
2264     else if (A->getOption().matches(OPT_iwithprefix))
2265       Opts.AddPath(Prefix.str() + A->getValue(), frontend::After, false, true);
2266     else
2267       Opts.AddPath(Prefix.str() + A->getValue(), frontend::Angled, false, true);
2268   }
2269 
2270   for (const auto *A : Args.filtered(OPT_idirafter))
2271     Opts.AddPath(A->getValue(), frontend::After, false, true);
2272   for (const auto *A : Args.filtered(OPT_iquote))
2273     Opts.AddPath(A->getValue(), frontend::Quoted, false, true);
2274   for (const auto *A : Args.filtered(OPT_isystem, OPT_iwithsysroot))
2275     Opts.AddPath(A->getValue(), frontend::System, false,
2276                  !A->getOption().matches(OPT_iwithsysroot));
2277   for (const auto *A : Args.filtered(OPT_iframework))
2278     Opts.AddPath(A->getValue(), frontend::System, true, true);
2279   for (const auto *A : Args.filtered(OPT_iframeworkwithsysroot))
2280     Opts.AddPath(A->getValue(), frontend::System, /*IsFramework=*/true,
2281                  /*IgnoreSysRoot=*/false);
2282 
2283   // Add the paths for the various language specific isystem flags.
2284   for (const auto *A : Args.filtered(OPT_c_isystem))
2285     Opts.AddPath(A->getValue(), frontend::CSystem, false, true);
2286   for (const auto *A : Args.filtered(OPT_cxx_isystem))
2287     Opts.AddPath(A->getValue(), frontend::CXXSystem, false, true);
2288   for (const auto *A : Args.filtered(OPT_objc_isystem))
2289     Opts.AddPath(A->getValue(), frontend::ObjCSystem, false,true);
2290   for (const auto *A : Args.filtered(OPT_objcxx_isystem))
2291     Opts.AddPath(A->getValue(), frontend::ObjCXXSystem, false, true);
2292 
2293   // Add the internal paths from a driver that detects standard include paths.
2294   for (const auto *A :
2295        Args.filtered(OPT_internal_isystem, OPT_internal_externc_isystem)) {
2296     frontend::IncludeDirGroup Group = frontend::System;
2297     if (A->getOption().matches(OPT_internal_externc_isystem))
2298       Group = frontend::ExternCSystem;
2299     Opts.AddPath(A->getValue(), Group, false, true);
2300   }
2301 
2302   // Add the path prefixes which are implicitly treated as being system headers.
2303   for (const auto *A :
2304        Args.filtered(OPT_system_header_prefix, OPT_no_system_header_prefix))
2305     Opts.AddSystemHeaderPrefix(
2306         A->getValue(), A->getOption().matches(OPT_system_header_prefix));
2307 
2308   for (const auto *A : Args.filtered(OPT_ivfsoverlay))
2309     Opts.AddVFSOverlayFile(A->getValue());
2310 }
2311 
2312 void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
2313                                          const llvm::Triple &T,
2314                                          PreprocessorOptions &PPOpts,
2315                                          LangStandard::Kind LangStd) {
2316   // Set some properties which depend solely on the input kind; it would be nice
2317   // to move these to the language standard, and have the driver resolve the
2318   // input kind + language standard.
2319   //
2320   // FIXME: Perhaps a better model would be for a single source file to have
2321   // multiple language standards (C / C++ std, ObjC std, OpenCL std, OpenMP std)
2322   // simultaneously active?
2323   if (IK.getLanguage() == Language::Asm) {
2324     Opts.AsmPreprocessor = 1;
2325   } else if (IK.isObjectiveC()) {
2326     Opts.ObjC = 1;
2327   }
2328 
2329   if (LangStd == LangStandard::lang_unspecified) {
2330     // Based on the base language, pick one.
2331     switch (IK.getLanguage()) {
2332     case Language::Unknown:
2333     case Language::LLVM_IR:
2334       llvm_unreachable("Invalid input kind!");
2335     case Language::OpenCL:
2336       LangStd = LangStandard::lang_opencl10;
2337       break;
2338     case Language::CUDA:
2339       LangStd = LangStandard::lang_cuda;
2340       break;
2341     case Language::Asm:
2342     case Language::C:
2343 #if defined(CLANG_DEFAULT_STD_C)
2344       LangStd = CLANG_DEFAULT_STD_C;
2345 #else
2346       // The PS4 uses C99 as the default C standard.
2347       if (T.isPS4())
2348         LangStd = LangStandard::lang_gnu99;
2349       else
2350         LangStd = LangStandard::lang_gnu17;
2351 #endif
2352       break;
2353     case Language::ObjC:
2354 #if defined(CLANG_DEFAULT_STD_C)
2355       LangStd = CLANG_DEFAULT_STD_C;
2356 #else
2357       LangStd = LangStandard::lang_gnu11;
2358 #endif
2359       break;
2360     case Language::CXX:
2361     case Language::ObjCXX:
2362 #if defined(CLANG_DEFAULT_STD_CXX)
2363       LangStd = CLANG_DEFAULT_STD_CXX;
2364 #else
2365       LangStd = LangStandard::lang_gnucxx14;
2366 #endif
2367       break;
2368     case Language::RenderScript:
2369       LangStd = LangStandard::lang_c99;
2370       break;
2371     case Language::HIP:
2372       LangStd = LangStandard::lang_hip;
2373       break;
2374     }
2375   }
2376 
2377   const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
2378   Opts.LineComment = Std.hasLineComments();
2379   Opts.C99 = Std.isC99();
2380   Opts.C11 = Std.isC11();
2381   Opts.C17 = Std.isC17();
2382   Opts.C2x = Std.isC2x();
2383   Opts.CPlusPlus = Std.isCPlusPlus();
2384   Opts.CPlusPlus11 = Std.isCPlusPlus11();
2385   Opts.CPlusPlus14 = Std.isCPlusPlus14();
2386   Opts.CPlusPlus17 = Std.isCPlusPlus17();
2387   Opts.CPlusPlus20 = Std.isCPlusPlus20();
2388   Opts.Digraphs = Std.hasDigraphs();
2389   Opts.GNUMode = Std.isGNUMode();
2390   Opts.GNUInline = !Opts.C99 && !Opts.CPlusPlus;
2391   Opts.GNUCVersion = 0;
2392   Opts.HexFloats = Std.hasHexFloats();
2393   Opts.ImplicitInt = Std.hasImplicitInt();
2394 
2395   // Set OpenCL Version.
2396   Opts.OpenCL = Std.isOpenCL();
2397   if (LangStd == LangStandard::lang_opencl10)
2398     Opts.OpenCLVersion = 100;
2399   else if (LangStd == LangStandard::lang_opencl11)
2400     Opts.OpenCLVersion = 110;
2401   else if (LangStd == LangStandard::lang_opencl12)
2402     Opts.OpenCLVersion = 120;
2403   else if (LangStd == LangStandard::lang_opencl20)
2404     Opts.OpenCLVersion = 200;
2405   else if (LangStd == LangStandard::lang_opencl30)
2406     Opts.OpenCLVersion = 300;
2407   else if (LangStd == LangStandard::lang_openclcpp)
2408     Opts.OpenCLCPlusPlusVersion = 100;
2409 
2410   // OpenCL has some additional defaults.
2411   if (Opts.OpenCL) {
2412     Opts.AltiVec = 0;
2413     Opts.ZVector = 0;
2414     Opts.setLaxVectorConversions(LangOptions::LaxVectorConversionKind::None);
2415     Opts.setDefaultFPContractMode(LangOptions::FPM_On);
2416     Opts.NativeHalfType = 1;
2417     Opts.NativeHalfArgsAndReturns = 1;
2418     Opts.OpenCLCPlusPlus = Opts.CPlusPlus;
2419 
2420     // Include default header file for OpenCL.
2421     if (Opts.IncludeDefaultHeader) {
2422       if (Opts.DeclareOpenCLBuiltins) {
2423         // Only include base header file for builtin types and constants.
2424         PPOpts.Includes.push_back("opencl-c-base.h");
2425       } else {
2426         PPOpts.Includes.push_back("opencl-c.h");
2427       }
2428     }
2429   }
2430 
2431   Opts.HIP = IK.getLanguage() == Language::HIP;
2432   Opts.CUDA = IK.getLanguage() == Language::CUDA || Opts.HIP;
2433   if (Opts.CUDA)
2434     // Set default FP_CONTRACT to FAST.
2435     Opts.setDefaultFPContractMode(LangOptions::FPM_Fast);
2436 
2437   Opts.RenderScript = IK.getLanguage() == Language::RenderScript;
2438   if (Opts.RenderScript) {
2439     Opts.NativeHalfType = 1;
2440     Opts.NativeHalfArgsAndReturns = 1;
2441   }
2442 
2443   // OpenCL and C++ both have bool, true, false keywords.
2444   Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
2445 
2446   // OpenCL has half keyword
2447   Opts.Half = Opts.OpenCL;
2448 
2449   // C++ has wchar_t keyword.
2450   Opts.WChar = Opts.CPlusPlus;
2451 
2452   Opts.GNUKeywords = Opts.GNUMode;
2453   Opts.CXXOperatorNames = Opts.CPlusPlus;
2454 
2455   Opts.AlignedAllocation = Opts.CPlusPlus17;
2456 
2457   Opts.DollarIdents = !Opts.AsmPreprocessor;
2458 
2459   // Enable [[]] attributes in C++11 and C2x by default.
2460   Opts.DoubleSquareBracketAttributes = Opts.CPlusPlus11 || Opts.C2x;
2461 }
2462 
2463 /// Attempt to parse a visibility value out of the given argument.
2464 static Visibility parseVisibility(Arg *arg, ArgList &args,
2465                                   DiagnosticsEngine &diags) {
2466   StringRef value = arg->getValue();
2467   if (value == "default") {
2468     return DefaultVisibility;
2469   } else if (value == "hidden" || value == "internal") {
2470     return HiddenVisibility;
2471   } else if (value == "protected") {
2472     // FIXME: diagnose if target does not support protected visibility
2473     return ProtectedVisibility;
2474   }
2475 
2476   diags.Report(diag::err_drv_invalid_value)
2477     << arg->getAsString(args) << value;
2478   return DefaultVisibility;
2479 }
2480 
2481 /// Check if input file kind and language standard are compatible.
2482 static bool IsInputCompatibleWithStandard(InputKind IK,
2483                                           const LangStandard &S) {
2484   switch (IK.getLanguage()) {
2485   case Language::Unknown:
2486   case Language::LLVM_IR:
2487     llvm_unreachable("should not parse language flags for this input");
2488 
2489   case Language::C:
2490   case Language::ObjC:
2491   case Language::RenderScript:
2492     return S.getLanguage() == Language::C;
2493 
2494   case Language::OpenCL:
2495     return S.getLanguage() == Language::OpenCL;
2496 
2497   case Language::CXX:
2498   case Language::ObjCXX:
2499     return S.getLanguage() == Language::CXX;
2500 
2501   case Language::CUDA:
2502     // FIXME: What -std= values should be permitted for CUDA compilations?
2503     return S.getLanguage() == Language::CUDA ||
2504            S.getLanguage() == Language::CXX;
2505 
2506   case Language::HIP:
2507     return S.getLanguage() == Language::CXX || S.getLanguage() == Language::HIP;
2508 
2509   case Language::Asm:
2510     // Accept (and ignore) all -std= values.
2511     // FIXME: The -std= value is not ignored; it affects the tokenization
2512     // and preprocessing rules if we're preprocessing this asm input.
2513     return true;
2514   }
2515 
2516   llvm_unreachable("unexpected input language");
2517 }
2518 
2519 /// Get language name for given input kind.
2520 static const StringRef GetInputKindName(InputKind IK) {
2521   switch (IK.getLanguage()) {
2522   case Language::C:
2523     return "C";
2524   case Language::ObjC:
2525     return "Objective-C";
2526   case Language::CXX:
2527     return "C++";
2528   case Language::ObjCXX:
2529     return "Objective-C++";
2530   case Language::OpenCL:
2531     return "OpenCL";
2532   case Language::CUDA:
2533     return "CUDA";
2534   case Language::RenderScript:
2535     return "RenderScript";
2536   case Language::HIP:
2537     return "HIP";
2538 
2539   case Language::Asm:
2540     return "Asm";
2541   case Language::LLVM_IR:
2542     return "LLVM IR";
2543 
2544   case Language::Unknown:
2545     break;
2546   }
2547   llvm_unreachable("unknown input language");
2548 }
2549 
2550 static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
2551                           const TargetOptions &TargetOpts,
2552                           PreprocessorOptions &PPOpts,
2553                           DiagnosticsEngine &Diags) {
2554   // FIXME: Cleanup per-file based stuff.
2555   LangStandard::Kind LangStd = LangStandard::lang_unspecified;
2556   if (const Arg *A = Args.getLastArg(OPT_std_EQ)) {
2557     LangStd = LangStandard::getLangKind(A->getValue());
2558     if (LangStd == LangStandard::lang_unspecified) {
2559       Diags.Report(diag::err_drv_invalid_value)
2560         << A->getAsString(Args) << A->getValue();
2561       // Report supported standards with short description.
2562       for (unsigned KindValue = 0;
2563            KindValue != LangStandard::lang_unspecified;
2564            ++KindValue) {
2565         const LangStandard &Std = LangStandard::getLangStandardForKind(
2566           static_cast<LangStandard::Kind>(KindValue));
2567         if (IsInputCompatibleWithStandard(IK, Std)) {
2568           auto Diag = Diags.Report(diag::note_drv_use_standard);
2569           Diag << Std.getName() << Std.getDescription();
2570           unsigned NumAliases = 0;
2571 #define LANGSTANDARD(id, name, lang, desc, features)
2572 #define LANGSTANDARD_ALIAS(id, alias) \
2573           if (KindValue == LangStandard::lang_##id) ++NumAliases;
2574 #define LANGSTANDARD_ALIAS_DEPR(id, alias)
2575 #include "clang/Basic/LangStandards.def"
2576           Diag << NumAliases;
2577 #define LANGSTANDARD(id, name, lang, desc, features)
2578 #define LANGSTANDARD_ALIAS(id, alias) \
2579           if (KindValue == LangStandard::lang_##id) Diag << alias;
2580 #define LANGSTANDARD_ALIAS_DEPR(id, alias)
2581 #include "clang/Basic/LangStandards.def"
2582         }
2583       }
2584     } else {
2585       // Valid standard, check to make sure language and standard are
2586       // compatible.
2587       const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
2588       if (!IsInputCompatibleWithStandard(IK, Std)) {
2589         Diags.Report(diag::err_drv_argument_not_allowed_with)
2590           << A->getAsString(Args) << GetInputKindName(IK);
2591       }
2592     }
2593   }
2594 
2595   if (Args.hasArg(OPT_fno_dllexport_inlines))
2596     Opts.DllExportInlines = false;
2597 
2598   if (const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
2599     StringRef Name = A->getValue();
2600     if (Name == "full" || Name == "branch") {
2601       Opts.CFProtectionBranch = 1;
2602     }
2603   }
2604   // -cl-std only applies for OpenCL language standards.
2605   // Override the -std option in this case.
2606   if (const Arg *A = Args.getLastArg(OPT_cl_std_EQ)) {
2607     LangStandard::Kind OpenCLLangStd
2608       = llvm::StringSwitch<LangStandard::Kind>(A->getValue())
2609         .Cases("cl", "CL", LangStandard::lang_opencl10)
2610         .Cases("cl1.0", "CL1.0", LangStandard::lang_opencl10)
2611         .Cases("cl1.1", "CL1.1", LangStandard::lang_opencl11)
2612         .Cases("cl1.2", "CL1.2", LangStandard::lang_opencl12)
2613         .Cases("cl2.0", "CL2.0", LangStandard::lang_opencl20)
2614         .Cases("cl3.0", "CL3.0", LangStandard::lang_opencl30)
2615         .Cases("clc++", "CLC++", LangStandard::lang_openclcpp)
2616         .Default(LangStandard::lang_unspecified);
2617 
2618     if (OpenCLLangStd == LangStandard::lang_unspecified) {
2619       Diags.Report(diag::err_drv_invalid_value)
2620         << A->getAsString(Args) << A->getValue();
2621     }
2622     else
2623       LangStd = OpenCLLangStd;
2624   }
2625 
2626   Opts.SYCL = Args.hasArg(options::OPT_fsycl);
2627   Opts.SYCLIsDevice = Opts.SYCL && Args.hasArg(options::OPT_fsycl_is_device);
2628   if (Opts.SYCL) {
2629     // -sycl-std applies to any SYCL source, not only those containing kernels,
2630     // but also those using the SYCL API
2631     if (const Arg *A = Args.getLastArg(OPT_sycl_std_EQ)) {
2632       Opts.SYCLVersion = llvm::StringSwitch<unsigned>(A->getValue())
2633                              .Cases("2017", "1.2.1", "121", "sycl-1.2.1", 2017)
2634                              .Default(0U);
2635 
2636       if (Opts.SYCLVersion == 0U) {
2637         // User has passed an invalid value to the flag, this is an error
2638         Diags.Report(diag::err_drv_invalid_value)
2639             << A->getAsString(Args) << A->getValue();
2640       }
2641     }
2642   }
2643 
2644   Opts.IncludeDefaultHeader = Args.hasArg(OPT_finclude_default_header);
2645   Opts.DeclareOpenCLBuiltins = Args.hasArg(OPT_fdeclare_opencl_builtins);
2646 
2647   llvm::Triple T(TargetOpts.Triple);
2648   CompilerInvocation::setLangDefaults(Opts, IK, T, PPOpts, LangStd);
2649 
2650   // -cl-strict-aliasing needs to emit diagnostic in the case where CL > 1.0.
2651   // This option should be deprecated for CL > 1.0 because
2652   // this option was added for compatibility with OpenCL 1.0.
2653   if (Args.getLastArg(OPT_cl_strict_aliasing)
2654        && Opts.OpenCLVersion > 100) {
2655     Diags.Report(diag::warn_option_invalid_ocl_version)
2656         << Opts.getOpenCLVersionTuple().getAsString()
2657         << Args.getLastArg(OPT_cl_strict_aliasing)->getAsString(Args);
2658   }
2659 
2660   // We abuse '-f[no-]gnu-keywords' to force overriding all GNU-extension
2661   // keywords. This behavior is provided by GCC's poorly named '-fasm' flag,
2662   // while a subset (the non-C++ GNU keywords) is provided by GCC's
2663   // '-fgnu-keywords'. Clang conflates the two for simplicity under the single
2664   // name, as it doesn't seem a useful distinction.
2665   Opts.GNUKeywords = Args.hasFlag(OPT_fgnu_keywords, OPT_fno_gnu_keywords,
2666                                   Opts.GNUKeywords);
2667 
2668   Opts.Digraphs = Args.hasFlag(OPT_fdigraphs, OPT_fno_digraphs, Opts.Digraphs);
2669 
2670   if (Args.hasArg(OPT_fno_operator_names))
2671     Opts.CXXOperatorNames = 0;
2672 
2673   if (Args.hasArg(OPT_fcuda_is_device))
2674     Opts.CUDAIsDevice = 1;
2675 
2676   if (Args.hasArg(OPT_fcuda_allow_variadic_functions))
2677     Opts.CUDAAllowVariadicFunctions = 1;
2678 
2679   if (Args.hasArg(OPT_fno_cuda_host_device_constexpr))
2680     Opts.CUDAHostDeviceConstexpr = 0;
2681 
2682   if (Args.hasArg(OPT_fgpu_defer_diag))
2683     Opts.GPUDeferDiag = 1;
2684 
2685   if (Opts.CUDAIsDevice && Args.hasArg(OPT_fcuda_approx_transcendentals))
2686     Opts.CUDADeviceApproxTranscendentals = 1;
2687 
2688   Opts.GPURelocatableDeviceCode = Args.hasArg(OPT_fgpu_rdc);
2689   if (Args.hasArg(OPT_fgpu_allow_device_init)) {
2690     if (Opts.HIP)
2691       Opts.GPUAllowDeviceInit = 1;
2692     else
2693       Diags.Report(diag::warn_ignored_hip_only_option)
2694           << Args.getLastArg(OPT_fgpu_allow_device_init)->getAsString(Args);
2695   }
2696   Opts.HIPUseNewLaunchAPI = Args.hasArg(OPT_fhip_new_launch_api);
2697   if (Opts.HIP)
2698     Opts.GPUMaxThreadsPerBlock = getLastArgIntValue(
2699         Args, OPT_gpu_max_threads_per_block_EQ, Opts.GPUMaxThreadsPerBlock);
2700   else if (Args.hasArg(OPT_gpu_max_threads_per_block_EQ))
2701     Diags.Report(diag::warn_ignored_hip_only_option)
2702         << Args.getLastArg(OPT_gpu_max_threads_per_block_EQ)->getAsString(Args);
2703 
2704   if (Opts.ObjC) {
2705     if (Arg *arg = Args.getLastArg(OPT_fobjc_runtime_EQ)) {
2706       StringRef value = arg->getValue();
2707       if (Opts.ObjCRuntime.tryParse(value))
2708         Diags.Report(diag::err_drv_unknown_objc_runtime) << value;
2709     }
2710 
2711     if (Args.hasArg(OPT_fobjc_gc_only))
2712       Opts.setGC(LangOptions::GCOnly);
2713     else if (Args.hasArg(OPT_fobjc_gc))
2714       Opts.setGC(LangOptions::HybridGC);
2715     else if (Args.hasArg(OPT_fobjc_arc)) {
2716       Opts.ObjCAutoRefCount = 1;
2717       if (!Opts.ObjCRuntime.allowsARC())
2718         Diags.Report(diag::err_arc_unsupported_on_runtime);
2719     }
2720 
2721     // ObjCWeakRuntime tracks whether the runtime supports __weak, not
2722     // whether the feature is actually enabled.  This is predominantly
2723     // determined by -fobjc-runtime, but we allow it to be overridden
2724     // from the command line for testing purposes.
2725     if (Args.hasArg(OPT_fobjc_runtime_has_weak))
2726       Opts.ObjCWeakRuntime = 1;
2727     else
2728       Opts.ObjCWeakRuntime = Opts.ObjCRuntime.allowsWeak();
2729 
2730     // ObjCWeak determines whether __weak is actually enabled.
2731     // Note that we allow -fno-objc-weak to disable this even in ARC mode.
2732     if (auto weakArg = Args.getLastArg(OPT_fobjc_weak, OPT_fno_objc_weak)) {
2733       if (!weakArg->getOption().matches(OPT_fobjc_weak)) {
2734         assert(!Opts.ObjCWeak);
2735       } else if (Opts.getGC() != LangOptions::NonGC) {
2736         Diags.Report(diag::err_objc_weak_with_gc);
2737       } else if (!Opts.ObjCWeakRuntime) {
2738         Diags.Report(diag::err_objc_weak_unsupported);
2739       } else {
2740         Opts.ObjCWeak = 1;
2741       }
2742     } else if (Opts.ObjCAutoRefCount) {
2743       Opts.ObjCWeak = Opts.ObjCWeakRuntime;
2744     }
2745 
2746     if (Args.hasArg(OPT_fno_objc_infer_related_result_type))
2747       Opts.ObjCInferRelatedResultType = 0;
2748 
2749     if (Args.hasArg(OPT_fobjc_subscripting_legacy_runtime))
2750       Opts.ObjCSubscriptingLegacyRuntime =
2751         (Opts.ObjCRuntime.getKind() == ObjCRuntime::FragileMacOSX);
2752   }
2753 
2754   if (Arg *A = Args.getLastArg(options::OPT_fgnuc_version_EQ)) {
2755     // Check that the version has 1 to 3 components and the minor and patch
2756     // versions fit in two decimal digits.
2757     VersionTuple GNUCVer;
2758     bool Invalid = GNUCVer.tryParse(A->getValue());
2759     unsigned Major = GNUCVer.getMajor();
2760     unsigned Minor = GNUCVer.getMinor().getValueOr(0);
2761     unsigned Patch = GNUCVer.getSubminor().getValueOr(0);
2762     if (Invalid || GNUCVer.getBuild() || Minor >= 100 || Patch >= 100) {
2763       Diags.Report(diag::err_drv_invalid_value)
2764           << A->getAsString(Args) << A->getValue();
2765     }
2766     Opts.GNUCVersion = Major * 100 * 100 + Minor * 100 + Patch;
2767   }
2768 
2769   if (Args.hasArg(OPT_fgnu89_inline)) {
2770     if (Opts.CPlusPlus)
2771       Diags.Report(diag::err_drv_argument_not_allowed_with)
2772         << "-fgnu89-inline" << GetInputKindName(IK);
2773     else
2774       Opts.GNUInline = 1;
2775   }
2776 
2777   if (Args.hasArg(OPT_fapple_kext)) {
2778     if (!Opts.CPlusPlus)
2779       Diags.Report(diag::warn_c_kext);
2780     else
2781       Opts.AppleKext = 1;
2782   }
2783 
2784   if (Args.hasArg(OPT_print_ivar_layout))
2785     Opts.ObjCGCBitmapPrint = 1;
2786 
2787   if (Args.hasArg(OPT_fno_constant_cfstrings))
2788     Opts.NoConstantCFStrings = 1;
2789   if (const auto *A = Args.getLastArg(OPT_fcf_runtime_abi_EQ))
2790     Opts.CFRuntime =
2791         llvm::StringSwitch<LangOptions::CoreFoundationABI>(A->getValue())
2792             .Cases("unspecified", "standalone", "objc",
2793                    LangOptions::CoreFoundationABI::ObjectiveC)
2794             .Cases("swift", "swift-5.0",
2795                    LangOptions::CoreFoundationABI::Swift5_0)
2796             .Case("swift-4.2", LangOptions::CoreFoundationABI::Swift4_2)
2797             .Case("swift-4.1", LangOptions::CoreFoundationABI::Swift4_1)
2798             .Default(LangOptions::CoreFoundationABI::ObjectiveC);
2799 
2800   if (Args.hasArg(OPT_fzvector))
2801     Opts.ZVector = 1;
2802 
2803   if (Args.hasArg(OPT_pthread))
2804     Opts.POSIXThreads = 1;
2805 
2806   // The value-visibility mode defaults to "default".
2807   if (Arg *visOpt = Args.getLastArg(OPT_fvisibility)) {
2808     Opts.setValueVisibilityMode(parseVisibility(visOpt, Args, Diags));
2809   } else {
2810     Opts.setValueVisibilityMode(DefaultVisibility);
2811   }
2812 
2813   // The type-visibility mode defaults to the value-visibility mode.
2814   if (Arg *typeVisOpt = Args.getLastArg(OPT_ftype_visibility)) {
2815     Opts.setTypeVisibilityMode(parseVisibility(typeVisOpt, Args, Diags));
2816   } else {
2817     Opts.setTypeVisibilityMode(Opts.getValueVisibilityMode());
2818   }
2819 
2820   if (Args.hasArg(OPT_fvisibility_inlines_hidden))
2821     Opts.InlineVisibilityHidden = 1;
2822 
2823   if (Args.hasArg(OPT_fvisibility_inlines_hidden_static_local_var))
2824     Opts.VisibilityInlinesHiddenStaticLocalVar = 1;
2825 
2826   if (Args.hasArg(OPT_fvisibility_global_new_delete_hidden))
2827     Opts.GlobalAllocationFunctionVisibilityHidden = 1;
2828 
2829   if (Args.hasArg(OPT_fapply_global_visibility_to_externs))
2830     Opts.SetVisibilityForExternDecls = 1;
2831 
2832   if (Args.hasArg(OPT_fvisibility_from_dllstorageclass)) {
2833     Opts.VisibilityFromDLLStorageClass = 1;
2834 
2835     // Translate dllexport defintions to default visibility, by default.
2836     if (Arg *O = Args.getLastArg(OPT_fvisibility_dllexport_EQ))
2837       Opts.setDLLExportVisibility(parseVisibility(O, Args, Diags));
2838     else
2839       Opts.setDLLExportVisibility(DefaultVisibility);
2840 
2841     // Translate defintions without an explict DLL storage class to hidden
2842     // visibility, by default.
2843     if (Arg *O = Args.getLastArg(OPT_fvisibility_nodllstorageclass_EQ))
2844       Opts.setNoDLLStorageClassVisibility(parseVisibility(O, Args, Diags));
2845     else
2846       Opts.setNoDLLStorageClassVisibility(HiddenVisibility);
2847 
2848     // Translate dllimport external declarations to default visibility, by
2849     // default.
2850     if (Arg *O = Args.getLastArg(OPT_fvisibility_externs_dllimport_EQ))
2851       Opts.setExternDeclDLLImportVisibility(parseVisibility(O, Args, Diags));
2852     else
2853       Opts.setExternDeclDLLImportVisibility(DefaultVisibility);
2854 
2855     // Translate external declarations without an explicit DLL storage class
2856     // to hidden visibility, by default.
2857     if (Arg *O = Args.getLastArg(OPT_fvisibility_externs_nodllstorageclass_EQ))
2858       Opts.setExternDeclNoDLLStorageClassVisibility(
2859           parseVisibility(O, Args, Diags));
2860     else
2861       Opts.setExternDeclNoDLLStorageClassVisibility(HiddenVisibility);
2862   }
2863 
2864   if (Args.hasArg(OPT_ftrapv)) {
2865     Opts.setSignedOverflowBehavior(LangOptions::SOB_Trapping);
2866     // Set the handler, if one is specified.
2867     Opts.OverflowHandler =
2868         std::string(Args.getLastArgValue(OPT_ftrapv_handler));
2869   }
2870   else if (Args.hasArg(OPT_fwrapv))
2871     Opts.setSignedOverflowBehavior(LangOptions::SOB_Defined);
2872 
2873   Opts.MSVCCompat = Args.hasArg(OPT_fms_compatibility);
2874   Opts.MicrosoftExt = Opts.MSVCCompat || Args.hasArg(OPT_fms_extensions);
2875   Opts.AsmBlocks = Args.hasArg(OPT_fasm_blocks) || Opts.MicrosoftExt;
2876   Opts.MSCompatibilityVersion = 0;
2877   if (const Arg *A = Args.getLastArg(OPT_fms_compatibility_version)) {
2878     VersionTuple VT;
2879     if (VT.tryParse(A->getValue()))
2880       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args)
2881                                                 << A->getValue();
2882     Opts.MSCompatibilityVersion = VT.getMajor() * 10000000 +
2883                                   VT.getMinor().getValueOr(0) * 100000 +
2884                                   VT.getSubminor().getValueOr(0);
2885   }
2886 
2887   // Mimicking gcc's behavior, trigraphs are only enabled if -trigraphs
2888   // is specified, or -std is set to a conforming mode.
2889   // Trigraphs are disabled by default in c++1z onwards.
2890   // For z/OS, trigraphs are enabled by default (without regard to the above).
2891   Opts.Trigraphs =
2892       (!Opts.GNUMode && !Opts.MSVCCompat && !Opts.CPlusPlus17) || T.isOSzOS();
2893   Opts.Trigraphs =
2894       Args.hasFlag(OPT_ftrigraphs, OPT_fno_trigraphs, Opts.Trigraphs);
2895 
2896   Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
2897                                    OPT_fno_dollars_in_identifiers,
2898                                    Opts.DollarIdents);
2899   Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
2900   Opts.setVtorDispMode(
2901       MSVtorDispMode(getLastArgIntValue(Args, OPT_vtordisp_mode_EQ, 1, Diags)));
2902   Opts.Borland = Args.hasArg(OPT_fborland_extensions);
2903   Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
2904   Opts.ConstStrings = Args.hasFlag(OPT_fconst_strings, OPT_fno_const_strings,
2905                                    Opts.ConstStrings);
2906   if (Arg *A = Args.getLastArg(OPT_flax_vector_conversions_EQ)) {
2907     using LaxKind = LangOptions::LaxVectorConversionKind;
2908     if (auto Kind = llvm::StringSwitch<Optional<LaxKind>>(A->getValue())
2909                         .Case("none", LaxKind::None)
2910                         .Case("integer", LaxKind::Integer)
2911                         .Case("all", LaxKind::All)
2912                         .Default(llvm::None))
2913       Opts.setLaxVectorConversions(*Kind);
2914     else
2915       Diags.Report(diag::err_drv_invalid_value)
2916           << A->getAsString(Args) << A->getValue();
2917   }
2918   if (Args.hasArg(OPT_fno_threadsafe_statics))
2919     Opts.ThreadsafeStatics = 0;
2920   Opts.Exceptions = Args.hasArg(OPT_fexceptions);
2921   Opts.IgnoreExceptions = Args.hasArg(OPT_fignore_exceptions);
2922   Opts.ObjCExceptions = Args.hasArg(OPT_fobjc_exceptions);
2923   Opts.CXXExceptions = Args.hasArg(OPT_fcxx_exceptions);
2924 
2925   // -ffixed-point
2926   Opts.FixedPoint =
2927       Args.hasFlag(OPT_ffixed_point, OPT_fno_fixed_point, /*Default=*/false) &&
2928       !Opts.CPlusPlus;
2929   Opts.PaddingOnUnsignedFixedPoint =
2930       Args.hasFlag(OPT_fpadding_on_unsigned_fixed_point,
2931                    OPT_fno_padding_on_unsigned_fixed_point,
2932                    /*Default=*/false) &&
2933       Opts.FixedPoint;
2934 
2935   // Handle exception personalities
2936   Arg *A = Args.getLastArg(
2937       options::OPT_fsjlj_exceptions, options::OPT_fseh_exceptions,
2938       options::OPT_fdwarf_exceptions, options::OPT_fwasm_exceptions);
2939   if (A) {
2940     const Option &Opt = A->getOption();
2941     llvm::Triple T(TargetOpts.Triple);
2942     if (T.isWindowsMSVCEnvironment())
2943       Diags.Report(diag::err_fe_invalid_exception_model)
2944           << Opt.getName() << T.str();
2945 
2946     Opts.SjLjExceptions = Opt.matches(options::OPT_fsjlj_exceptions);
2947     Opts.SEHExceptions = Opt.matches(options::OPT_fseh_exceptions);
2948     Opts.DWARFExceptions = Opt.matches(options::OPT_fdwarf_exceptions);
2949     Opts.WasmExceptions = Opt.matches(options::OPT_fwasm_exceptions);
2950   }
2951 
2952   Opts.ExternCNoUnwind = Args.hasArg(OPT_fexternc_nounwind);
2953   Opts.TraditionalCPP = Args.hasArg(OPT_traditional_cpp);
2954 
2955   Opts.RTTI = Opts.CPlusPlus && !Args.hasArg(OPT_fno_rtti);
2956   Opts.RTTIData = Opts.RTTI && !Args.hasArg(OPT_fno_rtti_data);
2957   Opts.Blocks = Args.hasArg(OPT_fblocks) || (Opts.OpenCL
2958     && Opts.OpenCLVersion == 200);
2959   Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional);
2960   Opts.Coroutines = Opts.CPlusPlus20 || Args.hasArg(OPT_fcoroutines_ts);
2961 
2962   Opts.ConvergentFunctions = Opts.OpenCL || (Opts.CUDA && Opts.CUDAIsDevice) ||
2963                              Opts.SYCLIsDevice ||
2964                              Args.hasArg(OPT_fconvergent_functions);
2965 
2966   Opts.DoubleSquareBracketAttributes =
2967       Args.hasFlag(OPT_fdouble_square_bracket_attributes,
2968                    OPT_fno_double_square_bracket_attributes,
2969                    Opts.DoubleSquareBracketAttributes);
2970 
2971   Opts.CPlusPlusModules = Opts.CPlusPlus20;
2972   Opts.ModulesTS = Args.hasArg(OPT_fmodules_ts);
2973   Opts.Modules =
2974       Args.hasArg(OPT_fmodules) || Opts.ModulesTS || Opts.CPlusPlusModules;
2975   Opts.ModulesStrictDeclUse = Args.hasArg(OPT_fmodules_strict_decluse);
2976   Opts.ModulesDeclUse =
2977       Args.hasArg(OPT_fmodules_decluse) || Opts.ModulesStrictDeclUse;
2978   // FIXME: We only need this in C++ modules / Modules TS if we might textually
2979   // enter a different module (eg, when building a header unit).
2980   Opts.ModulesLocalVisibility =
2981       Args.hasArg(OPT_fmodules_local_submodule_visibility) || Opts.ModulesTS ||
2982       Opts.CPlusPlusModules;
2983   Opts.ModulesCodegen = Args.hasArg(OPT_fmodules_codegen);
2984   Opts.ModulesDebugInfo = Args.hasArg(OPT_fmodules_debuginfo);
2985   Opts.ModulesSearchAll = Opts.Modules &&
2986     !Args.hasArg(OPT_fno_modules_search_all) &&
2987     Args.hasArg(OPT_fmodules_search_all);
2988   Opts.ModulesErrorRecovery = !Args.hasArg(OPT_fno_modules_error_recovery);
2989   Opts.ImplicitModules = !Args.hasArg(OPT_fno_implicit_modules);
2990   Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char);
2991   Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar);
2992   Opts.Char8 = Args.hasFlag(OPT_fchar8__t, OPT_fno_char8__t, Opts.CPlusPlus20);
2993   if (const Arg *A = Args.getLastArg(OPT_fwchar_type_EQ)) {
2994     Opts.WCharSize = llvm::StringSwitch<unsigned>(A->getValue())
2995                          .Case("char", 1)
2996                          .Case("short", 2)
2997                          .Case("int", 4)
2998                          .Default(0);
2999     if (Opts.WCharSize == 0)
3000       Diags.Report(diag::err_fe_invalid_wchar_type) << A->getValue();
3001   }
3002   Opts.WCharIsSigned = Args.hasFlag(OPT_fsigned_wchar, OPT_fno_signed_wchar, true);
3003   Opts.ShortEnums = Args.hasArg(OPT_fshort_enums);
3004   Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
3005   Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
3006   if (!Opts.NoBuiltin)
3007     getAllNoBuiltinFuncValues(Args, Opts.NoBuiltinFuncs);
3008   Opts.NoMathBuiltin = Args.hasArg(OPT_fno_math_builtin);
3009   Opts.RelaxedTemplateTemplateArgs =
3010       Args.hasArg(OPT_frelaxed_template_template_args);
3011   Opts.SizedDeallocation = Args.hasArg(OPT_fsized_deallocation);
3012   Opts.AlignedAllocation =
3013       Args.hasFlag(OPT_faligned_allocation, OPT_fno_aligned_allocation,
3014                    Opts.AlignedAllocation);
3015   Opts.AlignedAllocationUnavailable =
3016       Opts.AlignedAllocation && Args.hasArg(OPT_aligned_alloc_unavailable);
3017   Opts.NewAlignOverride =
3018       getLastArgIntValue(Args, OPT_fnew_alignment_EQ, 0, Diags);
3019   if (Opts.NewAlignOverride && !llvm::isPowerOf2_32(Opts.NewAlignOverride)) {
3020     Arg *A = Args.getLastArg(OPT_fnew_alignment_EQ);
3021     Diags.Report(diag::err_fe_invalid_alignment) << A->getAsString(Args)
3022                                                  << A->getValue();
3023     Opts.NewAlignOverride = 0;
3024   }
3025   Opts.ConceptSatisfactionCaching =
3026       !Args.hasArg(OPT_fno_concept_satisfaction_caching);
3027   if (Args.hasArg(OPT_fconcepts_ts))
3028     Diags.Report(diag::warn_fe_concepts_ts_flag);
3029   // Recovery AST still heavily relies on dependent-type machinery.
3030   Opts.RecoveryAST =
3031       Args.hasFlag(OPT_frecovery_ast, OPT_fno_recovery_ast, Opts.CPlusPlus);
3032   Opts.RecoveryASTType = Args.hasFlag(
3033       OPT_frecovery_ast_type, OPT_fno_recovery_ast_type, Opts.CPlusPlus);
3034   Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
3035   Opts.AccessControl = !Args.hasArg(OPT_fno_access_control);
3036   Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
3037   Opts.MathErrno = !Opts.OpenCL && Args.hasArg(OPT_fmath_errno);
3038   Opts.InstantiationDepth =
3039       getLastArgIntValue(Args, OPT_ftemplate_depth, 1024, Diags);
3040   Opts.ArrowDepth =
3041       getLastArgIntValue(Args, OPT_foperator_arrow_depth, 256, Diags);
3042   Opts.ConstexprCallDepth =
3043       getLastArgIntValue(Args, OPT_fconstexpr_depth, 512, Diags);
3044   Opts.ConstexprStepLimit =
3045       getLastArgIntValue(Args, OPT_fconstexpr_steps, 1048576, Diags);
3046   Opts.EnableNewConstInterp =
3047       Args.hasArg(OPT_fexperimental_new_constant_interpreter);
3048   Opts.BracketDepth = getLastArgIntValue(Args, OPT_fbracket_depth, 256, Diags);
3049   Opts.DelayedTemplateParsing = Args.hasArg(OPT_fdelayed_template_parsing);
3050   Opts.NumLargeByValueCopy =
3051       getLastArgIntValue(Args, OPT_Wlarge_by_value_copy_EQ, 0, Diags);
3052   Opts.MSBitfields = Args.hasArg(OPT_mms_bitfields);
3053   Opts.ObjCConstantStringClass =
3054       std::string(Args.getLastArgValue(OPT_fconstant_string_class));
3055   Opts.ObjCDefaultSynthProperties =
3056     !Args.hasArg(OPT_disable_objc_default_synthesize_properties);
3057   Opts.EncodeExtendedBlockSig =
3058     Args.hasArg(OPT_fencode_extended_block_signature);
3059   Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
3060   Opts.PackStruct = getLastArgIntValue(Args, OPT_fpack_struct_EQ, 0, Diags);
3061   Opts.MaxTypeAlign = getLastArgIntValue(Args, OPT_fmax_type_align_EQ, 0, Diags);
3062   Opts.AlignDouble = Args.hasArg(OPT_malign_double);
3063   Opts.DoubleSize = getLastArgIntValue(Args, OPT_mdouble_EQ, 0, Diags);
3064   Opts.LongDoubleSize = Args.hasArg(OPT_mlong_double_128)
3065                             ? 128
3066                             : Args.hasArg(OPT_mlong_double_64) ? 64 : 0;
3067   Opts.PPCIEEELongDouble = Args.hasArg(OPT_mabi_EQ_ieeelongdouble);
3068   Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
3069   Opts.ROPI = Args.hasArg(OPT_fropi);
3070   Opts.RWPI = Args.hasArg(OPT_frwpi);
3071   Opts.PIE = Args.hasArg(OPT_pic_is_pie);
3072   Opts.Static = Args.hasArg(OPT_static_define);
3073   Opts.DumpRecordLayoutsSimple = Args.hasArg(OPT_fdump_record_layouts_simple);
3074   Opts.DumpRecordLayouts = Opts.DumpRecordLayoutsSimple
3075                         || Args.hasArg(OPT_fdump_record_layouts);
3076   Opts.DumpVTableLayouts = Args.hasArg(OPT_fdump_vtable_layouts);
3077   Opts.SpellChecking = !Args.hasArg(OPT_fno_spell_checking);
3078   Opts.NoBitFieldTypeAlign = Args.hasArg(OPT_fno_bitfield_type_align);
3079   if (Opts.FastRelaxedMath)
3080     Opts.setDefaultFPContractMode(LangOptions::FPM_Fast);
3081   Opts.HexagonQdsp6Compat = Args.hasArg(OPT_mqdsp6_compat);
3082   Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map);
3083   Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype);
3084   Opts.DebuggerSupport = Args.hasArg(OPT_fdebugger_support);
3085   Opts.DebuggerCastResultToId = Args.hasArg(OPT_fdebugger_cast_result_to_id);
3086   Opts.DebuggerObjCLiteral = Args.hasArg(OPT_fdebugger_objc_literal);
3087   Opts.ApplePragmaPack = Args.hasArg(OPT_fapple_pragma_pack);
3088   Opts.ModuleName = std::string(Args.getLastArgValue(OPT_fmodule_name_EQ));
3089   Opts.CurrentModule = Opts.ModuleName;
3090   Opts.AppExt = Args.hasArg(OPT_fapplication_extension);
3091   Opts.ModuleFeatures = Args.getAllArgValues(OPT_fmodule_feature);
3092   llvm::sort(Opts.ModuleFeatures);
3093   Opts.NativeHalfType |= Args.hasArg(OPT_fnative_half_type);
3094   Opts.NativeHalfArgsAndReturns |= Args.hasArg(OPT_fnative_half_arguments_and_returns);
3095   // Enable HalfArgsAndReturns if present in Args or if NativeHalfArgsAndReturns
3096   // is enabled.
3097   Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns)
3098                             | Opts.NativeHalfArgsAndReturns;
3099   Opts.GNUAsm = !Args.hasArg(OPT_fno_gnu_inline_asm);
3100   Opts.Cmse = Args.hasArg(OPT_mcmse); // Armv8-M Security Extensions
3101 
3102   Opts.ArmSveVectorBits =
3103       getLastArgIntValue(Args, options::OPT_msve_vector_bits_EQ, 0, Diags);
3104 
3105   // __declspec is enabled by default for the PS4 by the driver, and also
3106   // enabled for Microsoft Extensions or Borland Extensions, here.
3107   //
3108   // FIXME: __declspec is also currently enabled for CUDA, but isn't really a
3109   // CUDA extension. However, it is required for supporting
3110   // __clang_cuda_builtin_vars.h, which uses __declspec(property). Once that has
3111   // been rewritten in terms of something more generic, remove the Opts.CUDA
3112   // term here.
3113   Opts.DeclSpecKeyword =
3114       Args.hasFlag(OPT_fdeclspec, OPT_fno_declspec,
3115                    (Opts.MicrosoftExt || Opts.Borland || Opts.CUDA));
3116 
3117   if (Arg *A = Args.getLastArg(OPT_faddress_space_map_mangling_EQ)) {
3118     switch (llvm::StringSwitch<unsigned>(A->getValue())
3119       .Case("target", LangOptions::ASMM_Target)
3120       .Case("no", LangOptions::ASMM_Off)
3121       .Case("yes", LangOptions::ASMM_On)
3122       .Default(255)) {
3123     default:
3124       Diags.Report(diag::err_drv_invalid_value)
3125         << "-faddress-space-map-mangling=" << A->getValue();
3126       break;
3127     case LangOptions::ASMM_Target:
3128       Opts.setAddressSpaceMapMangling(LangOptions::ASMM_Target);
3129       break;
3130     case LangOptions::ASMM_On:
3131       Opts.setAddressSpaceMapMangling(LangOptions::ASMM_On);
3132       break;
3133     case LangOptions::ASMM_Off:
3134       Opts.setAddressSpaceMapMangling(LangOptions::ASMM_Off);
3135       break;
3136     }
3137   }
3138 
3139   if (Arg *A = Args.getLastArg(OPT_fms_memptr_rep_EQ)) {
3140     LangOptions::PragmaMSPointersToMembersKind InheritanceModel =
3141         llvm::StringSwitch<LangOptions::PragmaMSPointersToMembersKind>(
3142             A->getValue())
3143             .Case("single",
3144                   LangOptions::PPTMK_FullGeneralitySingleInheritance)
3145             .Case("multiple",
3146                   LangOptions::PPTMK_FullGeneralityMultipleInheritance)
3147             .Case("virtual",
3148                   LangOptions::PPTMK_FullGeneralityVirtualInheritance)
3149             .Default(LangOptions::PPTMK_BestCase);
3150     if (InheritanceModel == LangOptions::PPTMK_BestCase)
3151       Diags.Report(diag::err_drv_invalid_value)
3152           << "-fms-memptr-rep=" << A->getValue();
3153 
3154     Opts.setMSPointerToMemberRepresentationMethod(InheritanceModel);
3155   }
3156 
3157   // Check for MS default calling conventions being specified.
3158   if (Arg *A = Args.getLastArg(OPT_fdefault_calling_conv_EQ)) {
3159     LangOptions::DefaultCallingConvention DefaultCC =
3160         llvm::StringSwitch<LangOptions::DefaultCallingConvention>(A->getValue())
3161             .Case("cdecl", LangOptions::DCC_CDecl)
3162             .Case("fastcall", LangOptions::DCC_FastCall)
3163             .Case("stdcall", LangOptions::DCC_StdCall)
3164             .Case("vectorcall", LangOptions::DCC_VectorCall)
3165             .Case("regcall", LangOptions::DCC_RegCall)
3166             .Default(LangOptions::DCC_None);
3167     if (DefaultCC == LangOptions::DCC_None)
3168       Diags.Report(diag::err_drv_invalid_value)
3169           << "-fdefault-calling-conv=" << A->getValue();
3170 
3171     llvm::Triple T(TargetOpts.Triple);
3172     llvm::Triple::ArchType Arch = T.getArch();
3173     bool emitError = (DefaultCC == LangOptions::DCC_FastCall ||
3174                       DefaultCC == LangOptions::DCC_StdCall) &&
3175                      Arch != llvm::Triple::x86;
3176     emitError |= (DefaultCC == LangOptions::DCC_VectorCall ||
3177                   DefaultCC == LangOptions::DCC_RegCall) &&
3178                  !T.isX86();
3179     if (emitError)
3180       Diags.Report(diag::err_drv_argument_not_allowed_with)
3181           << A->getSpelling() << T.getTriple();
3182     else
3183       Opts.setDefaultCallingConv(DefaultCC);
3184   }
3185 
3186   Opts.SemanticInterposition = Args.hasArg(OPT_fsemantic_interposition);
3187   // An explicit -fno-semantic-interposition infers dso_local.
3188   Opts.ExplicitNoSemanticInterposition =
3189       Args.hasArg(OPT_fno_semantic_interposition);
3190 
3191   // -mrtd option
3192   if (Arg *A = Args.getLastArg(OPT_mrtd)) {
3193     if (Opts.getDefaultCallingConv() != LangOptions::DCC_None)
3194       Diags.Report(diag::err_drv_argument_not_allowed_with)
3195           << A->getSpelling() << "-fdefault-calling-conv";
3196     else {
3197       llvm::Triple T(TargetOpts.Triple);
3198       if (T.getArch() != llvm::Triple::x86)
3199         Diags.Report(diag::err_drv_argument_not_allowed_with)
3200             << A->getSpelling() << T.getTriple();
3201       else
3202         Opts.setDefaultCallingConv(LangOptions::DCC_StdCall);
3203     }
3204   }
3205 
3206   // Check if -fopenmp is specified and set default version to 5.0.
3207   Opts.OpenMP = Args.hasArg(options::OPT_fopenmp) ? 50 : 0;
3208   // Check if -fopenmp-simd is specified.
3209   bool IsSimdSpecified =
3210       Args.hasFlag(options::OPT_fopenmp_simd, options::OPT_fno_openmp_simd,
3211                    /*Default=*/false);
3212   Opts.OpenMPSimd = !Opts.OpenMP && IsSimdSpecified;
3213   Opts.OpenMPUseTLS =
3214       Opts.OpenMP && !Args.hasArg(options::OPT_fnoopenmp_use_tls);
3215   Opts.OpenMPIsDevice =
3216       Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_is_device);
3217   Opts.OpenMPIRBuilder =
3218       Opts.OpenMP && Args.hasArg(options::OPT_fopenmp_enable_irbuilder);
3219   bool IsTargetSpecified =
3220       Opts.OpenMPIsDevice || Args.hasArg(options::OPT_fopenmp_targets_EQ);
3221 
3222   if (Opts.OpenMP || Opts.OpenMPSimd) {
3223     if (int Version = getLastArgIntValue(
3224             Args, OPT_fopenmp_version_EQ,
3225             (IsSimdSpecified || IsTargetSpecified) ? 50 : Opts.OpenMP, Diags))
3226       Opts.OpenMP = Version;
3227     // Provide diagnostic when a given target is not expected to be an OpenMP
3228     // device or host.
3229     if (!Opts.OpenMPIsDevice) {
3230       switch (T.getArch()) {
3231       default:
3232         break;
3233       // Add unsupported host targets here:
3234       case llvm::Triple::nvptx:
3235       case llvm::Triple::nvptx64:
3236         Diags.Report(diag::err_drv_omp_host_target_not_supported)
3237             << TargetOpts.Triple;
3238         break;
3239       }
3240     }
3241   }
3242 
3243   // Set the flag to prevent the implementation from emitting device exception
3244   // handling code for those requiring so.
3245   if ((Opts.OpenMPIsDevice && (T.isNVPTX() || T.isAMDGCN())) ||
3246       Opts.OpenCLCPlusPlus) {
3247     Opts.Exceptions = 0;
3248     Opts.CXXExceptions = 0;
3249   }
3250   if (Opts.OpenMPIsDevice && T.isNVPTX()) {
3251     Opts.OpenMPCUDANumSMs =
3252         getLastArgIntValue(Args, options::OPT_fopenmp_cuda_number_of_sm_EQ,
3253                            Opts.OpenMPCUDANumSMs, Diags);
3254     Opts.OpenMPCUDABlocksPerSM =
3255         getLastArgIntValue(Args, options::OPT_fopenmp_cuda_blocks_per_sm_EQ,
3256                            Opts.OpenMPCUDABlocksPerSM, Diags);
3257     Opts.OpenMPCUDAReductionBufNum = getLastArgIntValue(
3258         Args, options::OPT_fopenmp_cuda_teams_reduction_recs_num_EQ,
3259         Opts.OpenMPCUDAReductionBufNum, Diags);
3260   }
3261 
3262   // Prevent auto-widening the representation of loop counters during an
3263   // OpenMP collapse clause.
3264   Opts.OpenMPOptimisticCollapse =
3265       Args.hasArg(options::OPT_fopenmp_optimistic_collapse) ? 1 : 0;
3266 
3267   // Get the OpenMP target triples if any.
3268   if (Arg *A = Args.getLastArg(options::OPT_fopenmp_targets_EQ)) {
3269     enum ArchPtrSize { Arch16Bit, Arch32Bit, Arch64Bit };
3270     auto getArchPtrSize = [](const llvm::Triple &T) {
3271       if (T.isArch16Bit())
3272         return Arch16Bit;
3273       if (T.isArch32Bit())
3274         return Arch32Bit;
3275       assert(T.isArch64Bit() && "Expected 64-bit architecture");
3276       return Arch64Bit;
3277     };
3278 
3279     for (unsigned i = 0; i < A->getNumValues(); ++i) {
3280       llvm::Triple TT(A->getValue(i));
3281 
3282       if (TT.getArch() == llvm::Triple::UnknownArch ||
3283           !(TT.getArch() == llvm::Triple::aarch64 ||
3284             TT.getArch() == llvm::Triple::ppc ||
3285             TT.getArch() == llvm::Triple::ppc64 ||
3286             TT.getArch() == llvm::Triple::ppc64le ||
3287             TT.getArch() == llvm::Triple::nvptx ||
3288             TT.getArch() == llvm::Triple::nvptx64 ||
3289             TT.getArch() == llvm::Triple::amdgcn ||
3290             TT.getArch() == llvm::Triple::x86 ||
3291             TT.getArch() == llvm::Triple::x86_64))
3292         Diags.Report(diag::err_drv_invalid_omp_target) << A->getValue(i);
3293       else if (getArchPtrSize(T) != getArchPtrSize(TT))
3294         Diags.Report(diag::err_drv_incompatible_omp_arch)
3295             << A->getValue(i) << T.str();
3296       else
3297         Opts.OMPTargetTriples.push_back(TT);
3298     }
3299   }
3300 
3301   // Get OpenMP host file path if any and report if a non existent file is
3302   // found
3303   if (Arg *A = Args.getLastArg(options::OPT_fopenmp_host_ir_file_path)) {
3304     Opts.OMPHostIRFile = A->getValue();
3305     if (!llvm::sys::fs::exists(Opts.OMPHostIRFile))
3306       Diags.Report(diag::err_drv_omp_host_ir_file_not_found)
3307           << Opts.OMPHostIRFile;
3308   }
3309 
3310   // Set CUDA mode for OpenMP target NVPTX/AMDGCN if specified in options
3311   Opts.OpenMPCUDAMode = Opts.OpenMPIsDevice && (T.isNVPTX() || T.isAMDGCN()) &&
3312                         Args.hasArg(options::OPT_fopenmp_cuda_mode);
3313 
3314   // Set CUDA support for parallel execution of target regions for OpenMP target
3315   // NVPTX/AMDGCN if specified in options.
3316   Opts.OpenMPCUDATargetParallel =
3317       Opts.OpenMPIsDevice && (T.isNVPTX() || T.isAMDGCN()) &&
3318       Args.hasArg(options::OPT_fopenmp_cuda_parallel_target_regions);
3319 
3320   // Set CUDA mode for OpenMP target NVPTX/AMDGCN if specified in options
3321   Opts.OpenMPCUDAForceFullRuntime =
3322       Opts.OpenMPIsDevice && (T.isNVPTX() || T.isAMDGCN()) &&
3323       Args.hasArg(options::OPT_fopenmp_cuda_force_full_runtime);
3324 
3325   // Record whether the __DEPRECATED define was requested.
3326   Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro,
3327                                  OPT_fno_deprecated_macro,
3328                                  Opts.Deprecated);
3329 
3330   // FIXME: Eliminate this dependency.
3331   unsigned Opt = getOptimizationLevel(Args, IK, Diags),
3332        OptSize = getOptimizationLevelSize(Args);
3333   Opts.Optimize = Opt != 0;
3334   Opts.OptimizeSize = OptSize != 0;
3335 
3336   // This is the __NO_INLINE__ define, which just depends on things like the
3337   // optimization level and -fno-inline, not actually whether the backend has
3338   // inlining enabled.
3339   Opts.NoInlineDefine = !Opts.Optimize;
3340   if (Arg *InlineArg = Args.getLastArg(
3341           options::OPT_finline_functions, options::OPT_finline_hint_functions,
3342           options::OPT_fno_inline_functions, options::OPT_fno_inline))
3343     if (InlineArg->getOption().matches(options::OPT_fno_inline))
3344       Opts.NoInlineDefine = true;
3345 
3346   if (Arg *A = Args.getLastArg(OPT_ffp_contract)) {
3347     StringRef Val = A->getValue();
3348     if (Val == "fast")
3349       Opts.setDefaultFPContractMode(LangOptions::FPM_Fast);
3350     else if (Val == "on")
3351       Opts.setDefaultFPContractMode(LangOptions::FPM_On);
3352     else if (Val == "off")
3353       Opts.setDefaultFPContractMode(LangOptions::FPM_Off);
3354     else
3355       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
3356   }
3357 
3358   auto FPRM = llvm::RoundingMode::NearestTiesToEven;
3359   if (Args.hasArg(OPT_frounding_math)) {
3360     FPRM = llvm::RoundingMode::Dynamic;
3361   }
3362   Opts.setFPRoundingMode(FPRM);
3363 
3364   if (Args.hasArg(OPT_ftrapping_math)) {
3365     Opts.setFPExceptionMode(LangOptions::FPE_Strict);
3366   }
3367 
3368   if (Args.hasArg(OPT_fno_trapping_math)) {
3369     Opts.setFPExceptionMode(LangOptions::FPE_Ignore);
3370   }
3371 
3372   LangOptions::FPExceptionModeKind FPEB = LangOptions::FPE_Ignore;
3373   if (Arg *A = Args.getLastArg(OPT_ffp_exception_behavior_EQ)) {
3374     StringRef Val = A->getValue();
3375     if (Val.equals("ignore"))
3376       FPEB = LangOptions::FPE_Ignore;
3377     else if (Val.equals("maytrap"))
3378       FPEB = LangOptions::FPE_MayTrap;
3379     else if (Val.equals("strict"))
3380       FPEB = LangOptions::FPE_Strict;
3381     else
3382       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
3383   }
3384   Opts.setFPExceptionMode(FPEB);
3385 
3386   Opts.RetainCommentsFromSystemHeaders =
3387       Args.hasArg(OPT_fretain_comments_from_system_headers);
3388 
3389   unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
3390   switch (SSP) {
3391   default:
3392     Diags.Report(diag::err_drv_invalid_value)
3393       << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
3394     break;
3395   case 0: Opts.setStackProtector(LangOptions::SSPOff); break;
3396   case 1: Opts.setStackProtector(LangOptions::SSPOn);  break;
3397   case 2: Opts.setStackProtector(LangOptions::SSPStrong); break;
3398   case 3: Opts.setStackProtector(LangOptions::SSPReq); break;
3399   }
3400 
3401   if (Arg *A = Args.getLastArg(OPT_ftrivial_auto_var_init)) {
3402     StringRef Val = A->getValue();
3403     if (Val == "uninitialized")
3404       Opts.setTrivialAutoVarInit(
3405           LangOptions::TrivialAutoVarInitKind::Uninitialized);
3406     else if (Val == "zero")
3407       Opts.setTrivialAutoVarInit(LangOptions::TrivialAutoVarInitKind::Zero);
3408     else if (Val == "pattern")
3409       Opts.setTrivialAutoVarInit(LangOptions::TrivialAutoVarInitKind::Pattern);
3410     else
3411       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Val;
3412   }
3413 
3414   if (Arg *A = Args.getLastArg(OPT_ftrivial_auto_var_init_stop_after)) {
3415     int Val = std::stoi(A->getValue());
3416     Opts.TrivialAutoVarInitStopAfter = Val;
3417   }
3418 
3419   // Parse -fsanitize= arguments.
3420   parseSanitizerKinds("-fsanitize=", Args.getAllArgValues(OPT_fsanitize_EQ),
3421                       Diags, Opts.Sanitize);
3422   // -fsanitize-address-field-padding=N has to be a LangOpt, parse it here.
3423   Opts.SanitizeAddressFieldPadding =
3424       getLastArgIntValue(Args, OPT_fsanitize_address_field_padding, 0, Diags);
3425   Opts.SanitizerBlacklistFiles = Args.getAllArgValues(OPT_fsanitize_blacklist);
3426   std::vector<std::string> systemBlacklists =
3427       Args.getAllArgValues(OPT_fsanitize_system_blacklist);
3428   Opts.SanitizerBlacklistFiles.insert(Opts.SanitizerBlacklistFiles.end(),
3429                                       systemBlacklists.begin(),
3430                                       systemBlacklists.end());
3431 
3432   // -fxray-{always,never}-instrument= filenames.
3433   Opts.XRayAlwaysInstrumentFiles =
3434       Args.getAllArgValues(OPT_fxray_always_instrument);
3435   Opts.XRayNeverInstrumentFiles =
3436       Args.getAllArgValues(OPT_fxray_never_instrument);
3437   Opts.XRayAttrListFiles = Args.getAllArgValues(OPT_fxray_attr_list);
3438 
3439   // -fforce-emit-vtables
3440   Opts.ForceEmitVTables = Args.hasArg(OPT_fforce_emit_vtables);
3441 
3442   // -fallow-editor-placeholders
3443   Opts.AllowEditorPlaceholders = Args.hasArg(OPT_fallow_editor_placeholders);
3444 
3445   Opts.RegisterStaticDestructors = !Args.hasArg(OPT_fno_cxx_static_destructors);
3446 
3447   if (Arg *A = Args.getLastArg(OPT_fclang_abi_compat_EQ)) {
3448     Opts.setClangABICompat(LangOptions::ClangABI::Latest);
3449 
3450     StringRef Ver = A->getValue();
3451     std::pair<StringRef, StringRef> VerParts = Ver.split('.');
3452     unsigned Major, Minor = 0;
3453 
3454     // Check the version number is valid: either 3.x (0 <= x <= 9) or
3455     // y or y.0 (4 <= y <= current version).
3456     if (!VerParts.first.startswith("0") &&
3457         !VerParts.first.getAsInteger(10, Major) &&
3458         3 <= Major && Major <= CLANG_VERSION_MAJOR &&
3459         (Major == 3 ? VerParts.second.size() == 1 &&
3460                       !VerParts.second.getAsInteger(10, Minor)
3461                     : VerParts.first.size() == Ver.size() ||
3462                       VerParts.second == "0")) {
3463       // Got a valid version number.
3464       if (Major == 3 && Minor <= 8)
3465         Opts.setClangABICompat(LangOptions::ClangABI::Ver3_8);
3466       else if (Major <= 4)
3467         Opts.setClangABICompat(LangOptions::ClangABI::Ver4);
3468       else if (Major <= 6)
3469         Opts.setClangABICompat(LangOptions::ClangABI::Ver6);
3470       else if (Major <= 7)
3471         Opts.setClangABICompat(LangOptions::ClangABI::Ver7);
3472       else if (Major <= 9)
3473         Opts.setClangABICompat(LangOptions::ClangABI::Ver9);
3474       else if (Major <= 11)
3475         Opts.setClangABICompat(LangOptions::ClangABI::Ver11);
3476     } else if (Ver != "latest") {
3477       Diags.Report(diag::err_drv_invalid_value)
3478           << A->getAsString(Args) << A->getValue();
3479     }
3480   }
3481 
3482   Opts.CompleteMemberPointers = Args.hasArg(OPT_fcomplete_member_pointers);
3483   Opts.BuildingPCHWithObjectFile = Args.hasArg(OPT_building_pch_with_obj);
3484   Opts.PCHInstantiateTemplates = Args.hasArg(OPT_fpch_instantiate_templates);
3485 
3486   Opts.MatrixTypes = Args.hasArg(OPT_fenable_matrix);
3487 
3488   Opts.MaxTokens = getLastArgIntValue(Args, OPT_fmax_tokens_EQ, 0, Diags);
3489 
3490   if (Arg *A = Args.getLastArg(OPT_msign_return_address_EQ)) {
3491     StringRef SignScope = A->getValue();
3492 
3493     if (SignScope.equals_lower("none"))
3494       Opts.setSignReturnAddressScope(
3495           LangOptions::SignReturnAddressScopeKind::None);
3496     else if (SignScope.equals_lower("all"))
3497       Opts.setSignReturnAddressScope(
3498           LangOptions::SignReturnAddressScopeKind::All);
3499     else if (SignScope.equals_lower("non-leaf"))
3500       Opts.setSignReturnAddressScope(
3501           LangOptions::SignReturnAddressScopeKind::NonLeaf);
3502     else
3503       Diags.Report(diag::err_drv_invalid_value)
3504           << A->getAsString(Args) << SignScope;
3505 
3506     if (Arg *A = Args.getLastArg(OPT_msign_return_address_key_EQ)) {
3507       StringRef SignKey = A->getValue();
3508       if (!SignScope.empty() && !SignKey.empty()) {
3509         if (SignKey.equals_lower("a_key"))
3510           Opts.setSignReturnAddressKey(
3511               LangOptions::SignReturnAddressKeyKind::AKey);
3512         else if (SignKey.equals_lower("b_key"))
3513           Opts.setSignReturnAddressKey(
3514               LangOptions::SignReturnAddressKeyKind::BKey);
3515         else
3516           Diags.Report(diag::err_drv_invalid_value)
3517               << A->getAsString(Args) << SignKey;
3518       }
3519     }
3520   }
3521 
3522   Opts.BranchTargetEnforcement = Args.hasArg(OPT_mbranch_target_enforce);
3523   Opts.SpeculativeLoadHardening = Args.hasArg(OPT_mspeculative_load_hardening);
3524 
3525   Opts.CompatibilityQualifiedIdBlockParamTypeChecking =
3526       Args.hasArg(OPT_fcompatibility_qualified_id_block_param_type_checking);
3527 
3528   Opts.RelativeCXXABIVTables =
3529       Args.hasFlag(OPT_fexperimental_relative_cxx_abi_vtables,
3530                    OPT_fno_experimental_relative_cxx_abi_vtables,
3531                    /*default=*/false);
3532 }
3533 
3534 static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) {
3535   switch (Action) {
3536   case frontend::ASTDeclList:
3537   case frontend::ASTDump:
3538   case frontend::ASTPrint:
3539   case frontend::ASTView:
3540   case frontend::EmitAssembly:
3541   case frontend::EmitBC:
3542   case frontend::EmitHTML:
3543   case frontend::EmitLLVM:
3544   case frontend::EmitLLVMOnly:
3545   case frontend::EmitCodeGenOnly:
3546   case frontend::EmitObj:
3547   case frontend::FixIt:
3548   case frontend::GenerateModule:
3549   case frontend::GenerateModuleInterface:
3550   case frontend::GenerateHeaderModule:
3551   case frontend::GeneratePCH:
3552   case frontend::GenerateInterfaceStubs:
3553   case frontend::ParseSyntaxOnly:
3554   case frontend::ModuleFileInfo:
3555   case frontend::VerifyPCH:
3556   case frontend::PluginAction:
3557   case frontend::RewriteObjC:
3558   case frontend::RewriteTest:
3559   case frontend::RunAnalysis:
3560   case frontend::TemplightDump:
3561   case frontend::MigrateSource:
3562     return false;
3563 
3564   case frontend::DumpCompilerOptions:
3565   case frontend::DumpRawTokens:
3566   case frontend::DumpTokens:
3567   case frontend::InitOnly:
3568   case frontend::PrintPreamble:
3569   case frontend::PrintPreprocessedInput:
3570   case frontend::RewriteMacros:
3571   case frontend::RunPreprocessorOnly:
3572   case frontend::PrintDependencyDirectivesSourceMinimizerOutput:
3573     return true;
3574   }
3575   llvm_unreachable("invalid frontend action");
3576 }
3577 
3578 static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
3579                                   DiagnosticsEngine &Diags,
3580                                   frontend::ActionKind Action) {
3581   Opts.ImplicitPCHInclude = std::string(Args.getLastArgValue(OPT_include_pch));
3582   Opts.PCHWithHdrStop = Args.hasArg(OPT_pch_through_hdrstop_create) ||
3583                         Args.hasArg(OPT_pch_through_hdrstop_use);
3584   Opts.PCHWithHdrStopCreate = Args.hasArg(OPT_pch_through_hdrstop_create);
3585   Opts.PCHThroughHeader =
3586       std::string(Args.getLastArgValue(OPT_pch_through_header_EQ));
3587   Opts.UsePredefines = !Args.hasArg(OPT_undef);
3588   Opts.DetailedRecord = Args.hasArg(OPT_detailed_preprocessing_record);
3589   Opts.DisablePCHValidation = Args.hasArg(OPT_fno_validate_pch);
3590   Opts.AllowPCHWithCompilerErrors =
3591       Args.hasArg(OPT_fallow_pch_with_errors, OPT_fallow_pcm_with_errors);
3592 
3593   Opts.DumpDeserializedPCHDecls = Args.hasArg(OPT_dump_deserialized_pch_decls);
3594   for (const auto *A : Args.filtered(OPT_error_on_deserialized_pch_decl))
3595     Opts.DeserializedPCHDeclsToErrorOn.insert(A->getValue());
3596 
3597   for (const auto &A : Args.getAllArgValues(OPT_fmacro_prefix_map_EQ)) {
3598     auto Split = StringRef(A).split('=');
3599     Opts.MacroPrefixMap.insert(
3600         {std::string(Split.first), std::string(Split.second)});
3601   }
3602 
3603   if (const Arg *A = Args.getLastArg(OPT_preamble_bytes_EQ)) {
3604     StringRef Value(A->getValue());
3605     size_t Comma = Value.find(',');
3606     unsigned Bytes = 0;
3607     unsigned EndOfLine = 0;
3608 
3609     if (Comma == StringRef::npos ||
3610         Value.substr(0, Comma).getAsInteger(10, Bytes) ||
3611         Value.substr(Comma + 1).getAsInteger(10, EndOfLine))
3612       Diags.Report(diag::err_drv_preamble_format);
3613     else {
3614       Opts.PrecompiledPreambleBytes.first = Bytes;
3615       Opts.PrecompiledPreambleBytes.second = (EndOfLine != 0);
3616     }
3617   }
3618 
3619   // Add the __CET__ macro if a CFProtection option is set.
3620   if (const Arg *A = Args.getLastArg(OPT_fcf_protection_EQ)) {
3621     StringRef Name = A->getValue();
3622     if (Name == "branch")
3623       Opts.addMacroDef("__CET__=1");
3624     else if (Name == "return")
3625       Opts.addMacroDef("__CET__=2");
3626     else if (Name == "full")
3627       Opts.addMacroDef("__CET__=3");
3628   }
3629 
3630   // Add macros from the command line.
3631   for (const auto *A : Args.filtered(OPT_D, OPT_U)) {
3632     if (A->getOption().matches(OPT_D))
3633       Opts.addMacroDef(A->getValue());
3634     else
3635       Opts.addMacroUndef(A->getValue());
3636   }
3637 
3638   Opts.MacroIncludes = Args.getAllArgValues(OPT_imacros);
3639 
3640   // Add the ordered list of -includes.
3641   for (const auto *A : Args.filtered(OPT_include))
3642     Opts.Includes.emplace_back(A->getValue());
3643 
3644   for (const auto *A : Args.filtered(OPT_chain_include))
3645     Opts.ChainedIncludes.emplace_back(A->getValue());
3646 
3647   for (const auto *A : Args.filtered(OPT_remap_file)) {
3648     std::pair<StringRef, StringRef> Split = StringRef(A->getValue()).split(';');
3649 
3650     if (Split.second.empty()) {
3651       Diags.Report(diag::err_drv_invalid_remap_file) << A->getAsString(Args);
3652       continue;
3653     }
3654 
3655     Opts.addRemappedFile(Split.first, Split.second);
3656   }
3657 
3658   if (Arg *A = Args.getLastArg(OPT_fobjc_arc_cxxlib_EQ)) {
3659     StringRef Name = A->getValue();
3660     unsigned Library = llvm::StringSwitch<unsigned>(Name)
3661       .Case("libc++", ARCXX_libcxx)
3662       .Case("libstdc++", ARCXX_libstdcxx)
3663       .Case("none", ARCXX_nolib)
3664       .Default(~0U);
3665     if (Library == ~0U)
3666       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
3667     else
3668       Opts.ObjCXXARCStandardLibrary = (ObjCXXARCStandardLibraryKind)Library;
3669   }
3670 
3671   // Always avoid lexing editor placeholders when we're just running the
3672   // preprocessor as we never want to emit the
3673   // "editor placeholder in source file" error in PP only mode.
3674   if (isStrictlyPreprocessorAction(Action))
3675     Opts.LexEditorPlaceholders = false;
3676 
3677   Opts.SetUpStaticAnalyzer = Args.hasArg(OPT_setup_static_analyzer);
3678   Opts.DisablePragmaDebugCrash = Args.hasArg(OPT_disable_pragma_debug_crash);
3679 }
3680 
3681 static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts,
3682                                         ArgList &Args,
3683                                         frontend::ActionKind Action) {
3684   if (isStrictlyPreprocessorAction(Action))
3685     Opts.ShowCPP = !Args.hasArg(OPT_dM);
3686   else
3687     Opts.ShowCPP = 0;
3688 
3689   Opts.ShowComments = Args.hasArg(OPT_C);
3690   Opts.ShowLineMarkers = !Args.hasArg(OPT_P);
3691   Opts.ShowMacroComments = Args.hasArg(OPT_CC);
3692   Opts.ShowMacros = Args.hasArg(OPT_dM) || Args.hasArg(OPT_dD);
3693   Opts.ShowIncludeDirectives = Args.hasArg(OPT_dI);
3694   Opts.RewriteIncludes = Args.hasArg(OPT_frewrite_includes);
3695   Opts.RewriteImports = Args.hasArg(OPT_frewrite_imports);
3696   Opts.UseLineDirectives = Args.hasArg(OPT_fuse_line_directives);
3697 }
3698 
3699 static void ParseTargetArgs(TargetOptions &Opts, ArgList &Args,
3700                             DiagnosticsEngine &Diags) {
3701   Opts.CodeModel = std::string(Args.getLastArgValue(OPT_mcmodel_EQ, "default"));
3702   Opts.ABI = std::string(Args.getLastArgValue(OPT_target_abi));
3703   if (Arg *A = Args.getLastArg(OPT_meabi)) {
3704     StringRef Value = A->getValue();
3705     llvm::EABI EABIVersion = llvm::StringSwitch<llvm::EABI>(Value)
3706                                  .Case("default", llvm::EABI::Default)
3707                                  .Case("4", llvm::EABI::EABI4)
3708                                  .Case("5", llvm::EABI::EABI5)
3709                                  .Case("gnu", llvm::EABI::GNU)
3710                                  .Default(llvm::EABI::Unknown);
3711     if (EABIVersion == llvm::EABI::Unknown)
3712       Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args)
3713                                                 << Value;
3714     else
3715       Opts.EABIVersion = EABIVersion;
3716   }
3717   Opts.CPU = std::string(Args.getLastArgValue(OPT_target_cpu));
3718   Opts.TuneCPU = std::string(Args.getLastArgValue(OPT_tune_cpu));
3719   Opts.FPMath = std::string(Args.getLastArgValue(OPT_mfpmath));
3720   Opts.FeaturesAsWritten = Args.getAllArgValues(OPT_target_feature);
3721   Opts.LinkerVersion =
3722       std::string(Args.getLastArgValue(OPT_target_linker_version));
3723   Opts.OpenCLExtensionsAsWritten = Args.getAllArgValues(OPT_cl_ext_EQ);
3724   Opts.ForceEnableInt128 = Args.hasArg(OPT_fforce_enable_int128);
3725   Opts.NVPTXUseShortPointers = Args.hasFlag(
3726       options::OPT_fcuda_short_ptr, options::OPT_fno_cuda_short_ptr, false);
3727   Opts.AllowAMDGPUUnsafeFPAtomics =
3728       Args.hasFlag(options::OPT_munsafe_fp_atomics,
3729                    options::OPT_mno_unsafe_fp_atomics, false);
3730   if (Arg *A = Args.getLastArg(options::OPT_target_sdk_version_EQ)) {
3731     llvm::VersionTuple Version;
3732     if (Version.tryParse(A->getValue()))
3733       Diags.Report(diag::err_drv_invalid_value)
3734           << A->getAsString(Args) << A->getValue();
3735     else
3736       Opts.SDKVersion = Version;
3737   }
3738 }
3739 
3740 bool CompilerInvocation::parseSimpleArgs(const ArgList &Args,
3741                                          DiagnosticsEngine &Diags) {
3742 #define OPTION_WITH_MARSHALLING(                                               \
3743     PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM,        \
3744     HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE,  \
3745     NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX)                  \
3746   {                                                                            \
3747     this->KEYPATH = MERGER(this->KEYPATH, DEFAULT_VALUE);                      \
3748     if (auto MaybeValue = NORMALIZER(OPT_##ID, TABLE_INDEX, Args, Diags))      \
3749       this->KEYPATH = MERGER(                                                  \
3750           this->KEYPATH, static_cast<decltype(this->KEYPATH)>(*MaybeValue));   \
3751   }
3752 
3753 #define OPTION_WITH_MARSHALLING_BOOLEAN(                                       \
3754     PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM,        \
3755     HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE,  \
3756     NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX, NEG_ID,          \
3757     NEG_SPELLING)                                                              \
3758   {                                                                            \
3759     if (auto MaybeValue =                                                      \
3760             NORMALIZER(OPT_##ID, OPT_##NEG_ID, TABLE_INDEX, Args, Diags))      \
3761       this->KEYPATH = MERGER(                                                  \
3762           this->KEYPATH, static_cast<decltype(this->KEYPATH)>(*MaybeValue));   \
3763     else                                                                       \
3764       this->KEYPATH = MERGER(this->KEYPATH, DEFAULT_VALUE);                    \
3765   }
3766 
3767 #include "clang/Driver/Options.inc"
3768 #undef OPTION_WITH_MARSHALLING_BOOLEAN
3769 #undef OPTION_WITH_MARSHALLING
3770   return true;
3771 }
3772 
3773 bool CompilerInvocation::CreateFromArgs(CompilerInvocation &Res,
3774                                         ArrayRef<const char *> CommandLineArgs,
3775                                         DiagnosticsEngine &Diags,
3776                                         const char *Argv0) {
3777   bool Success = true;
3778 
3779   // Parse the arguments.
3780   const OptTable &Opts = getDriverOptTable();
3781   const unsigned IncludedFlagsBitmask = options::CC1Option;
3782   unsigned MissingArgIndex, MissingArgCount;
3783   InputArgList Args = Opts.ParseArgs(CommandLineArgs, MissingArgIndex,
3784                                      MissingArgCount, IncludedFlagsBitmask);
3785   LangOptions &LangOpts = *Res.getLangOpts();
3786 
3787   // Check for missing argument error.
3788   if (MissingArgCount) {
3789     Diags.Report(diag::err_drv_missing_argument)
3790         << Args.getArgString(MissingArgIndex) << MissingArgCount;
3791     Success = false;
3792   }
3793 
3794   // Issue errors on unknown arguments.
3795   for (const auto *A : Args.filtered(OPT_UNKNOWN)) {
3796     auto ArgString = A->getAsString(Args);
3797     std::string Nearest;
3798     if (Opts.findNearest(ArgString, Nearest, IncludedFlagsBitmask) > 1)
3799       Diags.Report(diag::err_drv_unknown_argument) << ArgString;
3800     else
3801       Diags.Report(diag::err_drv_unknown_argument_with_suggestion)
3802           << ArgString << Nearest;
3803     Success = false;
3804   }
3805 
3806   Success &= Res.parseSimpleArgs(Args, Diags);
3807   FixupInvocation(Res);
3808 
3809   Success &= ParseAnalyzerArgs(*Res.getAnalyzerOpts(), Args, Diags);
3810   ParseDependencyOutputArgs(Res.getDependencyOutputOpts(), Args);
3811   if (!Res.getDependencyOutputOpts().OutputFile.empty() &&
3812       Res.getDependencyOutputOpts().Targets.empty()) {
3813     Diags.Report(diag::err_fe_dependency_file_requires_MT);
3814     Success = false;
3815   }
3816   Success &= ParseDiagnosticArgs(Res.getDiagnosticOpts(), Args, &Diags,
3817                                  /*DefaultDiagColor=*/false);
3818   ParseCommentArgs(LangOpts.CommentOpts, Args);
3819   ParseFileSystemArgs(Res.getFileSystemOpts(), Args);
3820   // FIXME: We shouldn't have to pass the DashX option around here
3821   InputKind DashX = ParseFrontendArgs(Res.getFrontendOpts(), Args, Diags,
3822                                       LangOpts.IsHeaderFile);
3823   ParseTargetArgs(Res.getTargetOpts(), Args, Diags);
3824   Success &= ParseCodeGenArgs(Res.getCodeGenOpts(), Args, DashX, Diags,
3825                               Res.getTargetOpts(), Res.getFrontendOpts());
3826   ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args,
3827                         Res.getFileSystemOpts().WorkingDir);
3828   llvm::Triple T(Res.getTargetOpts().Triple);
3829   if (DashX.getFormat() == InputKind::Precompiled ||
3830       DashX.getLanguage() == Language::LLVM_IR) {
3831     // ObjCAAutoRefCount and Sanitize LangOpts are used to setup the
3832     // PassManager in BackendUtil.cpp. They need to be initializd no matter
3833     // what the input type is.
3834     if (Args.hasArg(OPT_fobjc_arc))
3835       LangOpts.ObjCAutoRefCount = 1;
3836     // PIClevel and PIELevel are needed during code generation and this should be
3837     // set regardless of the input type.
3838     LangOpts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
3839     LangOpts.PIE = Args.hasArg(OPT_pic_is_pie);
3840     parseSanitizerKinds("-fsanitize=", Args.getAllArgValues(OPT_fsanitize_EQ),
3841                         Diags, LangOpts.Sanitize);
3842   } else {
3843     // Other LangOpts are only initialized when the input is not AST or LLVM IR.
3844     // FIXME: Should we really be calling this for an Language::Asm input?
3845     ParseLangArgs(LangOpts, Args, DashX, Res.getTargetOpts(),
3846                   Res.getPreprocessorOpts(), Diags);
3847     if (Res.getFrontendOpts().ProgramAction == frontend::RewriteObjC)
3848       LangOpts.ObjCExceptions = 1;
3849     if (T.isOSDarwin() && DashX.isPreprocessed()) {
3850       // Supress the darwin-specific 'stdlibcxx-not-found' diagnostic for
3851       // preprocessed input as we don't expect it to be used with -std=libc++
3852       // anyway.
3853       Res.getDiagnosticOpts().Warnings.push_back("no-stdlibcxx-not-found");
3854     }
3855   }
3856 
3857   LangOpts.FunctionAlignment =
3858       getLastArgIntValue(Args, OPT_function_alignment, 0, Diags);
3859 
3860   if (LangOpts.CUDA) {
3861     // During CUDA device-side compilation, the aux triple is the
3862     // triple used for host compilation.
3863     if (LangOpts.CUDAIsDevice)
3864       Res.getTargetOpts().HostTriple = Res.getFrontendOpts().AuxTriple;
3865   }
3866 
3867   // Set the triple of the host for OpenMP device compile.
3868   if (LangOpts.OpenMPIsDevice)
3869     Res.getTargetOpts().HostTriple = Res.getFrontendOpts().AuxTriple;
3870 
3871   // FIXME: Override value name discarding when asan or msan is used because the
3872   // backend passes depend on the name of the alloca in order to print out
3873   // names.
3874   Res.getCodeGenOpts().DiscardValueNames &=
3875       !LangOpts.Sanitize.has(SanitizerKind::Address) &&
3876       !LangOpts.Sanitize.has(SanitizerKind::KernelAddress) &&
3877       !LangOpts.Sanitize.has(SanitizerKind::Memory) &&
3878       !LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
3879 
3880   ParsePreprocessorArgs(Res.getPreprocessorOpts(), Args, Diags,
3881                         Res.getFrontendOpts().ProgramAction);
3882   ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), Args,
3883                               Res.getFrontendOpts().ProgramAction);
3884 
3885   // Turn on -Wspir-compat for SPIR target.
3886   if (T.isSPIR())
3887     Res.getDiagnosticOpts().Warnings.push_back("spir-compat");
3888 
3889   // If sanitizer is enabled, disable OPT_ffine_grained_bitfield_accesses.
3890   if (Res.getCodeGenOpts().FineGrainedBitfieldAccesses &&
3891       !Res.getLangOpts()->Sanitize.empty()) {
3892     Res.getCodeGenOpts().FineGrainedBitfieldAccesses = false;
3893     Diags.Report(diag::warn_drv_fine_grained_bitfield_accesses_ignored);
3894   }
3895 
3896   // Store the command-line for using in the CodeView backend.
3897   Res.getCodeGenOpts().Argv0 = Argv0;
3898   Res.getCodeGenOpts().CommandLineArgs = CommandLineArgs;
3899 
3900   return Success;
3901 }
3902 
3903 std::string CompilerInvocation::getModuleHash() const {
3904   // Note: For QoI reasons, the things we use as a hash here should all be
3905   // dumped via the -module-info flag.
3906   using llvm::hash_code;
3907   using llvm::hash_value;
3908   using llvm::hash_combine;
3909   using llvm::hash_combine_range;
3910 
3911   // Start the signature with the compiler version.
3912   // FIXME: We'd rather use something more cryptographically sound than
3913   // CityHash, but this will do for now.
3914   hash_code code = hash_value(getClangFullRepositoryVersion());
3915 
3916   // Also include the serialization version, in case LLVM_APPEND_VC_REV is off
3917   // and getClangFullRepositoryVersion() doesn't include git revision.
3918   code = hash_combine(code, serialization::VERSION_MAJOR,
3919                       serialization::VERSION_MINOR);
3920 
3921   // Extend the signature with the language options
3922 #define LANGOPT(Name, Bits, Default, Description) \
3923    code = hash_combine(code, LangOpts->Name);
3924 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \
3925   code = hash_combine(code, static_cast<unsigned>(LangOpts->get##Name()));
3926 #define BENIGN_LANGOPT(Name, Bits, Default, Description)
3927 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description)
3928 #include "clang/Basic/LangOptions.def"
3929 
3930   for (StringRef Feature : LangOpts->ModuleFeatures)
3931     code = hash_combine(code, Feature);
3932 
3933   code = hash_combine(code, LangOpts->ObjCRuntime);
3934   const auto &BCN = LangOpts->CommentOpts.BlockCommandNames;
3935   code = hash_combine(code, hash_combine_range(BCN.begin(), BCN.end()));
3936 
3937   // Extend the signature with the target options.
3938   code = hash_combine(code, TargetOpts->Triple, TargetOpts->CPU,
3939                       TargetOpts->TuneCPU, TargetOpts->ABI);
3940   for (const auto &FeatureAsWritten : TargetOpts->FeaturesAsWritten)
3941     code = hash_combine(code, FeatureAsWritten);
3942 
3943   // Extend the signature with preprocessor options.
3944   const PreprocessorOptions &ppOpts = getPreprocessorOpts();
3945   const HeaderSearchOptions &hsOpts = getHeaderSearchOpts();
3946   code = hash_combine(code, ppOpts.UsePredefines, ppOpts.DetailedRecord);
3947 
3948   for (const auto &I : getPreprocessorOpts().Macros) {
3949     // If we're supposed to ignore this macro for the purposes of modules,
3950     // don't put it into the hash.
3951     if (!hsOpts.ModulesIgnoreMacros.empty()) {
3952       // Check whether we're ignoring this macro.
3953       StringRef MacroDef = I.first;
3954       if (hsOpts.ModulesIgnoreMacros.count(
3955               llvm::CachedHashString(MacroDef.split('=').first)))
3956         continue;
3957     }
3958 
3959     code = hash_combine(code, I.first, I.second);
3960   }
3961 
3962   // Extend the signature with the sysroot and other header search options.
3963   code = hash_combine(code, hsOpts.Sysroot,
3964                       hsOpts.ModuleFormat,
3965                       hsOpts.UseDebugInfo,
3966                       hsOpts.UseBuiltinIncludes,
3967                       hsOpts.UseStandardSystemIncludes,
3968                       hsOpts.UseStandardCXXIncludes,
3969                       hsOpts.UseLibcxx,
3970                       hsOpts.ModulesValidateDiagnosticOptions);
3971   code = hash_combine(code, hsOpts.ResourceDir);
3972 
3973   if (hsOpts.ModulesStrictContextHash) {
3974     hash_code SHPC = hash_combine_range(hsOpts.SystemHeaderPrefixes.begin(),
3975                                         hsOpts.SystemHeaderPrefixes.end());
3976     hash_code UEC = hash_combine_range(hsOpts.UserEntries.begin(),
3977                                        hsOpts.UserEntries.end());
3978     code = hash_combine(code, hsOpts.SystemHeaderPrefixes.size(), SHPC,
3979                         hsOpts.UserEntries.size(), UEC);
3980 
3981     const DiagnosticOptions &diagOpts = getDiagnosticOpts();
3982     #define DIAGOPT(Name, Bits, Default) \
3983       code = hash_combine(code, diagOpts.Name);
3984     #define ENUM_DIAGOPT(Name, Type, Bits, Default) \
3985       code = hash_combine(code, diagOpts.get##Name());
3986     #include "clang/Basic/DiagnosticOptions.def"
3987     #undef DIAGOPT
3988     #undef ENUM_DIAGOPT
3989   }
3990 
3991   // Extend the signature with the user build path.
3992   code = hash_combine(code, hsOpts.ModuleUserBuildPath);
3993 
3994   // Extend the signature with the module file extensions.
3995   const FrontendOptions &frontendOpts = getFrontendOpts();
3996   for (const auto &ext : frontendOpts.ModuleFileExtensions) {
3997     code = ext->hashExtension(code);
3998   }
3999 
4000   // When compiling with -gmodules, also hash -fdebug-prefix-map as it
4001   // affects the debug info in the PCM.
4002   if (getCodeGenOpts().DebugTypeExtRefs)
4003     for (const auto &KeyValue : getCodeGenOpts().DebugPrefixMap)
4004       code = hash_combine(code, KeyValue.first, KeyValue.second);
4005 
4006   // Extend the signature with the enabled sanitizers, if at least one is
4007   // enabled. Sanitizers which cannot affect AST generation aren't hashed.
4008   SanitizerSet SanHash = LangOpts->Sanitize;
4009   SanHash.clear(getPPTransparentSanitizers());
4010   if (!SanHash.empty())
4011     code = hash_combine(code, SanHash.Mask);
4012 
4013   return llvm::APInt(64, code).toString(36, /*Signed=*/false);
4014 }
4015 
4016 void CompilerInvocation::generateCC1CommandLine(
4017     SmallVectorImpl<const char *> &Args, StringAllocator SA) const {
4018 #define OPTION_WITH_MARSHALLING(                                               \
4019     PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM,        \
4020     HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE,  \
4021     NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX)                  \
4022   if (((FLAGS) & options::CC1Option) &&                                        \
4023       (ALWAYS_EMIT || EXTRACTOR(this->KEYPATH) != (DEFAULT_VALUE))) {          \
4024     DENORMALIZER(Args, SPELLING, SA, TABLE_INDEX, EXTRACTOR(this->KEYPATH));   \
4025   }
4026 
4027 #define OPTION_WITH_MARSHALLING_BOOLEAN(                                       \
4028     PREFIX_TYPE, NAME, ID, KIND, GROUP, ALIAS, ALIASARGS, FLAGS, PARAM,        \
4029     HELPTEXT, METAVAR, VALUES, SPELLING, ALWAYS_EMIT, KEYPATH, DEFAULT_VALUE,  \
4030     NORMALIZER, DENORMALIZER, MERGER, EXTRACTOR, TABLE_INDEX, NEG_ID,          \
4031     NEG_SPELLING)                                                              \
4032   if (((FLAGS)&options::CC1Option) &&                                          \
4033       (ALWAYS_EMIT || EXTRACTOR(this->KEYPATH) != DEFAULT_VALUE)) {            \
4034     DENORMALIZER(Args, SPELLING, NEG_SPELLING, SA, TABLE_INDEX,                \
4035                  EXTRACTOR(this->KEYPATH));                                    \
4036   }
4037 
4038 #include "clang/Driver/Options.inc"
4039 #undef OPTION_WITH_MARSHALLING_BOOLEAN
4040 #undef OPTION_WITH_MARSHALLING
4041 }
4042 
4043 IntrusiveRefCntPtr<llvm::vfs::FileSystem>
4044 clang::createVFSFromCompilerInvocation(const CompilerInvocation &CI,
4045                                        DiagnosticsEngine &Diags) {
4046   return createVFSFromCompilerInvocation(CI, Diags,
4047                                          llvm::vfs::getRealFileSystem());
4048 }
4049 
4050 IntrusiveRefCntPtr<llvm::vfs::FileSystem>
4051 clang::createVFSFromCompilerInvocation(
4052     const CompilerInvocation &CI, DiagnosticsEngine &Diags,
4053     IntrusiveRefCntPtr<llvm::vfs::FileSystem> BaseFS) {
4054   if (CI.getHeaderSearchOpts().VFSOverlayFiles.empty())
4055     return BaseFS;
4056 
4057   IntrusiveRefCntPtr<llvm::vfs::FileSystem> Result = BaseFS;
4058   // earlier vfs files are on the bottom
4059   for (const auto &File : CI.getHeaderSearchOpts().VFSOverlayFiles) {
4060     llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer =
4061         Result->getBufferForFile(File);
4062     if (!Buffer) {
4063       Diags.Report(diag::err_missing_vfs_overlay_file) << File;
4064       continue;
4065     }
4066 
4067     IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS = llvm::vfs::getVFSFromYAML(
4068         std::move(Buffer.get()), /*DiagHandler*/ nullptr, File,
4069         /*DiagContext*/ nullptr, Result);
4070     if (!FS) {
4071       Diags.Report(diag::err_invalid_vfs_overlay) << File;
4072       continue;
4073     }
4074 
4075     Result = FS;
4076   }
4077   return Result;
4078 }
4079